【发布时间】:2012-10-14 22:54:11
【问题描述】:
我有一个简单的函数,它返回一个列表中相邻元素的对列表。
adjacents :: [a] -> [(a,a)]
adjacents (x:y:xs) = [(x,y)] ++ adjacents (y:xs)
adjacents (x:xs) = []
我在尝试使用 foldr 写入相邻时遇到问题。我已经做了一些研究,但似乎没有任何提示。怎么办?
【问题讨论】:
-
用zip写,或者看看zip是怎么实现的。
-
(x,y) : adjacents (y:xs)比[(x,y)] ++ adjacents (y:xs)好,Marcin 说的对,zip 好:zip xs (tail xs)清晰干净。 -
折叠(以及
map和filter)是基本的递归方案——它们在每个步骤中只查看一个元素。正如 AndrewC 所示,您必须将输入“加倍”才能一次看到两个元素。有一个递归方案可以用来避免输入加倍——paramorphism。Para像折叠一样遍历输入,但也让您在递归步骤中查看“输入的其余部分”。不幸的是,para不在 Prelude 或 Data.List 中。
标签: haskell recursion functional-programming fold higher-order-functions