代码之家  ›  专栏  ›  技术社区  ›  paul

返回多个单子

  •  1
  • paul  · 技术社区  · 6 年前

    我正在阅读Haskell中的一些代码,我无法理解并找到一个解释,说明如果一个函数返回一个IO(无论是什么),那么在此之前它可以有其他类型。

    这个函数可以很清楚的返回一个IO Maybe

    但是下一个来自斯科蒂图书馆的可能会返回一个IO文本的monad Action??? 我的心要爆炸了!

    1 回复  |  直到 6 年前
        1
  •  6
  •   Paul Johnson    6 年前

    Haskell中的类型构造函数有自己的“kind”系统,您可以将其视为类型的类型系统。这些种类本身没有名字;相反,它们只是代表恒星。所以:

    Integer :: *
    IO :: * -> *
    

    这个 ActionT type constructor 在斯科蒂有三个论点

    ActionT :: * -> (* -> *) -> * -> *
    

    类型包括:

    • Text .

    • 一个“内部”monad,当然它必须是一个类型构造函数本身接受一个参数。如果你试图通过 因为这个参数GHC将报告一个“种类错误”。在这种情况下,内部单子是 IO .

    • 行动 是monad,因此在本例中,您所讨论的函数返回 Maybe User 就像你的第一个例子一样。

    行动

    要了解更多信息,请研究 . 例如,其中一个是

     (Monad m, ScottyError e) => Monad (ActionT e m)
    

    m 是monad和 e ScottyError 然后 ActionT e m Monad typeclass知道它的参数必须是 * -> * 行动 真的有善良的 *->*