takeWhile,lambdas和模式匹配

时间:2013-11-26 02:27:50

标签: list haskell

我对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))>错误。

2 个答案:

答案 0 :(得分:1)

我认为更容易将您的问题分解为多个步骤,尝试使用超级智能过滤功能同时解决所有问题。

  1. 从列表[a0 ... an]
  2. 开始
  3. 使用zip
  4. 将其转换为[[a0,a1] ...(a_n-1,an)]对的列表
  5. 使用takeWhile(或filter过滤有趣的对,具体取决于您要执行的操作。)
  6. 使用map
  7. 将好的对列表重新转换为仅包含第一个数字的列表

    不要担心性能或产生浪费的中间列表。由于懒惰的评估,一切都应该按需有效创建。

答案 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]