?

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:
From: (Anonymous)
2017-10-11 11:28 am
Монада вещь абстрактная и, вопреки примерам с IO, не обязана ничего исполнять по порядку. Я так подозреваю, что тут работает монада, которая запоминает операции и применяет их наоборот, в стиле https://hackage.haskell.org/package/tardis-0.4.1.0/docs/Control-Monad-Tardis.html .
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2017-10-11 11:59 pm
В этом топике везде монада IO стандартная :)
(Ответить) (Parent) (Thread)