检查项目是否在无限列表中

时间:2017-11-01 22:55:46

标签: haskell functional-programming

我有一个相当基本的问题,关于与无限列表进行比较。问题类似于:

25 `elem` [x^2 | x <- [1..]]

显然这是true。 但是,如何处理不在列表中的值,例如

26 `elem` [x^2 | x <- [1..]]

因为它是一个无限的列表,Haskell对此没有答案,虽然看起来很明显,一旦我们过了6 ^ 2,我们就不能再达到26了,所以我想在那里停下来。

现在我可以将x限制为:

[x^2 | x <- [1..6]]

易。

但我在这样的例子中做了什么:

[prod | k <- [1..], let prod = product [1..k]]

我想查看我的号码是否在该列表中?或者什么是获得此计算结果的替代方法?

3 个答案:

答案 0 :(得分:8)

data-ordlist包有许多用于处理排序列表的实用程序函数,包括member

Data.List.Ordered> 25 `member` [n^2 | n <- [1..]]
True
Data.List.Ordered> 26 `member` [n^2 | n <- [1..]]
False
Data.List.Ordered> 24 `member` [product [1..k] | k <- [1..]]
True
Data.List.Ordered> 25 `member` [product [1..k] | k <- [1..]]
False

答案 1 :(得分:7)

如果您的列表按递增顺序排列,您可以find一个至少是您要查找的元素,并单独检查它是否相同:

> let elemIncreasing x l = find (>= x) l == Just x
> let factorials = scanl1 (*) [1..]
> 120 `elemIncreasing` factorials
True
> 121 `elemIncreasing` factorials
False

答案 2 :(得分:4)

假设我们有一些订单&lt;我们知道,对于我们感兴趣的列表,我们有一个

sortedElem _ _ [] = False
sortedElem (<) y (x:xs) | y == x = True
                        | x < y  = False
                        | True   = sortedElem (<) y xs

你可以定义特殊情况,例如

elemIncreasing = sortedElem (<)
elemDecreasing = sortedElem (>)

我在打电话,所以我没有测试过。它应该原则上工作,但编译器可能有一些问题。我确信它们可以修复。