假设有人希望map
超过集合,但只有在映射的值满足特定条件时才收集映射函数的结果。我目前正在这样做:
func = foldl (\acc x, -> (maybeGrab x):acc) []
maybeGrab a
| a > 5 = [someFunc a]
| otherwise = []
虽然这有效,但我确信有一种更为惯用的“正确/普通/更易识别”的方法。
答案 0 :(得分:10)
mapMaybe :: (a -> Maybe b) -> [a] -> [b]
来自Data.Maybe包的mapMaybe看起来就像它完成了这项工作。文档说:
mapMaybe函数是一个可以抛出元素的map版本。特别是,函数参数返回Maybe b类型的东西。如果这是Nothing,则不会在结果列表中添加任何元素。如果只是b,则b包含在结果列表中。
答案 1 :(得分:5)
就个人而言,我会分两个阶段来做:首先,消除你不关心的值,然后映射。
func = map someFunc . filter (>5)
这也可以很好地表达为列表理解。
func xs = [someFunc x | x <- xs, x > 5]
答案 2 :(得分:0)
嗯。这绝对是一个折叠很好的地方。怎么样:
func = foldl (\acc x -> let a = g x in if a > 5 then a:acc else acc) []
此处g
是您尝试在列表上映射的功能。
我无法想到任何本地组合地图和过滤而不折叠的功能。
[编辑]
哦,显然有一张mapMaybe。以前没用过。我纠正了。哈,一直在学习。