我想实现这样的目标:
f :: [Int] -> [Int]
f (x@[_,_,_,_]:xs) = g x : f xs
g :: [Int] -> Int
g = ...
所以我想把列表中的前四个项目计算出来,然后对剩下的项目做同样的事情,创建一个新的计算值列表。它就像是地图和我想的组合。哈斯克尔有这样的东西吗?
我知道我可以这样做:
map g . chunksOf 4
我只是觉得它看起来会更多" haskelly"用递归
答案 0 :(得分:6)
p1 : p2
匹配且其尾部匹配p1
,则 p2
是匹配非空列表的模式。 [p1, p2, p3, p4]
是一种模式,如果其元素分别与p1,p2,p3和p4匹配,则匹配四元素列表。因此,[_, _, _, _]:xs
匹配非空列表,如果其第一个元素是四元素列表。由于f
采用整数列表而不是列表列表,因此此模式会导致函数中出现类型错误。
您想要的是x1 : x2 : x3 : x4 : xs
然后where x = [x1, x2, x3, x4]
。当然,这不是特别漂亮,而是使用take
和drop
或splitAt
代替它可能会更方便(如果你真的想做自己的递归,那就是)。
我只是觉得它看起来会更多" haskelly"用递归
我不同意这一点。我说它在Haskell中通常更倾向于使用和组合现有的标准库函数,而不是编写自己的递归函数。