我对Haskell很新,还在努力学习绳索。我的问题是: 我试图将所有数字添加到列表中的数字之后小于某个数字。在更正式的意义上,我如何使用列表的子列表作为我的过滤布尔函数的参数? 例如:我们有列表[a0,a1,a2,...],如何从列表中取出a_n + a_(n + 1)< c(其中c只是一些数字)?
最终我将使用它来创建一个函数的根近似序列。目前我有一个无限的近似列表(因为我不知道在哪里停止),我想把所有的近似值都推到一个具有一些容忍误差的近似值。近似值p_n的误差作为p_n,p_(n-1),p_(n-2)的函数给出。让我们调用这个函数f。理想情况下,我希望继续从列表中获取元素 f(p_(n),p_(n-1),p_(n-2))>错误。
答案 0 :(得分:1)
我认为更容易将您的问题分解为多个步骤,尝试使用超级智能过滤功能同时解决所有问题。
zip
takeWhile
(或filter
过滤有趣的对,具体取决于您要执行的操作。)map
不要担心性能或产生浪费的中间列表。由于懒惰的评估,一切都应该按需有效创建。
答案 1 :(得分:1)
您要编写的函数的签名如下所示
takeLessThan :: (Num a, Ord a) => a -> [a] -> [a]
takeLessThan bound xs = ...
您可以通过使用自身尾部压缩列表来提取每对列表。
pairs :: [b] -> [(b, b)]
pairs xs = zip xs (tail xs)
所以列表[1,2,3,4,5]
的对将给你一个元组(一个 n ,一个 n + 1 )。
[(1,2),(2,3),(3,4),(4,5)]
从那里,您可以使用Prelude中的filter
函数根据函数(a -> Bool)
选择所需的元素。
filter :: (a -> Bool) -> [a] -> [a]