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)
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)
您可以使用相同的想法来编写lengthIsAtLeast和lengthIsAtMost变体.
编辑时:我主要回答你标题中的问题,而不是你特定例子的具体细节(ErikR的回答非常好).
length列表上的许多函数(例如它自身)仅对有限列表有意义.如果您正在编写的函数仅对有限列表有意义,请在文档中明确说明(如果不明显).由于暂停问题无法解决,因此无法执行限制.根本没有算法提前确定是否理解
takeWhile f [1..]
Run Code Online (Sandbox Code Playgroud)
(其中f是整数的谓词)产生有限或无限列表.
| 归档时间: |
|
| 查看次数: |
254 次 |
| 最近记录: |