?

Log in

No account? Create an account
Посадил дерево! - Дважды мудак — ЖЖ [entries|archive|friends|userinfo]
Декларативное рулит

Site Meter

[ website | Мой сайт ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Посадил дерево! [июн. 27, 2019|11:31 am]
Andy Melnikov
[Tags|, , ]

Написал Monad tutorial.
СсылкаОтветить

Comments:
From: (Anonymous)
2019-06-27 10:07 pm
Я вот так в спинной мозг монады не вгрузил. Как не старался. Хотя может понял кучу других концепций. Или просто на хаскеле недостаточно писал. Я даже пакмана с time rewind и порталами как-то запилил - https://github.com/jakobz/HPacman - линзы там всякие, вот это всё. Но монады - не, не могу сказать что прям впитал.

А вот можно node затипизировать на TypeScript, получив примерно такой же эффект как в хаскеле?
Ну типа
readFile: (name: string) => IoPromise
IoPromise - надкласс Promise, совместимый, но его нельзя сдаункастить в обычный Promise. Из него нельзя выбраться:
IoPromise::then<...>((...) => IoPromise<...>)
Ну т.е. забравшись в IO, из него не выберешься. И чистые функции от сайд-эффектных можно отличать. Где неправ?
(Ответить) (Thread)
[User Picture]From: jakobz
2019-06-27 10:18 pm
Сорри, если дубль-камент, но первый чот потерялся походу.

Короче я в хаскель-тусе где-то пару лет тусил. Мы наверное тогда и зафрендились. Учил, читал книги, пакмана вон написал - https://github.com/jakobz/HPacman - с линзами всякими. И линзы - плюс-минус проссал (ну может когда из обобщили до ковариантных профункторов - уже не очень). Но монады - не сдались, не могу прям чтобы спинным мозгом понять. Хотя что Хаскель сделал из меня человека - это точно.

Вот смотри, если мы node.js типизируем TypeScript-ом вот так:
1. Все IO-функции меняем, чтобы они возвращали IoPromise<T>
2. IoPromise<T> - наследуем от Promise, но чтобы все методы тоже возращали IoPromise<T>
Тогда мы вроде как не сможем уже сделать в функции IO, но вернуть не-IO.
Т.е. мы всё IO "заражаем", и получаем что нельзя его сделать тайком.

Я правильно рассуждаю?

Там наверное дальше идёт что ошибка в том, что монады не коммутируют, и IoPromise - это и не IO<Promise<T>>, и не Promise<IO<T>>. От этого стартовать IO таки получится, но вернуть результат - нет. Тут тоже что-то типа?


Edited at 2019-06-27 22:24 (UTC)
(Ответить) (Thread)
[User Picture]From: nponeccop
2019-06-29 02:06 am
Ну там целая история. Пометка нам ничего не даёт.

Начинать надо с того, что обычно оптимизатор должен знать, где есть эффекты, а где нет. То есть let x = succ 13 in 42 эквивалентно просто 42 (x - неиспользуемая переменная), а let x = print 13 in succ 42 - нет.

Аналогично об эффектах нужно знать при рефакторинге. Допустим у нас есть f(x,y) и мы хотим сделать рефакторинг, переставив аргументы местами f(y,x). Соответственно надо переставить их и в местах вызова.

Ну и если у нас было f(succ 42, succ 13) - то после будет f(succ 13, succ 42). А если было f(print 13, print 42) - то надо переставить порядок значений, сохранив порядок эффектов. То есть, после будет

let x = print 42
let y = print 13
f(y, x)

Ну то есть оптимизатор обычно (если эффекты unencoded) должен знать о наличии эффектов, чтобы не отключить их и не переставить местами.

В этом смысле пометка без монадической кодировки нам ничего не даёт.
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2019-06-29 02:13 am
В варианте с кодировкой у нас равенства термов не зависят от наличия эффектов. То есть в хаскеле

let x = print 13 in succ 42
let x = succ 13 in succ 42

оба эквивалентны 42, в отличие от ML. И не из-за ленивости, а из того, что эффекты исполняются, только если их кодировка доходит до интерпретатора
(Ответить) (Parent) (Thread)