所以我的书给出了以下计算幂集的代码:
filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]
filterM p [] = return []
filterM p (x:xs) = do b <- p x
ys <- filterM p xs
return (if b then x:ys else ys)
filterM (\x -> [True,False]) [1,2,3]
Run Code Online (Sandbox Code Playgroud)
结果:
[[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[]]
我只是不知道p(being [True,False])的结果如何用于return (if b then x:ys else ys)
直觉上,我猜测这filterM以b返回每个可能排列的方式应用列表。那是x:ys和ys。但我只是没有看到它发生在哪里。
好像我误会<-了作业。它被翻译成对 (>>=) (bind) 的调用。但我不明白这将如何导致b.
我的错误是将其解释<-为直接分配。这是错误的。b <- p x由>>=操作员处理,其中:
作为这种代替b正在[True,False]被instatiated与True和False在计算的剩余部分的每个迭代。导致有效if True then x:ys else ys和if False then x:ys else ys。