将嵌套类型转换为monad转换器堆栈

时间:2016-03-27 01:31:15

标签: haskell nested monads monad-transformers

我在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(虽然我从未见过它在除了困惑之外的任何地方使用过)。

1 个答案:

答案 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)) 。等

请勿忘记您已被允许使用MaybeTReaderTEitherT数据构建器!

如果你还没有尝试GHC的打击的洞,那将是一个很好的时机。