我对monad是什么(一个为有用的计算构建提供上下文的参数化类型),为什么它存在(所以你可以做需要上下文的事情,比如IO),如何使用它(bind返回)变量与>>=
),并且非常粗略地理解它在类别理论中的适用范围(保证函数上下文同质性的类别)**.
然而,就基础数据结构而言,monad是什么?因为它与一个applicative functor(看起来像一个列表)有关,我的猜测是GHC获取monad的内容并将它们放入某种链接列表中,并在整个计算过程中传递它们.
引擎盖下真的发生了什么?
**如果您了解更多,请随时纠正这些问题.
Monad不是一个数据结构 - 它是一个属性.
您可以定义一类具有某些默认值的数据类型(例如[]
列表,0
for Int
,False
for Bool
等).我们叫这个班Defaultable
.然后你假设默认整数是0
,从而证明整数的类型是Defaultable
.Bool
是以Defaultable
同样的方式.
另一个例子是ToStringable
类(Show
在Haskell中):一个类型是ToStringable
如果有一个函数从它到String
.Int
和Bool
是ToStringable
的,因为你可以编写功能
intToString :: Int -> String boolToString :: Bool -> String
(如果是,则列表类型[a]
有意义)ToStringable
a
ToStringable
同样,列表的类型是一个单子:你可以定义两种操作(即服从某些法律)return
和(>>=)
,从而证明了列表的类型形成一个单子.那就是:如果你可以定义两个操作
return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b
对于一些具体的m
,那么这m
是一个monad.所以Monad
是一个类和类非常提醒OOP中的接口.
在内部,它只是字典传递.
monad可能是也可能不是数据结构.为了将一些数据结构直觉变成monad,你一定要阅读Dan Piponi的博客文章Monads are Trees with Grafting.
最无聊的数据结构monad是一个functor上的免费monad,
data Free f a = Pure a | Free (f (Free a)) instance Functor f => Monad (Free f) where ...
既然你提到了列表,你应该看一下可操作的monad和密度monad.