
Roman
25.06.2018
10:16:10
Но аннотации это ужасно

Evgeniy
25.06.2018
10:17:40
Страшненькие? :)

Ayrat
25.06.2018
10:18:10
попахивает джавой @NotNull

Evgeniy
25.06.2018
10:18:24
Прототип тайпклассов для F# тоже с аннотациями.

Google

Evgeniy
25.06.2018
10:18:32
Ну, и всякие [<Struct>].

Vlad
25.06.2018
10:19:20

Ayrat
25.06.2018
10:19:41
Ну, это не от хорошей жизни. Это компромисы.
А в случае рекорд тайпов аннотация struct норм, т.к. она всего лишь изменяет способ аллокации, а не поведение
т.е. это как AggresiveInlining
на код никак не сказывается

Roman
25.06.2018
10:20:29

Ayrat
25.06.2018
10:20:51
Это в C# struct меняет поведение, т.к. там сразу появляется non null, поля инициализируются и прочая тема. Помимо аллокации на стеке

Evgeniy
25.06.2018
10:20:54

Roman
25.06.2018
10:20:57
И типы нельзя переиспользовать, часто из-за аннотаций

Ayrat
25.06.2018
10:23:49
Я вот считаю что C# в этом плане плоховат.
Он смешивает бизнесовые, логические вещи (record types, non-nullability) с инфраструктурными (аллокация на стеке/в куче). Ну и эта фигня в F# проникает, да
Понятно что сейчас разделять никто не будет, но видимо 20 лет назад это казалось хорошей идеей

Evgeniy
25.06.2018
10:24:28

Ayrat
25.06.2018
10:27:02
А как разделять?
ну логические вещи типа non-nullable/nullable ключевым словом например. Компилятор будет орать что ты не инициализировал все поля в Immutable классе, или ещё чо
А способ аллокации так:
1) если аллоцируется через stackalloc -> на стаке
2) если есть заданная аннтоция, следуем ей
3) всё остальное по дефолту на куче

Google

Igor
25.06.2018
10:42:29

Roman
25.06.2018
10:44:11

Ayrat
25.06.2018
12:54:39
https://www.reddit.com/r/ProgrammerHumor/comments/8tlqo9/javascript_is_getting_real_tired_of_your_jokes/
"C# is a dull language for corporate schmucks. He takes advantage of his sister F# and then hides her in the basement."

Pavel
25.06.2018
13:16:43
да, тоже сегодня улыбноло это про C# ))

Evgeniy
25.06.2018
13:30:46
https://twitter.com/demystifyfp/status/1011229606379061248
HOPAC!!!1

Vlad
25.06.2018
13:32:16

Ayrat
25.06.2018
13:32:26
танцуем, сегодня мы с тобой танцуем (гопак)

Evgeniy
25.06.2018
13:32:45
no
Там хорошая серия постов.

Vlad
25.06.2018
13:33:44

Ayrat
25.06.2018
13:33:45
Да и гопак в целом ничо. После унылых асинков, к которым даже map надо руками прикручивать так вообще огонь

Roman
25.06.2018
13:33:46

Ayrat
25.06.2018
13:34:09
haf вообще мечтал hopac дефолтной асинхронной либой в F# сделать. Но думаю не сложится у него с этим)

Vasily
25.06.2018
13:39:09
Joinads!!!!!

Ayrat
25.06.2018
13:39:26
даже у них мало шансов по-моему

Vasily
25.06.2018
13:44:03
Мне понравился подход сам
А учитывая, что пейпер писали Петричек с Саймом, все ок

Evgeniy
25.06.2018
13:45:02
task

Vlad
25.06.2018
13:45:12

Google

Ayrat
25.06.2018
13:46:22
task
https://vaskir.blogspot.com/2015/01/parallel-reduce-hopac-vs-asyncs-vs-tasks.html

Evgeniy
25.06.2018
13:48:01
Ага.
Я лишь про то, что таск будет в стандартной либе.

Ayrat
25.06.2018
13:48:37
А, эт да. Давно пора

Roman
25.06.2018
13:49:52

Ayrat
25.06.2018
13:50:37
Я кстати толком понял как тасковая стейт машина работает отсюда
https://github.com/rspeele/TaskBuilder.fs/blob/master/TaskBuilder.fs
В C# сырцах там размазано по десятку классов с кучей воды. F# код хоть и не 100% повторяет, но мысль понять можно

Evgeniy
25.06.2018
13:51:37

Roman
25.06.2018
13:55:13

Vasily
25.06.2018
14:56:19
Немного странный вопрос. Могу ли я объявить event.Publish в модуле с целью дальнейших Observable.subscribe?
Вопрос снимается, таки можно

Ayrat
25.06.2018
16:12:32
Я вот понял что мне не нравится засовывать юнит в конструктор:
Class(())
Выглядит ужасно. Что можно сделать?

Vasily
25.06.2018
16:13:09
Не засовывать его туда

Ayrat
25.06.2018
16:13:30
Допустим. А если надо всё же присунуть, то?..

Vasily
25.06.2018
16:13:35
Зачем он там?
Сайд эффекты?

Ayrat
25.06.2018
16:14:43
Ну всякие ситуации бывают. Мне надо соорудить в гопачке промиз, который всегда выполняется. что-то типа Alt.always, но промиз
Promise() возвращает промиз который никогда не выполнится, это пустой промиз, ок
А вот Promise(()) как раз то что надо
Promise 42 тоже всегда выполняется, но будет выглядит тупо

Vasily
25.06.2018
16:16:04
А зачем тебе такой промис?
Я почему вопросы такие задаю, потому что с трудом могу представить такую ситуацию

Google

Vasily
25.06.2018
16:19:18
Когда это потребуется

Ayrat
25.06.2018
16:20:43
У меня там такое
в хранилище ищется файлик. Если он есть, то его выкачиваем, мемоизим (переиспользуется, поэтому промиз).
Если его нет, запускаем тяжкую логику его сборки, сайд эффектом (который надо ОБЯЗАТЕЛЬНО дождаться) заливаем в хранилище.
соответственно остальная часть логики принимает два промиза - промиз на файлик (он будет выкачан из хранилища, или собран заново) и промиз сайд эффекта (это тот самый Promise(()) ), т.к. мы можем очень быстро закончить программу, а заливки надо дождаться асинхронно.
Промиз на сайд эффект тут затем чтобы два раза заливка не пошла
Надеюсь понятно объяснил
промиз сайд эффекта тоже может быть в двух вариантах - либо это тяжкий сайд эффект аплоада, или пустой промиз, который всегда выполняется (если мы файл нашли, не собирали его заново и заливать его собсно не надо)

Vasily
25.06.2018
16:24:41
Что мешает написать две функции аплода и передавать в промиз одну из них?

Ayrat
25.06.2018
16:25:44
Оборачивать функцию в промиз это слишком ФП, ща попробую обмыслить

Vasily
25.06.2018
16:29:29
Промиз скорее про способ исполнения кода, чем про воркфлоу,кмк
Ну и неясно, почему аплоад сайд эффектом
И нельзя ли завернуть в промиз функцию аплода, которая как раз проверяет мемоизацию и подгружает файл, если надо

Ayrat
25.06.2018
16:31:31
В гопачке промиз - это способ мемоизить джобы, которые как и F# асинки являются генераторами, т.е. будут каждый раз заново запускаться.
А у меня тяжёлый IO, который не хочется гонять два раза если двум функциям понадобятся одни и те же данные.

Vasily
25.06.2018
16:31:59
Дык разрули его внутри функции

Ayrat
25.06.2018
16:32:33
Я понимаю, типа разбиндить промиз в нормальную переменную, но всё не так просто когда у тебя десятки этих промизов)))
проще не разворачивать
Не поверишь, нашёл применение аппликативному функтору в продакшн коде
Всё через промизы/джобы. Пишешь обычные функции (без промизов и джобов).
Через инфиксный apply закидываешь промизы в функцию (как в nodeJs)

Vasily
25.06.2018
16:34:02
Имеет смысл подумать над укрупнением блоков, которые заворачиваются в промисы,имхо

Ayrat
25.06.2018
16:34:57
Ну и неясно, почему аплоад сайд эффектом
я оговорился. Это не то чтобы сайд эффект, а это важный эффект, который надо дождаться, но не синхронно. Т.е. джойн сделать основного куска говнокода и этого аплоада в конце программы

Vasily
25.06.2018
16:35:52
А,два разных потока событий
Типа waitall?

Ayrat
25.06.2018
16:36:20
Типа да

Vasily
25.06.2018
16:36:54
Ну просто не добавляй промис загрузки, если нет необходимости

Google

Vasily
25.06.2018
16:37:21
Или оно так не работает?

Ayrat
25.06.2018
16:38:10
Т.е. основной кусок кода такой - получи как нибудь важные данные (из хранилища или собери заново) -> (если получены заново, начинай заливать в хранилище, но асинхронно) -> используй важные данные и собери ещё более важные данные -> убедись что залит как основной результат, так и запущенный (возможно) ранее
и вот мне не нравится синтаксис!

Vasily
25.06.2018
16:39:17
Зачем создавать, когда можно не создавать!
А по вопросу
let p f = Promise(f)

Ayrat
25.06.2018
16:42:02
Зачем создавать, когда можно не создавать!
Если у меня есть условный if который делит контрол-флоу на части (надо собирать заново и заливать) и (не надо собирать заново), то
если я в первом куске кода запускаю джоб и не получу какой-нибудь хендл на него (ну типа таск/асинк/ и т.п), то в конце программы я не смогу его повейтить чтобы убедиться что он залился. Он просто может очень долго заливаться, дольше чем остальная программа выполняется, соответственно тред умрёт и заливка сдохнет

Vasily
25.06.2018
16:42:34
Ну выглядит странно, если честно

Ayrat
25.06.2018
16:42:42
т.е. условные оба бранча этого ифа должны возвращать какой-то хендл на заливку
или полный или заглушку.

Vasily
25.06.2018
16:47:19
Тааак

Ayrat
25.06.2018
16:47:38
Бля, нарисовал)

Vasily
25.06.2018
16:49:15
Так вот
В нижней ветке квадратик лишний

Ayrat
25.06.2018
16:50:08
там один квадратик :D
и прям он лишний?
Просто т.к. это F#, то типы верхей и нижней ветки должны сходиться. В данном случае в крайний правый терминирующий квадратик должно прилетать одинаковое что сверху, что снизу

Vasily
25.06.2018
16:52:14
Массив состояний ожидания
Все, пошёл тренироваться

Ayrat
25.06.2018
16:52:44
ООПешечкой пахнуло :D