用于检查列表长度是否大于给定数字的函数在输入无限列表作为参数时进入无限循环

A function for checking if a list's length is larger than a given number gets into an infinite loop when entering an infinite list as a parameter

我有以下功能:

longer x y | y < 0 = True
           | length x > y = True
           | length x <= y = False

其中 x 是类型 [a]y 是类型 Int

此函数适用于有限列表,但在我输入无限列表时不计算并进入无限循环。我还应该尝试其他什么方法?

我的尝试:

longer [1..] 10的情况下,我会从第一个值开始,将列表的长度(所以[1])与10进行比较,如果长度较小,则继续前两个值,将列表的(所以 [1,2])长度与 10 进行比较,看到该语句仍然是错误的,继续前三个值等。我认为递归可能是解决这个问题的正确方法我的。

你看,如果一个列表被传递给一个函数,它可以有两种形状,要么是空的

length [] y = undefined

或者它由一个值和列表的其余部分组成

length (x:xs) y = undefined

只有这两种情况,因为列表数据类型是这样定义的:

Prelude> :info []
data [] a = [] | a : [a]    -- Defined in `GHC.Types'

因此,您已经通过将原始问题分成两个较小的部分取得了进展。您可能能够实现第一种情况(空列表)。但是请注意,您在第二种情况下也取得了进展。虽然之前您对原始列表 x(最好命名为 xs)一无所知,但您现在知道原始列表的形状为 x : xs。这里 x 是列表的第一项,xs 是剩余的列表。特别是您现在知道,传递的列表至少是 1 的大小。无论剩余列表 xs 是什么,这都是正确的。您现在可以实施了吗

length (x:_) 0 = undefined

如果是这样,那么 y 不为零的情况呢:

length (x:xs) y = undefined

你能问一个关于 xsy 而不是 x:xsy 的新问题吗?请记住,您知道 xsx : xs.

短一项