Haskell迭代(不是字面意思)在列表上

时间:2014-11-28 16:57:22

标签: loops haskell functional-programming

我知道我应该忘记在函数式语言中进行迭代,但我不知道如何提出我的问题。

如果我有一个以升序或降序排列的整数列表,并且我有一个可能存在或不存在于列表中的任意数字,我如何循环列表以查找小于该列表的数字给定数字并返回该整数。

我只需要知道如何去做。

3 个答案:

答案 0 :(得分:2)

您可以使用find查找与您指定的谓词匹配的第一个元素。例如:

find even [3,5,7,6,2,3,4]

或者,您可以从左侧删除所有不需要的元素:

dropWhile (not . even) [3,5,7,6,2,3,4]

(并且可能保留第一个元素,必须是偶数)。

或者,您可以过滤掉不需要的元素

filter even [3,5,7,6,2,3,4]

或者,您可以使用递归并自行编码。

答案 1 :(得分:0)

您可以使用模式匹配递归解构列表:

searchList :: Int -> [Int] -> ???
searchList n [] = ??? 
searchList n (x:xs) = ???

您检查x是否是您想要的号码,如果不是,您可以拨打searchList n xs来搜索列表的其余部分。

执行类似操作的常规方法是使用库函数foldr,但最好先了解如何使用递归执行此操作。

答案 2 :(得分:0)

您可以通过使用折叠在列表迭代中使用“状态” - 状态在函数参数中从一次迭代传递到下一次迭代。

一个例子:

sup :: [Int] -> Int -> Int
sup xs y = go (head xs) xs
  where
    go s [] = s
    go s (x:xs) = if x >= y then s else go x xs

此处s是“州” - 它是列表中的最新值,小于y

因为您说输入列表永远不会为空,head xs在这里没问题。

这几乎就是你想要的。也许你可以修改它来处理你的所有条件。