如何获取前n项并继续进行递归?

时间:2016-11-24 15:09:37

标签: haskell

我想实现这样的目标:

f :: [Int] -> [Int]
f (x@[_,_,_,_]:xs) = g x : f xs

g :: [Int] -> Int
g = ...

所以我想把列表中的前四个项目计算出来,然后对剩下的项目做同样的事情,创建一个新的计算值列表。它就像是地图和我想的组合。哈斯克尔有这样的东西吗?

我知道我可以这样做:

map g . chunksOf 4

我只是觉得它看起来会更多" haskelly"用递归

1 个答案:

答案 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]。当然,这不是特别漂亮,而是使用takedropsplitAt代替它可能会更方便(如果你真的想做自己的递归,那就是)。

  

我只是觉得它看起来会更多" haskelly"用递归

我不同意这一点。我说它在Haskell中通常更倾向于使用和组合现有的标准库函数,而不是编写自己的递归函数。