哈斯克尔。它为什么有效? (对Monad的迭代)

时间:2015-12-09 12:52:17

标签: haskell io-monad

JOIN

我跑:

liftMM :: Monad m => (a -> b) -> m a -> m b
liftMM f m = m >>= \a -> return (f a)

我得到了输出:

> liftMM (*2) [1..10]

我无法看到此函数如何映射所有列表的值?没有任何递归或迭代,只有一个monad内部m值传递给函数f。我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

m此处[]liftMM的工作方式是委托(>>=)return m的实施。因此,您需要了解(>>=)return列表,如果您查看它们是definition

instance Monad []  where
    xs >>= f            = [y | x <- xs, y <- f x]
    return x            = [x]

因此,源列表>>=中的每个元素都应用f,然后将返回列表的每个元素插入到结果列表中。

return x只返回包含x的单例列表,因此return (f a)会返回列表[f a]。然后,每个单个元素列表由(>>=)组合以创建输出列表。

答案 1 :(得分:0)

列表是liftMM :: Monad m => (a -> b) -> m a -> m b,因此给出了地图的签名:

[]

和liftMM的签名

m

liftMMmap

这意味着列表的 ScannedRobotEventScan()执行相同的操作。