我在Haskell Programming From First Principles的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
s和do
s组合创建 - 除了SO Q& As,Diehl summarizes pretty well here。
我一直在使用map<Monad>T
库中的transformers
变体来获得一些有趣/有趣的结果,但我似乎无法找到如何解决原始问题。任何提示都会受到赞赏 - 但是,如果你发布一个解决方案,please use the spoiler markup(虽然我从未见过它在除了困惑之外的任何地方使用过)。
答案 0 :(得分:3)
这个练习真实地展示了monad变形金刚有时可以如何工作&#34;内外&#34;。首先弄清楚如何包装该表达式,以便得到类型
的东西function deletequestion($k){
$hasil = $this->db->query("DELETE question FROM question JOIN main ON main.id_question = question.id_question WHERE main.id_comp = $k");
$query = $hasil->result();
return $query;
}
然后弄清楚如何获得ReaderT () IO (Either String (Maybe Int))
。等
请勿忘记您已被允许使用MaybeT
,ReaderT
和EitherT
数据构建器!
如果你还没有尝试GHC的打击的洞,那将是一个很好的时机。