?

Log in

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

Site Meter

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

Дно двунаправленности пробито [окт. 10, 2017|22:06 pm]
Andy Melnikov
[Tags|, , , ]

import System.IO.Streams (contramap)
quux x = do
   foo <- contramap show x
   bar <- contramap Just foo
   return bar
Все мы помним State-монаду, в которой состояние движется в другую сторону и взбирается по ду-нотации вверх. Сегодня я столкнулся с продвижением контрол-флоу против стрелок обычной монады IO.

Т.е. у нас "вход" как бы снизу, а x - это "выход". return bar отправляет этот вход в bar, дальше он проходит Just и отправляется в foo, а оттуда проходит через show и попадает в x

Тип соответствующий:
quux :: Show a => OutputStream String -> IO (OutputStream a)
a "на входе", затем Just делает Maybe a, и show делает строку.
СсылкаОтветить

Comments:
[User Picture]From: nponeccop
2017-10-11 10:17 pm
Обратный контрол флоу просто объяснить примером:

push a l = return $ a : l

main =
    return [] >>=
    push (print "1") >>=
    push (print "2") >>=
    sequence_
Теперь если насоздавать синонимов, получаем:

main =
    stop >>=
    exec (print "1") >>=
    exec (print "2") >>=
    start
Этот код надо читать снизу вверх, поскольку логически у нас
start;
print "2";
print "1";
stop;
(Ответить) (Parent) (Thread)