使用 Ord 创建和比较空列表

Using Ord to create and compare empty lists

我正在尝试创建一个空列表,然后确认它是空的,以便稍后可以将元素插入其中。

我试图简单地将函数分配给一个空列表,但是当我试图确认它是空的时,我得到了函数异常中的非详尽模式。

这是我目前的情况。

emptyList::Ord a => [(a,b)]
emptyList = []

isEmpty::Ord a => [(a,b)] -> Bool
isEmpty[(a,b)] = null [undefined, undefined]

我想得到类似的东西 isEmpty emptyList True 我想我的问题是,如何根据给定类型确认列表为空?

我认为您混淆了类型 ([(a,b)]) 和模式。在你的 isEmpty 函数中,你写:

isEmpty::Ord a => [(a,b)] -> Bool
isEmpty <b>[(a,b)]</b> = null [undefined, undefined]

但这并不意味着您要匹配 类型 [(a,b)] 的列表。你已经在你的类型签名中说过了。第二行的 [(a,b)] 表示您定义了一个模式。该模式表示您只匹配包含 恰好 一个元素的列表:一个 2 元组,a 该元组的第一项,b该元组的第二项。

如果您随后向它传递一个空列表,或者一个包含两个或更多元素的列表,则模式将不匹配,因此会引发错误。

如果你想匹配任何列表,你可以简单地使用一个变量:

isEmpty :: Ord a => [(a,b)] -> Bool
isEmpty <b>ls</b> = null <b>ls</b>

此处 isEmpty 因此将使用该变量调用 null。我们可以在这里执行 η-reduction,并写成:

isEmpty :: Ord a => [(a,b)] -> Bool
isEmpty = null

完全没有必要将我们限制为仅包含 2 元组的列表,其中这些元组的第一项的类型是 Ord 类型类的成员,但是,我们可以让这个使用任何列表。所以我们可以将类型概括为:

isEmpty :: <b>[a]</b> -> Bool
isEmpty = null

事实上 null 可以操作任何 Foldable,因为它的类型是 null :: Foldable f => f a -> Bool.

鉴于上述函数定义,无需实现您自己的 isEmpty,您只需调用 null emptyList.