首页 > 解决方案 > 如何使用 map 和 filter 实现列表理解?

问题描述

两者mapfilter都可以使用列表推导来实现:

map f xs    = [f x | x <- xs]
filter p xs = [x | x <- xs, p x] 

我想用下面的例子表明反过来也成立:

[expr | p <- s]

我到目前为止:

map (\p -> expr) s

但这仅在与p的所有元素上的模式匹配成功时才有效s。在某种程度上,我首先想sp. 自然地,我尝试研究这个问题,但我找不到不使用列表理解或 LambdaCase 的解决方案。

标签: haskellfunctional-programminglist-comprehension

解决方案


但这仅在与p的所有元素上的模式匹配成功时才有效s

map确实:您描述的模式匹配行为通常不能filter单独实现。用这样的术语表达推导仅在具有单个生成器和不会失败的模式的推导的简单情况下才能很好地工作。相反,列表推导式在 Haskell 报告中以concatMap. 特别是,关于生成器的条款涵盖了模式匹配失败的可能性:

--This is pseudo-Haskell; see the Report for the fine print.
[  e | p <- l,  Q ] = let ok p = [  e | Q ]
                          ok _ = []
                          in concatMap ok l

匹配失败的处理对应于faillist monad do-blocks 的脱糖处理。


推荐阅读