use*_*464 1 haskell functional-programming
关于与无限列表进行比较,我有一个相当基本的问题.问题类似于:
25 `elem` [x^2 | x <- [1..]]
Run Code Online (Sandbox Code Playgroud)
显然这是true.但是,我如何处理不在列表中的值,例如
26 `elem` [x^2 | x <- [1..]]
Run Code Online (Sandbox Code Playgroud)
因为它是一个无限的列表,Haskell没有这个答案,虽然看起来很明显,一旦我们过了6 ^ 2我们再也达不到26,所以我想停在那里.
现在我可以限制x像:
[x^2 | x <- [1..6]]
Run Code Online (Sandbox Code Playgroud)
简单.
但是我在这样的例子中做了什么:
[prod | k <- [1..], let prod = product [1..k]]
Run Code Online (Sandbox Code Playgroud)
我想检查一下我的号码是否在该列表中?或者,什么是获得此计算结果的替代方法?
该数据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
Run Code Online (Sandbox Code Playgroud)
如果您的列表按递增顺序排列,您可以找到至少与您要查找的元素,并单独检查它是否相同:
> let elemIncreasing x l = find (>= x) l == Just x
> let factorials = scanl1 (*) [1..]
> 120 `elemIncreasing` factorials
True
> 121 `elemIncreasing` factorials
False
Run Code Online (Sandbox Code Playgroud)