@Fsharp_chat

Страница 598 из 772
Klei
11.06.2018
10:52:26
@Kleidemos У тебя есть на примете хорошие материалы про акку?
Akka.net Bootcamp. Но там пример только для Akka.FSharp. Я решил курс на Akkling, но щас могу сказать, что некоторые элементы надо переделать. На гитхаб не заливал. Доки Akka.net я не понимаю, по крайней мере до того момента, когда пойму из другого места. Но это не показатель, т.к. давно я не высыпался. Ну и скорее всего я для своих сделаю экскурс в Akka, правда стандартная для меня манера подачи не предполагает публикацию в общий интернет. Если будет актуально, могу потом в приватах скинуть текстовые наработки.

Friedrich
11.06.2018
11:13:37
Это про тот Forge, который управляет проектами и солюшенами?

Evgeniy
11.06.2018
11:13:42
Сейчас все нормально работает через dotnet cli.

Google
Ayrat
11.06.2018
11:22:52
@Kleidemos У тебя есть на примете хорошие материалы про акку?
Я начал F# когда мучал акку. Свои начальные попытки даже выложил на хабр https://m.habr.com/post/334296/

Щас бы я многое переделал, но и так неплохо, а главное работает збс

Не нужно пользоваться Forge.
+1 проще свой темплит для dotnet new сделать, благо это элементарно нынче, чем Forge, который устарел и делает 100500 ненужных вещей.

Mikhael
11.06.2018
12:00:25
Окей спасибо за ответы

Ayrat
11.06.2018
12:32:51
Окей спасибо за ответы
А вообще в fsproj, замени target framework с net461 на net471

Mikhael
11.06.2018
12:34:07
пробовал - не работает , требует 4.6.1 - там еще куча каких=то мутных зависимостей

Ayrat
11.06.2018
12:34:35
Сделай dotnet restore после этого

Mikhael
11.06.2018
12:35:06
попробую. спасибо

Ayrat
11.06.2018
12:36:34
А, там paket же. Зайди в paket.dependecies и посмотри стоит ли там framework: auto-detect или конкретный. Если конкретный - поменяй. После сделай paket install чтобы он обновил лок файл с новыми версиями для нового фреймворка. Ну и все

Mikhail
11.06.2018
12:40:06
Привет! Кто нибудь работал с elmish? Не могу понять, как с помощью Cmd можно делать сайд эффекты, если функция update должна быть чистой

Ayrat
11.06.2018
12:42:11
Кому должна?) делай сайд эффекты

Google
Mikhail
11.06.2018
12:44:06
Cmd.ofPromise же
Меня это и смутило. Cmd.ofPromise - разве это чистая функция?

Кому должна?) делай сайд эффекты
Это больше концептуальный вопрос)

Igor
11.06.2018
12:45:03
Меня это и смутило. Cmd.ofPromise - разве это чистая функция?
Ну она же принимает лямбду 'a -> Promise те НЕ выполняет сразу промис, а отправляет его в "рантайм", так что сам update чистый

Ayrat
11.06.2018
12:45:06
Это больше концептуальный вопрос)
Ну, тут надо для себя решить, шашечки или ехать.

Ну она же принимает лямбду 'a -> Promise те НЕ выполняет сразу промис, а отправляет его в "рантайм", так что сам update чистый
Есть мнение что чистоты это не прибавит. Отложенный сайд эффект все равно сайд эффект.

Igor
11.06.2018
12:47:37
Ну так это же как в хаскеле IO Тоже отложенный сайд-эффект, там это считается чистым

Friedrich
11.06.2018
12:47:39
Есть мнение что чистоты это не прибавит. Отложенный сайд эффект все равно сайд эффект.
Э, не. Эдак мы придём к тому, что Haskell тоже не pure (а это, с моей точки зрения, формально неверно).

Ну так это же как в хаскеле IO Тоже отложенный сайд-эффект, там это считается чистым
Да, я считаю, что в данном случае всё чисто. (хотя ничего не разумею в elmish)

Ayrat
11.06.2018
12:48:49
Ну так это же как в хаскеле IO Тоже отложенный сайд-эффект, там это считается чистым
Он там лейзи, отправленный в рантайм промиз уже зашедулен на выполнение, он не ленивый же

Igor
11.06.2018
12:49:02
Есть мнение что чистоты это не прибавит. Отложенный сайд эффект все равно сайд эффект.
Ты можешь 100500 раз вызвать update и у тебя всегда будет один результат (ссылка на функцию, возращающую промис).

Friedrich
11.06.2018
12:49:49
Так, ну давайте разберёмся, что такое промис.

Igor
11.06.2018
12:49:49
И 100500 зашедуленных промисов в нагрузку?)
Нет, если ты эту лямбду не будет вызывать

Ayrat
11.06.2018
12:51:27
Так, ну давайте разберёмся, что такое промис.
Промис в жс разве не не ранится при получении ссылки на него? В елмиш Промис это ж прокси для того Промиса не?

Я глубоко в эту сторону не копал

Friedrich
11.06.2018
12:51:59
Ну, кароч, при правильном обращении этот 'a -> Promise — это аналог IO Promise

Кажется чистым.

Friedrich
11.06.2018
12:52:26
Ты, конечно, можешь сразу создать промис, его зашедулить, и сделать функцию, которая вернёт заранее созданный промис, тем самым нарушив чистоту.

Google
Friedrich
11.06.2018
12:52:48
Но, кажется, это не является предполагаемым вариантом использования. В теории там чисто, но ты можешь чистоту сломать.

Mikhail
11.06.2018
12:53:51
Кажется чистым.
Я почему то не понял, почему IO a считается чистым?

Friedrich
11.06.2018
12:54:01
Вот ты написал putStrLn "xxx" — что сделалось?

Friedrich
11.06.2018
12:54:33
Лейзи же
Не совсем.

Friedrich
11.06.2018
12:54:56
Вот ты написал putStrLn "xxx" — что сделалось?
Правильный ответ — ничего не сделалось. Ты создал экшен, который распечатает строку. У тебя нет способа этот экшен выполнить, вообще нет. (не считая unsafePerformIO)

Ayrat
11.06.2018
12:55:11
Вывелось?
В ду нотации выведется, а так будет IO

Friedrich
11.06.2018
12:55:31
Для того, чтобы вообще что-то сделать, ты должен экземпляр IO отдать в некий «рантайм», который по сути является интерпретатором IO-экшенов.

Любая программа на Haskell — это чистая функция, которая создаёт большой IO-экшен. Она никогда сама по себе никаких побочных эффектов не делает. Она в функции main этот экшен конструирует, а дальше его выполняет рантайм (который не является чистым).

Такая вот там идеология.

Mikhail
11.06.2018
12:56:52
Ого, я кажется понял. Спасибо!

Friedrich
11.06.2018
12:57:07
Вы можете другую интерпретацию предложить, конечно, но моё видение, вроде бы, близко к официальному.

В F# (или, например Scala) всё совсем не так, и ты можешь выполнять побочные эффекты где угодно, тебе не нужен никакой рантайм. Но чуваки, которые убиваются по «чистому ФП», так делать не любят, и поэтому всё равно делают некую точку выхода в рантайм. А весь свой код оставляют чистым и без побочных эффектов. И функция вида 'a -> Promise как раз очень похожа по сигнатуре на эдакий «IO для бедных».

Igor
11.06.2018
13:09:10
F# кстати с этой точки зрения Async правильнее задизайнены, как () -> Task, те они ленивые и переиспользуемые. В отличие от C# Task и даже изкоробочных Scala Future

Mikhail
11.06.2018
13:16:42
А для чего сделали Async? Чем он от тасков отличается? Где об этом лучше почитать?

Google
Friedrich
11.06.2018
13:36:41
Я бы сказал иначе - тебе могут всунуть побочные эффекты где угодно
Мне всунут?! Да я их сам кому хочешь всуну! Ух!

Bonart
11.06.2018
13:37:05
"Случаи бывают всякие"(с)

Evgeniy
11.06.2018
13:39:48
А для чего сделали Async? Чем он от тасков отличается? Где об этом лучше почитать?
- Async представляет собой отложенное вычисление, его нужно отдельно запускать; Task запускается сразу - Async пробрасывает cancellation token в вычисления при композиции

Bonart
11.06.2018
13:40:12
Иллюстрация кривизны вывода типа в C# public static NotNull<T> ToNotNull<T>(this T value) where T: class => TryCreate(value, out var result) ? result : throw new ArgumentNullException(); public static NotNull<T> ToNotNull<T>(this T? value) where T : struct => TryCreate(value, out var result) ? result : throw new ArgumentNullException(); Для nullable компилятор не сможет определить правильную перегрузку.

Bonart
11.06.2018
13:41:49
- Можно создать Task через конструктор и не вызвать метод Start()
И будет говнокод по антипаттерну "протокол". Шарповая задача предполагается запущенной

Friedrich
11.06.2018
13:42:04
Иллюстрация кривизны вывода типа в C# public static NotNull<T> ToNotNull<T>(this T value) where T: class => TryCreate(value, out var result) ? result : throw new ArgumentNullException(); public static NotNull<T> ToNotNull<T>(this T? value) where T : struct => TryCreate(value, out var result) ? result : throw new ArgumentNullException(); Для nullable компилятор не сможет определить правильную перегрузку.
И в чём же она, простите, заключается, эта иллюстрация? Я подозреваю, что CLI просто не даст создать два таких метода (и C# тут не виноват). Но быстро проверить не смог, не хватает пары определений.

Bonart
11.06.2018
13:42:23
Мало того, незапущенную задачу удастся запустить только однажды

Bonart
11.06.2018
13:43:11
А, ок, теперь вижу в новой редакции сообщения :)
Сишарп не учитывает констрейнты ни при определении перегрузки, ни при выводе типов

Скомпилить методы можно, а использовать по прямому назначению низзя

А как попросить вычисление завершиться? Где то должен быть CancellationTokenSource?
А это и с обычной таской не пройдет. Завершение задачи предполагается кооперативным

Bonart
11.06.2018
13:48:17
http://tomasp.net/blog/csharp-fsharp-async-intro.aspx/ - про разницу моделей асинхронности в C# и F#

Ayrat
11.06.2018
16:17:52
А вообще забить на эти темплейты можно?
Конечно модно, но в сотый раз надоедает

Google
Roman
11.06.2018
16:48:26
Привет!

Roman
11.06.2018
16:51:43
И 100500 зашедуленных промисов в нагрузку?)
Чистая ф-ция != идемпотентная

Klei
11.06.2018
18:08:45
Когда у компа буду.

Mikhael
11.06.2018
18:09:34
Конечно модно, но в сотый раз надоедает
А там ещё платформу надо указать - типа win-64 - там тоже менять на auto-detect или оставить?

Evgeniy
11.06.2018
19:03:15
Свежий Akkling зависит от FSharp.Core 4.5.0

?

Ayrat
11.06.2018
19:05:41
Плохо.

Хотя не, пофигу

Но это он зря

Igor
11.06.2018
19:15:06
Свежий Akkling зависит от FSharp.Core 4.5.0
И что это значит? Мы же все равно не указывам явно версию в проектах ?

Evgeniy
11.06.2018
19:22:14
Ну, мне пришлось явно указать версию FSharp.Core

Я плохо понимаю, как они доставляются через Microsoft.NET.Sdk

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