Haskell成语为“选择性”地图

时间:2011-10-23 19:27:57

标签: haskell map

假设有人希望map超过集合,但只有在映射的值满足特定条件时才收集映射函数的结果。我目前正在这样做:

func = foldl (\acc x, ->  (maybeGrab x):acc) []


maybeGrab a
    | a > 5 = [someFunc a]
    | otherwise = []

虽然这有效,但我确信有一种更为惯用的“正确/普通/更易识别”的方法。

3 个答案:

答案 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。以前没用过。我纠正了。哈,一直在学习。