小编xin*_*978的帖子

了解filterM

考虑

filterM (\x -> [True, False]) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

我无法理解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)
Run Code Online (Sandbox Code Playgroud)

有了这个用例,p应该是lambda函数(\x -> [True, False]),而第一个x应该是1.那flg <- p x回报是什么?flg每次递归的值究竟是什么?

monads haskell

14
推荐指数
1
解决办法
2137
查看次数

标签 统计

haskell ×1

monads ×1