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

Evgeniy
08.03.2018
10:13:39
Хех.

Pauline
08.03.2018
10:20:40

Anna
08.03.2018
10:23:18

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

Andrey
08.03.2018
11:36:16

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

Andrey
08.03.2018
11:38:01

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
Ага.
Эм... Много курили перед тем как это придумать?

Evgeniy
08.03.2018
11:39:10

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

Evgeniy
08.03.2018
11:40:21

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>?

Friedrich
08.03.2018
15:44:51

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

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

Evgeniy
08.03.2018
15:45:58

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

Fill
08.03.2018
15:48:32
я почти уверен, что будет stack owerflow
если много добавить

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

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

Pavel
08.03.2018
16:51:44

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

Evgeniy
08.03.2018
18:37:02

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

Evgeniy
08.03.2018
18:43:09

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
Ну, очевидно, зависит от порядка вставки элемента в последовательность.

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

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
Но хотелось бы предупреждений от компилятора.
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
}
то всё ок? или я не правильно понимаю?

Evgeniy
08.03.2018
21:39:40

Fill
08.03.2018
21:40:24
потому что компиль может с оптимизировать второй кейс, верно?
т.е. суть в том, что я не должен 'использовать' возвращаемое значение yield!

Evgeniy
08.03.2018
21:41:39

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
А это не тот самый баг, об который народ спотыкается всю прошлую неделю?

Evgeniy
09.03.2018
09:05:56

Vladimir
09.03.2018
09:06:19
Знает, я же написал

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

Pavel
09.03.2018
09:08:56

Evgeniy
09.03.2018
09:09:39

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

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
тулинг сейчас должен все неймспейсы разрулить сам)