假设有人想要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包含在结果列表中.
就个人而言,我会分两个阶段来做:首先,消除你不关心的值,然后映射.
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)
| 归档时间: |
|
| 查看次数: |
483 次 |
| 最近记录: |