LINUX.ORG.RU

[haskell][Monad Transformers]

 


0

1

Лор, а расскажи как комбинировать монад трансформеры в do нотации, вот надуманная монада в вакууме скомбининрованны ReaderT и StateT так что при разывертывании значения из оберточных типов мы в список [Int] добавляем длинну другого списка [a].

appendLength :: Monad m => ReaderT [a] (StateT [Int] m) ()
appendLength = ReaderT $ \cont -> (StateT $ \st -> return ((), (length cont:st)))

и работает типа так

*Main System.IO.Unsafe> (runStateT $ runReaderT appendLength ["yeah", "fuck"]) [6, 10]
((),[2,6,10])

Сказал Йода по левое плечо что выражение это в DO нотации записать можно.

Ответ на: комментарий от anonymous

Да, я уже дошел до лифта, вот так

appendLengthM :: (Monad m, Num b) => ReaderT [a] (StateT [b] m) ()
appendLengthM = do len <- asks genericLength
                     lift $ do st <- get
                             put $ len:st

Можно монады как слоеные пирожки заворачивать, а лифтом разворачивать, круто !

s9gf4ult ★★
() автор топика
Ответ на: комментарий от ratatosk

Оба на ! точно. А еще есть монада RWST так что и сам стэк не нужен :)

s9gf4ult ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.