使用 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
.
我正在尝试创建一个空列表,然后确认它是空的,以便稍后可以将元素插入其中。
我试图简单地将函数分配给一个空列表,但是当我试图确认它是空的时,我得到了函数异常中的非详尽模式。
这是我目前的情况。
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
.