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