我正在阅读"功能编程工艺"(第2版),其中第404页简要提到功能应用程序也是Monad,作者称之为Monad身份.
但是我很难想象如何将函数应用程序作为Haskell中类型类Monad的实例,与Maybe数据结构成为Monad类型类的实例相同.
这也引出了另一个问题:函数应用程序如何成为类型构造函数(与Maybe相同)?
有人可以对这个谜团有所了解吗?
函数应用程序本身不是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 }.