【发布时间】:2017-11-02 07:44:28
【问题描述】:
我有一个相当基本的问题,关于与无限列表进行比较。问题类似这样:
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]]
我想检查我的号码是否在该列表中?或者有什么替代方法可以得到这个计算的结果?
【问题讨论】:
-
您知道您的列表将始终按递增顺序排列吗?
-
通常你无法知道一个列表是否是无限的,因为这会解决Halting问题。但是,在这种情况下,您可以知道这一点,因为列表严格增加。
-
此外,
[prod | k <- [1..], let prod = product [1..k]]等同于[product [1..k] | k <- [1..]] -
…等价于
scanl1 (*) [1..]! -
是的,列表将始终按升序排列。而且实际的计算更复杂(乘素数)。
标签: haskell functional-programming