@Fsharp_chat

Страница 599 из 772
Dmitry
11.06.2018
20:31:01
Привет!
Привет

Evgeniy
11.06.2018
21:13:34
Klei
11.06.2018
21:14:23
Evgeniy
11.06.2018
21:14:31
Google
Klei
11.06.2018
21:56:26
Если кому-то интересно. https://github.com/gsomix/akka-bootcamp-solutions
Начинал делать на основе C#. Но с ростом сложности пришлось подсматривать в F#. Так что там мешанина та еще. Доки надо читать отдельно. https://github.com/kleidemos/akka-bootcamp/tree/akkling WARNING Говнокод внутри.

А, еще меня чет дернуло пощупать на возможность перевода, общий вывод: за основу надо брать F# версию.

Friedrich
12.06.2018
02:14:20
Я плохо понимаю, как они доставляются через Microsoft.NET.Sdk
Кажется, вот так: https://github.com/Microsoft/visualfsharp/blob/61a165e2d41b31aae4ee1e01918afce80826ad78/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props#L96

Evgeniy
12.06.2018
06:48:45
Привет.

Mikhail
12.06.2018
09:50:50
Любая программа на Haskell — это чистая функция, которая создаёт большой IO-экшен. Она никогда сама по себе никаких побочных эффектов не делает. Она в функции main этот экшен конструирует, а дальше его выполняет рантайм (который не является чистым).
Эту модель можно перенести на дотнет рантайм. Здесь любая функция - это чистое вычисление, которое просто несёт набор ИЛ инструкций, а сайд эффекты выполняет рантайм. Так в чем отличие?

Friedrich
12.06.2018
09:52:43
Эту модель можно перенести на дотнет рантайм. Здесь любая функция - это чистое вычисление, которое просто несёт набор ИЛ инструкций, а сайд эффекты выполняет рантайм. Так в чем отличие?
Отличие в том, в какой момент функции передаются в рантайм. В чистом языке это одно чётко определённое место, а в F#, например — нет. Ну то есть ты пишешь в коде printf "abc" — и оно сразу печатается. В чистом языке у тебя нет возможности написать такое выражение, не завернув его в IO, а в F# — есть.

Я согласен, что, вероятно, можно как-то за уши притянуть такую же семантику к F#, но не уверен, что это очень уж практичная идея, и какие из такого определения могут быть конструктивные выводы.

(при этом я, заметьте, не утверждаю, что та или иная семантика чем-то «лучше» другой — они просто разные)

Friedrich
12.06.2018
09:59:14
Ну и ещё unsafePerformIO, но это хак :)

Mikhail
12.06.2018
09:59:40
А в Фшарпе в любом месте?

Friedrich
12.06.2018
09:59:49
Ну, типа да.

Google
Friedrich
12.06.2018
10:00:33
Написал printf "xxx" — и у тебя в stdout вывелась строчка. Не зашедулился какой-то там экшен, а натурально выполнился побочный эффект. Если ты не пишешь это внутри какого-нибудь хитрого computation expression.

Mikhail
12.06.2018
10:01:48
Ну, типа да.
Т.е., если обвернуть все IO функции в стандартной библиотеке во что то, то можно реализовать такую же (почти) единую точку контакта с рантаймом и в Фшарпе?

Теоретически

Friedrich
12.06.2018
10:01:57
Да, можно.

Скалисты таким увлекаются и строгают штуки типа scalaz и cats. При работе с этими либами предлагается побочные эффекты всячески заворачивать. А выше давали пример, как в F# при работе с Elmish делается то же самое.

Mikhail
12.06.2018
10:04:06
Получается, что чистая функция может принимать функцию с побочными эффектами

Если она ее не вызывает

Так ведь?

Mikhail
12.06.2018
10:05:01
Начал что то понимать, благодарю за объяснение!

Jey
12.06.2018
15:58:07
В Хаскелле контакт с рантаймом только в мейне происходит?
Исключения и зацикливания-тоже эффекты

Кстати, полезно ещё различать эффект и аффект

Iskander
12.06.2018
16:15:47
Наконец руки дошли до изучения f#, ещё с февраля думал почитать да посмотреть

Пока только начал разбираться, что есть let, но уже определенно нравится

Начал с книги The F# Book, кто-нибудь читал ?)

Evgeniy
12.06.2018
16:41:57
Привет.

Rustem
12.06.2018
16:42:03
Привет.

Evgeniy
12.06.2018
17:05:38
Начал с книги The F# Book, кто-нибудь читал ?)
Я читал только Expert F# и https://fsharpforfunandprofit.com/

Dmitry
12.06.2018
17:37:11
Начал с книги The F# Book, кто-нибудь читал ?)
"Domain Modelling Made Functional" от автора FSharpForFunAndProfit начинает вполне с азов и тоже https://pragprog.com/book/swdddf/domain-modeling-made-functional

Evgeniy
12.06.2018
18:42:24
@Kleidemos А как мне mailbox.Sender () типизировать?

Google
Rustem
12.06.2018
18:43:49
как сделать рандомный массив от -100 до 100 и размером до 100 элементов?

Klei
12.06.2018
18:43:54
@Kleidemos А как мне mailbox.Sender () типизировать?
Скорее всего retype <| context.Sender().

Rustem
12.06.2018
18:46:07
ок, спасиб просто для тестов надо

а самому придумывать лень

Klei
12.06.2018
18:46:36
Ты там FsCheck не переизобрети.

Rustem
12.06.2018
18:46:49
)))

Evgeniy
12.06.2018
18:49:00
Скорее всего retype <| context.Sender().
А я не могу еще более связанную систему сделать, что Sender имел заданный тип?

Klei
12.06.2018
18:49:37
@Kleidemos А как мне mailbox.Sender () типизировать?
Кстати, крайне рекомендую запоминать .Sender() где-нибудь вначале. В случаях, когда две ветки должны вернуть отправителю один и тот же тип, спасает от ряда ошибок.

Rustem
12.06.2018
18:55:20


Klei
12.06.2018
18:56:05
А рандом откуда брал?

Rustem
12.06.2018
18:56:16
System

Klei
12.06.2018
18:56:29
Я имею ввиду, где он был создан.

Выглядит так, будто ты его при каждом вызове генеришь.

Klei
12.06.2018
18:56:59
Рандом зависит от времени.

Rustem
12.06.2018
18:57:23
Рандом зависит от времени.
а как мне сделать рандомный рандом?

Klei
12.06.2018
18:57:45
Если не планируешь вызывать функции много раз, то просто (let rnd = new ... fun _ -> rnd.Next ...)

Google
Klei
12.06.2018
18:58:06
Если надо несколько рандомных массивов, то объяви rnd еще выше.

Rustem
12.06.2018
18:58:18
ок

Klei
12.06.2018
18:59:13
В последнем случае судя по моему опыту, скорее всего тебе придется создать некий модуль Urils, и запихнуть в него rnd.

Rustem
12.06.2018
18:59:38


Klei
12.06.2018
18:59:43
Ок, понял. let sender: IActorRef<Command> = mailbox.Sender()
А из контекста нельзя выводить?

Да. Создавай до for.

Evgeniy
12.06.2018
19:00:21
А из контекста нельзя выводить?
Cмотрю исходники Akkling.

Rustem
12.06.2018
19:00:49
Evgeniy
12.06.2018
19:12:26
@Kleidemos Наверное, можно попробовать снаружи параметризовать обработчик нужным типом.

Я забываю периодически, что у нас обычные функции. :)

Klei
12.06.2018
19:30:12
@Kleidemos Наверное, можно попробовать снаружи параметризовать обработчик нужным типом.
Не уверен, что понял о чем ты. Обработчик сообщений не типизирует sender.

Evgeniy
12.06.2018
19:57:14
@Kleidemos https://github.com/Horusiath/Akkling/issues/1

Igor
12.06.2018
20:06:04
А в F# есть способо преврать () -> Task<T> в Async<T>? Я пока не вижу изкоробочного.

Igor
12.06.2018
20:06:38
Async.AwaitTask не множко не про то, но НЕ пересоздаст Task

Igor
12.06.2018
20:13:56
Ну я думал, что Async<T> ~= () -> Task<T> те Async по факту и есть лямбда, которая возращает фьючу. По этому Async<T> ленивый и его можно несколько раз запускать. Async.AwaitTask просто заворачивает Task в лямду, НО тк Task<T> одноразовый, то и результирующий Async<T> будет каждый раз возвращть одно и тоже.

Google
Vlad
12.06.2018
20:15:05
запутал ты меня если честно

Igor
12.06.2018
20:15:30
Ну в общем да, просто завернул все в async {}

システム
13.06.2018
09:00:22
Hi guys, Maybe someone is here https://ndcoslo.com ? Or maybe someone does have interesting questions to speakers which I could pass. Don S is gonna be here, as well as Mathias B and Scott W

システム
13.06.2018
09:11:56
Hi, thnx. What will Don talk about?
More general staff - f# way to zen

https://ndcoslo.com/talk/the-f-path-to-relaxation/

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