有没有办法判断Haskell中的列表是否无限?原因是我不想将函数length应用于无限列表.
这个最近的问题让我想到了Haskell使用无限列表的能力.有大量 的 其他问题,并约在计算器上无限列表答案,我明白了为什么我们不能对所有无限列表的通用解决方案,但为什么不能哈斯克尔推理一些无限列表?
让我们使用第一个链接问题中的示例:
list1 = [1..]
list2 = [x | x <- list1, x <= 4]
print list2
$ [1,2,3,4
Run Code Online (Sandbox Code Playgroud)
@ user2297560在评论中写道:
假装你是GHCI.您的用户会为您提供无限列表,并要求您查找该列表中小于或等于4的所有值.您将如何进行此操作?(请记住,您不知道列表是否有序.)
在这种情况下,用户没有给你一个无限的列表.GHC产生了它!实际上,它是按照自己的规则生成的.该哈斯克尔2010标准规定如下:
enumFrom :: a -> [a] -- [n..]
Run Code Online (Sandbox Code Playgroud)
对于Int和Integer类型,枚举函数具有以下含义:
- 序列enumFrom
e1是列表[e1,e1+ 1,e1+ 2,...].
在他对另一个问题的回答中,@ chepner写道:
你知道列表是单调递增的,但Haskell没有.
这些用户所做的陈述似乎与我的标准不符.Haskell使用单调增加以有序的方式创建了列表.Haskell 应该知道列表是有序的和单调的.那么为什么不能将这个无限列表自动[x | x <- list1, x <= 4]转化takeWhile (<= 4) list1呢?