monad是什么类型的数据结构?

时间:2016-01-06 05:19:34

标签: haskell data-structures compilation monads functor

我对monad是什么(一个为有用的计算构建提供上下文的参数化类型),为什么它存在(所以你可以做需要上下文的事情,比如IO),如何使用它(将返回的变量与>>=绑定),并非常粗略地理解它在类别理论中的适用范围(保证函数上下文同质性的类别)**。

然而,就基础数据结构而言,monad是什么?由于它与一个applicative functor(看起来像一个列表)相关,我的猜测是GHC获取monad的内容并将它们放入某种链接列表中,并在整个计算过程中传递它们。

引擎盖下真的发生了什么?

**如果你更了解,请随时纠正这些问题。

2 个答案:

答案 0 :(得分:10)

Monad不是数据结构 - 它是一个属性。

您可以定义一类具有默认值的数据类型(例如[]列表,0表示IntFalse表示Bool和等等)。我们称这个班为Defaultable。然后你假设默认整数是0,从而证明整数的类型是Defaultable。 <{1}}以同样的方式Bool

另一个例子是Defaultable类(Haskell中的ToStringable):如果有一个函数从Show开始,则类型为ToStringableStringIntBool,因为您可以编写函数

ToStringable

(如果intToString :: Int -> String boolToString :: Bool -> String [a]

,则ToStringable类型的列表有意义a

同样,列表的类型是monad:您可以定义两个操作(遵守某些定律)ToStringablereturn,从而证明列表的类型形成一个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。