【发布时间】:2015-03-05 07:36:47
【问题描述】:
考虑
filterM (\x -> [True, False]) [1, 2, 3]
我无法理解 Haskell 对这个 filterM 用例的神奇之处。该函数的源代码如下:
filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
filterM _ [] = return []
filterM p (x:xs) = do
flg <- p x
ys <- filterM p xs
return (if flg then x:ys else ys)
在这个用例中,p 应该是 lambda 函数 (\x -> [True, False]),第一个 x 应该是 1。那么flg <- p x 返回什么?每次递归时flg 的值究竟是多少?
【问题讨论】:
-
这个问题非常相似:stackoverflow.com/questions/25476248/powerset-function-1-liner,但它并没有过多关注
filterM的主体,所以我认为它不是完全重复的。 -
filterM (\x->[True,False]) xs大致意思是:对于xs的每个元素,不确定地取它还是丢弃它。结果应该是xs的所有子列表的列表(长度为2 ^ length xs)。