为什么使用“<-”会导致正确计算幂集?

Tar*_*ing 1 monads haskell

所以我的书给出了以下计算幂集的代码:

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)

直觉上,我猜测这filterMb返回每个可能排列的方式应用列表。那是x:ysys。但我只是没有看到它发生在哪里。


好像我误会<-了作业。它被翻译成对 (>>=) (bind) 的调用。但我不明白这将如何导致b.

Tar*_*ing 6

我的错误是将其解释<-为直接分配。这是错误的。b <- p x>>=操作员处理,其中:

本质上,每个<-都生成一组值,这些值被传递到 monadic 计算的其余部分。

作为这种代替b正在[True,False]被instatiated与TrueFalse在计算的剩余部分的每个迭代。导致有效if True then x:ys else ysif False then x:ys else ys

  • 的确。列表单子的目的是对不确定性进行建模。您可以将“do”构造视为“分叉”为多个并行组合,其中每个分支中的“b”具有与“px”不同的值。每个分支的结果都隐式连接回单个列表。 (4认同)