haskell - 如何使用 map 和 filter 实现列表理解?
问题描述
两者map
和filter
都可以使用列表推导来实现:
map f xs = [f x | x <- xs]
filter p xs = [x | x <- xs, p x]
我想用下面的例子表明反过来也成立:
[expr | p <- s]
我到目前为止:
map (\p -> expr) s
但这仅在与p
的所有元素上的模式匹配成功时才有效s
。在某种程度上,我首先想s
在p
. 自然地,我尝试研究这个问题,但我找不到不使用列表理解或 LambdaCase 的解决方案。
解决方案
但这仅在与
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
匹配失败的处理对应于fail
list monad do-blocks 的脱糖处理。
推荐阅读
- r - 如何从 R 中的列表中提取子元素旁边的元素?
- android - 带有空响应正文的 Twitter oauth/request_token 200 代码
- c++ - 将接口对象传递给构造函数c++?
- android - 单击 CheckBox 时更新 RecyclerView 数据
- python - 从另一个 list-python 以特定顺序创建一个列表
- ios - 间谍无法启动。无法选择开发者身份(证书)
- javascript - 在日期选择器中突出显示禁用日
- android - 无法解决:构建 gradle 时出现 transition-1.2.0 错误
- python - 在 python pandas 中创建一个日期向量
- bash - 更改 maven settings.xml 位置并自动传递 -s