![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
http://community.haskell.org/~simonmar/papers/haxl-icfp14.pdf
Или у меня синдром Даннинга-Крюгера, или я не нашел ничего, чего бы не было у Патерсона и МакБрайда, а также поразительно похожие куски на слайды моего рассказа на Codecamp в 2012-го году. Хотя, конечно, у дураков и великих умов мысли сходятся; да и у меня там не было ничего такого, что бы не написали уже Патерсон с МакБрайдом.
Или я чего-то не понял.
Но у меня в парсерах нынче подобного кода пруд пруди.
Или у меня синдром Даннинга-Крюгера, или я не нашел ничего, чего бы не было у Патерсона и МакБрайда, а также поразительно похожие куски на слайды моего рассказа на Codecamp в 2012-го году. Хотя, конечно, у дураков и великих умов мысли сходятся; да и у меня там не было ничего такого, что бы не написали уже Патерсон с МакБрайдом.
Или я чего-то не понял.
Но у меня в парсерах нынче подобного кода пруд пруди.
for {(name, sDob, membernumber, claimnumber) <- Result.zip(props @ Name, props @ Dob, props @ MemberId, props @ ClaimNr) dob <- parseDob(sDob) stuff <- buildStuff(name, dob, membernumber, claimnumber) } yield stuff
no subject
Date: 2014-12-02 03:04 pm (UTC)no subject
Date: 2014-12-02 08:22 pm (UTC)no subject
Date: 2014-12-02 08:58 pm (UTC)no subject
Date: 2014-12-02 09:56 pm (UTC)no subject
Date: 2014-12-03 03:56 pm (UTC)no subject
Date: 2014-12-02 05:05 pm (UTC)UPD. вроде не год, но такое ощущение что год прошел.
no subject
Date: 2014-12-02 08:23 pm (UTC)no subject
Date: 2014-12-03 03:42 am (UTC)Я вот только что закончил задачи по Poor Man’s Concurrency Monad на edX FP101. Не помню, когда еще написание одной строчки кода отнимало у меня столько времени, типа:
(Concurrent f) >>= g = Concurrent (\ c -> f (\a -> (unwrap(g a) c)))
Круть.
no subject
Date: 2014-12-03 12:56 pm (UTC)no subject
Date: 2014-12-03 03:00 pm (UTC)no subject
Date: 2014-12-03 03:25 pm (UTC)no subject
Date: 2014-12-03 08:16 pm (UTC)Возможно
Date: 2014-12-03 08:22 pm (UTC)no subject
Date: 2014-12-06 01:40 pm (UTC)no subject
Date: 2014-12-06 04:32 pm (UTC)no subject
Date: 2014-12-06 11:08 pm (UTC)я вообще-то не посоветую, как там сделать параллелизм _правильно_, но мне кажется, fetch пишется thread-safely как Server, а в Client запросы делаем, комбинируя par. Потом соединяем: fetch +>> client
Клиентская часть тогда довольно гигиенично (а серверную они и так не показывают):
Хотя, даже лучше. Есть же pipes-concurrency. Объяснили бы в статье, что так, мол, и так, pipes suck.
no subject
Date: 2014-12-07 07:59 am (UTC)no subject
Date: 2014-12-07 10:03 am (UTC)Монада позволяет выстраивать цепочки вычислений:
Но у нас зачастую будут какие-то вложенные конструкции, типа как вложенные циклы. Из-за этого логика обоих циклов выглядит разорванной. Pipes позволяет separation of concerns. Строишь независимые цепочки, а в нужных местах расставляешь await / yield для "горизонтального" общения между цепочками действий.
Pipes предоставляет несколько разных способов соединять входы-выходы; все эти >~, ~>, >->, +>>,, >\\ - это просто разные способы комбинировать горизонтально; там и диаграммки нарисованы для этого, и по типам ясно, что к чему. В связи с тем, что комбинирование - это композиция, там получается и категорная семантика тоже.
А сдвиг парадигмы, собственно, мотивируется замечательным образом в одном из выпусков fprog - там про continuations рассказывалось, но мотивация годная: чтобы совместить, скажем, итератор по дереву и потребитель содержимого дерева, кого-то из них нужно "вывернуть наизнанку", из-за чего оба будут выглядеть уродски (а вот если ввести continuations, то по-божески). А с помощью Pipes итератор будет выглядеть так:
(а то и вообще iter = traverse yield)
а потребитель - так:
Склеиваем с помощью Pipes: (iter tree >~ consume) - всё! Ни итератор не заморачивается, как именно кто-то хочет потребить содержимое дерева, ни потребитель не заморачивается, как итератор устроен; оба пишутся "в лоб" цельной цепочкой действий.