Haskell成语为"选择性"地图

pro*_*nce 5 haskell map

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

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


maybeGrab a
    | a > 5 = [someFunc a]
    | otherwise = []
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*ter 10

 mapMaybe :: (a -> Maybe b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

来自Data.Maybe包的mapMaybe看起来就像它完成了这项工作.文件说:

mapMaybe函数是一个可以抛出元素的map版本.特别是,函数参数返回Maybe b类型的东西.如果这是Nothing,则不会在结果列表中添加任何元素.如果只是b,则b包含在结果列表中.


Dan*_*ner 5

就个人而言,我会分两个阶段来做:首先,消除你不关心的值,然后映射.

func = map someFunc . filter (>5)
Run Code Online (Sandbox Code Playgroud)

这也可以很好地表达为列表理解.

func xs = [someFunc x | x <- xs, x > 5]
Run Code Online (Sandbox Code Playgroud)