@Fsharp_chat

Страница 502 из 772
Fill
08.03.2018
10:08:49
чат это конечно круто. Но я могу зашедулить митинг с Доном

Evgeniy
08.03.2018
10:13:39
Хех.

Google
Artemy
08.03.2018
10:24:10
Ну, и милых дам поздравляем с праздником. :)
А остальных, не милых, не поздравляем

Alina
08.03.2018
10:27:58
Спасибо!

Evgeniy
08.03.2018
10:28:04
Andreevlex
08.03.2018
10:36:02
@gsomix Привет!

Roman
08.03.2018
10:36:51
Завтра в 5 в ресторане брюссель столик на имя Дона Сайма, Москва

Кстати, он должен пиво @gsomix

Evgeniy
08.03.2018
10:46:45
Блин, не читайте до обеда /r/fsharp.

Там какой-то псих грозится написать куда-то в MSFT, чтобы VF# PM уволили. :)

Vlad
08.03.2018
11:04:20
Блин, не читайте до обеда /r/fsharp.
Там странный сабреддит

Andrey
08.03.2018
11:36:16
Roman
08.03.2018
11:37:26
А что там?
Там какой-то псих грозится написать куда-то в MSFT, чтобы VF# PM уволили. :)

Evgeniy
08.03.2018
11:38:21
А что там?
Я предупредил. https://www.reddit.com/r/fsharp/comments/82eofe/improvements_for_f_in_visual_studio_2017_release/

Google
Evgeniy
08.03.2018
11:38:37
Andrey
08.03.2018
11:38:57
Ага.
Эм... Много курили перед тем как это придумать?

Andrey
08.03.2018
11:39:48
Об этой концепции. Блин. Ладно

Evgeniy
08.03.2018
11:40:21
Об этой концепции. Блин. Ладно
Ну, Visual C++, Visual F#. Стандартное именование тулинга для языков в Visual Studio.

Andrey
08.03.2018
11:40:49
А, ок. Значит я не так воспринимал это слово.

У меня перед глазами возник билдер для формочек.

Friedrich
08.03.2018
12:00:37
Под этим брендом у нас по факту компилятор + интеграция со студией + FSharp.Compiler.Service, который используется для разработки некоторых других вариантов тулинга.

Roman
08.03.2018
12:17:25
Evgeniy
08.03.2018
15:41:32
https://www.contino.io/insights/comparing-aws-lambda-runtime-performance-across-go-net-core-2-0-node-js-java-and-python

Vladimir
08.03.2018
15:43:42
Какой самый простой способ к IEnumerable<T> добавить элемент T и получить опять IEnumerable<T>?

Vladimir
08.03.2018
15:45:29
seq.Concat я и видел, как-то вариант не очень)

Friedrich
08.03.2018
15:45:35
Да, не очень.

Friedrich
08.03.2018
15:46:43
seq { yield! s; yield t }

Типа такого чтоль?

Fill
08.03.2018
15:47:17
но так ведь нельзя добавлять много элементов, разве нет?

не будет stack overflow?

Google
Friedrich
08.03.2018
15:47:40
Гм, хороший вопрос.

Vladimir
08.03.2018
15:48:10
seq { yield! s; yield t }
выглядит круто)

Fill
08.03.2018
15:48:32
я почти уверен, что будет stack owerflow

если много добавить

Vladimir
08.03.2018
15:51:22
в моем случае много не будет

yield?
спасибо)

Aleksander
08.03.2018
16:48:55
А откуда там быть stack owerflow? Генераторы разве на рекурсии работают? https://sharplab.io/#v2:DYLgZgzgNAJiDUAfYBTALgAglgjBleAvFigI4YDeGAngJYrAwCEuA3DfY/ngL4ZA - вот тут похоже что, как и в C#, для yield создается класс с конечным автоматом.

Evgeniy
08.03.2018
17:05:41
https://twitter.com/atlerudshaug/status/971472604610605057?s=19

Roman
08.03.2018
17:49:54
В каких?

Evgeniy
08.03.2018
18:27:43
В каких?
Сравни. let rec nat i = seq { yield i; yield! nat (i+1) } let rec natF i = seq { if i >= 0 then yield! natF (i-1); yield i }

Aleksander
08.03.2018
18:36:20
Сравни. let rec nat i = seq { yield i; yield! nat (i+1) } let rec natF i = seq { if i >= 0 then yield! natF (i-1); yield i }
Если явно указана рекурсия, то возможность SO по крайней мере ожидаема:) Но меня смутило бы, если бы я мог получить SO при использовании генераторов без rec.

Aleksander
08.03.2018
18:42:55
Кстати я сейчас позапускал - SO нет :) Оптимизация хвостовой рекурсии сработала, похоже.

Aleksander
08.03.2018
18:44:11
Как запускал?
let rec nat i = seq { yield i; yield!nat(i + 1) } nat 1 |> Seq.length |> Dump

Evgeniy
08.03.2018
18:44:17
natF должен падать, потому что там никакой хвостовой рекурсии нет.

Aleksander
08.03.2018
18:44:19
просто бесконечно крутится

Evgeniy
08.03.2018
18:44:36
просто бесконечно крутится
Так nat и не падает. :)

Ну, очевидно, зависит от порядка вставки элемента в последовательность.

Google
Evgeniy
08.03.2018
18:46:04
Просто господин @fvnever написал в примере вставку в конец, а я гиперболизировал ее в natF.

Aleksander
08.03.2018
18:47:18
Да, natF упала, я количество итераций первоначально задал слишком маленьким)

А почему не let rec natF i = seq { yield! natF(i+1); yield i } ?

В качестве показательного примера

Evgeniy
08.03.2018
18:48:12
А почему не let rec natF i = seq { yield! natF(i+1); yield i } ?
Ну, эту штуку же нельзя вычислить.

P
08.03.2018
18:48:26
+

Aleksander
08.03.2018
18:52:21
Ну, эту штуку же нельзя вычислить.
Понятно. Переписал немного, теперь для меня стало все наглядно. Спасибо :) let iters = 100000 let rec nat i = seq { yield i; yield! nat(i + 1) } let rec natF i = seq { yield! natF(i + 1); yield i } let test fn = fn 0 |> Seq.take iters |> Seq.length |> printf "%i" test nat test natF

Fill
08.03.2018
21:28:38
Так что в итоге? Кларифицируйте, коллеги

Evgeniy
08.03.2018
21:31:18
Так что в итоге? Кларифицируйте, коллеги
Если yield! в tail call позиции, то все хорошо.

Но хотелось бы предупреждений от компилятора. https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1011-warn-on-recursive-without-tail-call.md

Fill
08.03.2018
21:32:49
т.е. в итоге, если я создам функцию let add item seq = { yield! seq yield item } то я рискую?

а если let add item seq = { yield item yield! seq } то всё ок? или я не правильно понимаю?

Fill
08.03.2018
21:40:24
потому что компиль может с оптимизировать второй кейс, верно?

т.е. суть в том, что я не должен 'использовать' возвращаемое значение yield!

Fill
08.03.2018
21:41:55
ясно, спасибо.

Evgeniy
08.03.2018
21:42:20
@fillpackart Ты и сам можешь проверить, это на пять минут развлекуха.

Fill
08.03.2018
21:42:51
я проверял давно, всё упало к чертям. Я запомнил, что так не добавляют элементы)

Vladimir
09.03.2018
09:00:11
Всем привет) Я снова с насущными проблемами пришел)

Google
Vladimir
09.03.2018
09:01:03
я написал такой код, который пробрасывает результат http запрос let httpAction f (url: string) next (ctx : HttpContext) = task { let! stringResult = f url match stringResult with | Ok resultString -> Log.Debug("{Url} response {Response}", url, resultString) do! ctx.Response.WriteAsync(resultString) return Some ctx | Error (error: string) -> Log.Error("{Url} response error {Error}", url, error) return! ServerErrors.INTERNAL_ERROR error <| next <| ctx }

val f: : string -> Threading.Tasks.Task<Result<string,string»

Если вместо Error (error: string) -> написать Error error -> то у stringResult тип становится Result<string, obj> вместо Result<string, string>, что приводит к ошибке "Unable to cast object of type 'System.Threading.Tasks.UnwrapPromise`1[Microsoft.FSharp.Core.FSharpResult`2[System.String,System.String]]' to type 'System.Threading.Tasks.Task`1[Microsoft.FSharp.Core.FSharpResult`2[System.String,System.Object]]'."

Собственно вопрос в том - почему тип stringResult определяется по матчингу, а не по функции f

Friedrich
09.03.2018
09:05:40
А это не тот самый баг, об который народ спотыкается всю прошлую неделю?

Friedrich
09.03.2018
09:06:50
вот
Если там у аргумента функции аннотировать — не помогает?

Vladimir
09.03.2018
09:10:06
Если там у аргумента функции аннотировать — не помогает?
помогает) интересно тогда откуда интелисенс там стринг пишет)

а, наверное знает потому что я из других мест такие функции туда передаю

Friedrich
09.03.2018
09:14:07
То есть он вывел для httpAction сигнатуру со строкой?

Vladimir
09.03.2018
09:14:56
да

и в VS и в VSCode

Friedrich
09.03.2018
09:17:47
и в VS и в VSCode
Ну, компилятор-то один и тот же там :)

Evgeniy
09.03.2018
09:19:01
Как бы это быстро воспроизвести.

Vladimir
09.03.2018
09:19:46
Жираф к проекту подключить

Evgeniy
09.03.2018
09:20:02
Пожалуй, попробую.

Vladimir
09.03.2018
09:22:42
тулинг сейчас должен все неймспейсы разрулить сам)

Страница 502 из 772