[英]Converting a nested type into a monad transformer stack
我對Haskell從第一原理編程的Monad變形金剛一章中的一個練習感到有些麻煩。 具體來說,我們給了一個看起來像(const (Right (Just 1)))
,並要求其完成以下操作:
import Control.Monad.Trans.Except
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader
embedded :: MaybeT (ExceptT String (ReaderT () IO)) Int
embedded = ??? (const (Right (Just 1)))
我假設這意味着我們不能更改嵌套結構,盡管說明只是“使之起作用”。
在確定自己被卡住之前,我已經走了幾條路。 到目前為止,據我所知,monad變壓器最常見的是結合了lift
和do
的-除了SO Q&A, Diehl在這里總結得很好 。
我也一直在使用transformers
庫中的map<Monad>T
變體來獲得一些有趣的結果,但是我似乎無法找出解決原始問題的方法。 任何提示將不勝感激-但是,如果您發布解決方案, 請使用擾流器標記 (盡管我從未見過它在除《 Puzzling》之外的其他任何地方使用)。
此練習確實顯示了monad變壓器有時可以“由內而外”工作的方式。 首先弄清楚如何包裝該表達式,以便獲得某種類型的東西
ReaderT () IO (Either String (Maybe Int))
然后弄清楚如何獲得MaybeT
。 等等。
不要忘記,您被允許使用ReaderT
, EitherT
和MaybeT
數據構造函數!
如果您還沒有嘗試過,那么這將是一個絕佳的時機來嘗試GHC的打孔 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.