List 将空列表与[(a,b)]Haskell进行比较

List 将空列表与[(a,b)]Haskell进行比较,list,haskell,boolean,tuples,List,Haskell,Boolean,Tuples,我对Haskell中的列表是如何工作的有点困惑。 我知道[]是类型为[a]的空列表。有没有办法定义类型为[(a,b)]的空列表 例如,我知道null[1]=[]将为我们提供True null[(1,2)]=[]给了我一个不匹配的类型错误,这就是我所假设的 我想知道是否可以说null[(1,2)]==[(,)]会给我们True我会像下面这样声明我的列表: let myList = [] :: [(Integer, Integer)] 然后myList将具有类型:t myList将产生myList

我对Haskell中的列表是如何工作的有点困惑。 我知道
[]
是类型为[a]的空列表。有没有办法定义类型为[(a,b)]的空列表

例如,我知道
null[1]=[]
将为我们提供
True

null[(1,2)]=[]
给了我一个不匹配的类型错误,这就是我所假设的


我想知道是否可以说
null[(1,2)]==[(,)]
会给我们
True

我会像下面这样声明我的列表:

let myList = [] :: [(Integer, Integer)]
然后
myList
将具有类型
:t myList
将产生
myList::[(整数,整数)]

当计算
null myList
时,它会产生
True

是否有方法定义类型为
[(a,b)]
的空列表

只需
[]
。实际上,
[]
是一个空列表,但是元素的类型是免费的。它具有类型
[a]
,但是
a
可以与
(b,c)
相同,因此具有两种不同类型的2元组

例如,我知道
null[1]=[]
将为我们提供
True

是一个函数,它接受
fa
(在本例中为
[a]
),并返回
Bool
。它检查列表是否为空。它不生成列表

我知道
[]
是一个类型为
[a]

是的,但是理解“type
[a]
”的实际含义很重要。实际上,它意味着所有a的类型
。[a] 
,也就是说,这不是某个特定类型“a”的元素列表,而是给定类型
a
的任何选择,它是该类型的列表。特别是,它也可以是元组类型的列表。因此,
null
与任何其他类型的列表一样适用于元组列表

要在这样的元组列表中实际看到
null
,只需提供一个。例如,
null[(1,2)]
将其用于元组列表。但是在空列表的情况下,列表中没有可以约束类型的内容。它可能是从上下文中清楚的,如

Prelude> [null l | l <- [ [], [(1,2)], [(1,3)] ]]
[True,False,False]

每种类型的列表都表示为
[]
。如果要指定类型,可以使用签名(
[]:[(a,b)]
),但编译器通常可以从上下文推断类型:

λ> [] == [(1, 'x')]
False

null[1]=[]
是一个类型错误。是的,
让{xs=tail[(未定义,未定义)]}进入null xs
λ> [] == [(1, 'x')]
False