有没有办法判断Haskell中的列表是否无限?原因是我不想将函数length应用于无限列表.
可能重复:
如何判断列表是否无限?
例如,在Haskell中,您可以定义无限列表[1..].Haskell中是否有内置函数来识别列表是否具有有限长度?我不认为可以编写用户提供的函数来执行此操作,但Haskell的列表的内部表示可能能够支持它.如果没有标准的Haskell,是否有提供这种功能的扩展?
直觉上,我希望"数学"答案all (==1) [1,1..]是True因为列表中只包含1的所有元素都等于1.但我理解"计算上",评估无限列表以检查事实上,每个元素实际上等于1将永远不会终止,因此表达式将"评估"到底部或?.
我发现这个结果反直觉而且有点令人不安.我认为列表无限的这个事实在数学上和计算上都会混淆这个问题,我很乐意听到在这个领域有一些见解和经验的人
我的问题是,哪个是数学上最正确的答案??还是True?关于为什么一个答案比另一个答案更正确的一些详细说明也将受到高度赞赏.
编辑:这可能间接地与库里 - 霍华德同构(程序是证明和类型是定理)和哥德尔的不完备性定理有关.如果我没记错的话,其中一个不完备性定理可以(非常粗略地)总结为"足够强大的形式系统(如数学或编程语言)无法证明所有可以在系统中表达的真实陈述"
math computer-science haskell data-structures infinite-recursion
我有以下代码实现了Eratosthenes的Sieve:
primes :: [Int]
primes = primes' [2..]
primes' :: [Int] -> [Int]
primes' [] = []
primes' (p:ps) = p:(primes' [p' | p' <- ps, not (p' `isMultiple` p)])
a `isMultiple` b = (a `mod` b) == 0
main = print (sum (primes' [2..100000]))
Run Code Online (Sandbox Code Playgroud)
我想把主要改成类似的东西
main = print (sum [p | p <- primes, p < 100000]))
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,这会挂起,因为它必须将p与无限列表素数的每个元素进行比较.既然我知道素数正在递增,那么当我找到一个超过我上限的元素时,如何截断无限列表呢?
ps理论上,primes'过滤输入列表以返回素数列表.我知道如果我以2以外的其他内容开始列表会有一些问题.我仍然在努力解决这个问题,所以请不要破坏它.谢谢 ;-)
我是Haskell的新手,并试图了解一些事情.如果我执行以下操作,我会收到一个问题:
list1 = [1..]
list2 = [x | x <- list1, x <= 4]
print list2
Run Code Online (Sandbox Code Playgroud)
返回[1,2,3,4.它上面没有末端括号,因此就好像列表正在加载或冻结.以下是它的外观:
Prelude> print list2
[1,2,3,4
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?