函数应用程序作为标识Monad:它是如何成为Monad类型类的实例?

jhe*_*dus 2 monads haskell

我正在阅读"功能编程工艺"(第2版),其中第404页简要提到功能应用程序也是Monad,作者称之为Monad身份.

但是我很难想象如何将函数应用程序作为Haskell中类型类Monad的实例,与Maybe数据结构成为Monad类型类的实例相同.

这也引出了另一个问题:函数应用程序如何成为类型构造函数(与Maybe相同)?

有人可以对这个谜团有所了解吗?

nim*_*ish 8

函数应用程序本身不是monad,它是Identity monad中的绑定.

newtype Identity a = Identity { runIdentity :: a }
instance Monad Identity where
    return = Identity
    (Identity a) >>= f = f a -- :: Identity a -> (a -> Identity b) -> Identity b
    join (Identity (Identity a)) = Identity a
    fmap f (Identity a) = Identity $ f a
Run Code Online (Sandbox Code Playgroud)

因此,如果您将所有函数和值提升到标识monad中,您可以使用do-notation,它只是围绕普通函数应用程序进行大量记账.

您不应该将此与Monad实例混淆,因为该类型(->) a与读者Monad同构:newtype Reader a b = Reader { runReader :: a -> b }.

  • 我有点困惑:不应该`(身份a)>> = f`只是`fa`,而不是`Identity $ fa`?(而且,你正在混合变量名称`x`和`a`.) (2认同)