有没有办法分离无限和有限列表?

ais*_*ais 8 haskell list infinite

例如,我正在为列表编写一些函数,我想使用长度函数

foo :: [a] -> Bool
foo xs = length xs == 100
Run Code Online (Sandbox Code Playgroud)

有人能理解这个函数是否可以与无限列表一起使用?

或者我应该总是考虑无限列表并使用这样的东西

foo :: [a] -> Bool
foo xs = length (take 101 xs) == 100
Run Code Online (Sandbox Code Playgroud)

而不是直接使用长度?

如果haskell将具有FiniteList类型,那么长度和foo将是什么

length :: FiniteList a -> Int
foo :: FiniteList a -> Bool
Run Code Online (Sandbox Code Playgroud)

Eri*_*ikR 9

length遍历整个列表,但要确定列表是否具有特定长度,n您只需要查看第一个n元素.

你的使用想法take会起作用.或者你可以写一个lengthIs这样的函数:

-- assume n >= 0
lengthIs 0 [] = True
lengthIs 0 _  = False
lengthIs n [] = False
lengthIs n (x:xs) = lengthIs (n-1) xs
Run Code Online (Sandbox Code Playgroud)

您可以使用相同的想法来编写lengthIsAtLeastlengthIsAtMost变体.

  • 那么 - 你想要一个无限列表的"长度"返回什么? (3认同)
  • 你可以在Haskell中定义一个`FiniteList`类型 - 例如`Vector a`可能适用于你的用例.实际上,你在Python,Perl,Ruby等语言中看到的列表最好用Haskell中的`Vector a`建模.列表可以是无限的在Haskell中非常有用,并且当您了解有关Haskell的更多信息时,您将了解何时列表是合适的以及何时应该使用不同的数据结构. (2认同)

Joh*_*man 5

编辑时:我主要回答你标题中的问题,而不是你特定例子的具体细节(ErikR的回答非常好).

length列表上的许多函数(例如它自身)仅对有限列表有意义.如果您正在编写的函数仅对有限列表有意义,请在文档中明确说明(如果不明显).由于暂停问题无法解决,因此无法执行限制.根本没有算法提前确定是否理解

takeWhile f [1..]
Run Code Online (Sandbox Code Playgroud)

(其中f是整数的谓词)产生有限或无限列表.

  • 好点子!但是有一种方法可以将"绝对有限"和"可能无限"的列表分开. (2认同)