我有一个相当基本的问题,关于与无限列表进行比较。问题类似于:
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]]
我想查看我的号码是否在该列表中?或者什么是获得此计算结果的替代方法?
答案 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 (>)
我在打电话,所以我没有测试过。它应该原则上工作,但编译器可能有一些问题。我确信它们可以修复。