Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔成语';选择性';地图_Haskell_Map - Fatal编程技术网

Haskell 哈斯克尔成语';选择性';地图

Haskell 哈斯克尔成语';选择性';地图,haskell,map,Haskell,Map,假设一个人想要对一个集合进行映射,但仅当映射后的值满足某些条件时才收集映射函数的结果。我目前正在这样做: func = foldl (\acc x, -> (maybeGrab x):acc) [] maybeGrab a | a > 5 = [someFunc a] | otherwise = [] 虽然这是可行的,但我相信有一种更惯用的“正确/常见/更容易识别”的方法可以做到这一点 嗯。这看起来绝对是一个褶皱很好的地方。那么: func = foldl (

假设一个人想要对一个集合进行
映射
,但仅当映射后的值满足某些条件时才收集映射函数的结果。我目前正在这样做:

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


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

虽然这是可行的,但我相信有一种更惯用的“正确/常见/更容易识别”的方法可以做到这一点

嗯。这看起来绝对是一个褶皱很好的地方。那么:

func = foldl (\acc x -> let a = g x in if a > 5 then a:acc else acc) []
这里
g
是您试图映射列表的函数

我想不出有哪一个函数能够在不折叠的情况下将贴图和过滤器自然地结合起来

[编辑]

哦,显然有一张地图。以前从没用过。我被纠正了。哈,一直在学习

 mapMaybe :: (a -> Maybe b) -> [a] -> [b]
也许是从数据上看的,也许这个包看起来很有用。文件说:

mapMaybe函数是map的一个版本,它可以抛出元素。特别是,函数参数返回类型可能为b的内容。如果这算不上什么,则不会将任何元素添加到结果列表中。如果它只是b,那么b包含在结果列表中


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

func = map someFunc . filter (>5)
这也可以很好地表示为列表理解

func xs = [someFunc x | x <- xs, x > 5]
func xs=[someFunc x | x 5]

过滤器不能满足您的需要吗?或者mapMaybe来自数据。也许?@JeffFoster:
mapMaybe
是正确的答案。你应该把它作为答案贴出来,这样我们就可以投票了。是的,杰夫是对的。接下来的答案有我的投票权。顺便说一句,你也可以使用concatMap而不是那种时髦的折叠(在maybeGrab可以在成功的情况下产生多个结果的情况下特别有用)Eek
foldl
!您刚刚失去了流式处理此列表的能力。好吧,foldl和foldr之间没有比这更好的了。如果他正在处理一个大的非无限列表,他将使用foldl'减少空间开销。但是,如果你提到他正在流媒体或处理无限列表,foldr将是他唯一能做到的方法。不。
foldl'
中的空间开销是θ(输出列表)。
foldr
的空间开销为O(输出列表)
foldl'
在返回之前执行整个计算,
foldr
继承其用户的计算结构<代码>foldl'在输出类型不是平坦的情况下是一个失败者,就像在本例中一样。我不确定你是如何得到这些大的o/theta的。例如,Foldl'将在常量空间中的整数列表上求和。Foldr将根据列表的大小生成更大的thunk。我认为我们都是对的,这只是fold函数在第一个、第二个或两个参数中是否懒惰,以及第一个参数的whnf是否减少的问题,我认为我们已经超出了OP的问题范围,应该在其他地方找到场地继续这个车队。如果所需的过滤器取决于生成的值,您当然可以颠倒顺序:
filter cond。映射someFunc