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

Loops 列表上的Haskell迭代(不是字面意思),loops,haskell,functional-programming,Loops,Haskell,Functional Programming,我知道我应该忘记函数式语言中的迭代,但我不知道如何提出我的问题 如果我有一个按升序或降序排列的整数列表,并且列表中可能存在或不存在任意数字,那么我如何在列表上循环找到一个小于给定数字的数字并返回该整数 我只需要知道如何去做。您可以使用模式匹配递归地解构列表: searchList :: Int -> [Int] -> ??? searchList n [] = ??? searchList n (x:xs) = ??? 您可以检查x是否是您想要的号码,如果不是,您可以调用sear

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

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


我只需要知道如何去做。

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

searchList :: Int -> [Int] -> ???
searchList n [] = ??? 
searchList n (x:xs) = ???
您可以检查x是否是您想要的号码,如果不是,您可以调用
searchList n xs
搜索列表的其余部分

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

通过使用折叠,可以在列表迭代中拥有“状态”——状态在函数参数中从一个迭代传递到下一个迭代

例如:

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
的最新值

因为您说过输入列表永远不会是空的,
headxs
在这里是可以的


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

您可以使用
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]

或者,您可以使用递归并自己编写所有代码。

对您有用吗?您可以像往常一样进行递归。@user5402否,
elem
不执行OP要求的操作。显示您的一些尝试。要返回列表中不大于输入数字的最大数字,
last。takeWhile(我认为指出您还可以匹配多个元素,并且可以使用guards
searchList n(x:y:xs)|