【发布时间】:2019-05-30 07:55:37
【问题描述】:
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 的所有元素上成功时才有效。在某种程度上,我首先想使用p 上的模式匹配过滤s。自然地,我尝试研究这个问题,但我找不到不使用列表理解或 LambdaCase 的解决方案。
【问题讨论】:
-
[expr | p <- s]与map (\p -> expr) s相同。不过,不要将此作为答案,因为我不完全确定这是您要寻找的。span> -
同样,只有当
p在模式匹配中对s的所有元素都成功时,这才是正确的。 -
我不知道它会这样做 - 我认为它会失败并出现异常!再说一次,我不经常使用推导式,所以我错了一点也不奇怪。
-
@bradrn 严格来说它们并不相同,因为列表推导会默默地忽略模式匹配失败。报告给出desugaring rules for list comprehensions。
-
相信相当于
let { ok p = [expr]; ok _ = [] } in concatMap ok s。
标签: haskell functional-programming list-comprehension