首页 > 解决方案 > 为无限列表 Haskell 定义一个函数

问题描述

我正在尝试编写 longer :: [a] -> Int -> Bool 决定提供的列表是否比参数长的函数。到目前为止,我写道:

longer :: [a] -> Int -> Bool
hossz (x:xs) = length (x:xs)
hossz [] = 0
longer [] _ = False
longer (x:xs) y | y<0 = error ("negative parameter")
                    | hossz(x:xs)>y = True
                    | otherwise = False

在我为它提供一个无限列表(例如,更长的 [1..] 10 )之前,这一切都工作得很好而且很花哨,它会卡在某种无限循环中并且无法完成运行。所以问题是,有没有一种方法可以定义它,如果它得到一个无限列表,它只会返回 True 并且不会尝试计算整个事情?先感谢您

标签: haskell

解决方案


length正在尝试计算列表的长度,这对于无限列表需要很长时间。

不过,您根本不需要计算长度。您只需要使用较小的整数在尾部递归。当整数达到 0 时,列表要么为空,要么不为空;它有多长并不重要。

longer :: [a] -> Int -> Bool
longer _ n | n < 0 = True
longer xs 0 = ...
longer [] n = False  -- n > 0
longer (x:xs) n = longer xs (n - 1)

推荐阅读