我对Haskell中的列表的工作方式有些困惑。我知道这[]
是类型为[a]的空列表。有没有办法定义类型为[(a,b)]的空列表?
例如,我知道这null [1] == []
会给我们True
null [(1,2)] == []
给了我我所假设的类型不匹配的错误。
我想知道是否可以说类似的话null [(1,2)] == [(,)]
会给我们True
我知道这
[]
是带有类型的空列表[a]
是的,但是了解“类型[a]
”的实际含义很重要。实际上,它的意思是type forall a . [a]
,即,这不是某个特定类型“ a”的元素的列表,而是给定类型的任何选择a
,而是该类型的列表。特别地,它也可以是元组类型的列表。因此,null
对元组列表和任何其他类型的列表一样有效。
要实际查看null
此类元组列表的实际操作,您只需提供一个即可。例如,null [(1,2)]
将其用于元组列表。但是,如果列表为空,则列表中没有内容会限制类型。从上下文中可能很清楚,例如
Prelude> [null l | l <- [ [], [(1,2)], [(1,3)] ]] [True,False,False]
或者您可以使用签名明确指定
Prelude> null ([] :: [(String, Double)]) True
有没有一种方法可以定义类型为空的列表
[(a,b)]
?
简单地说[]
。确实[]
是一个空列表,但是元素的类型是自由的。它具有type [a]
,但a
可以(b, c)
与具有两个不同类型的2元组相同。
例如,我知道这
null [1] == []
会给我们True
null :: Foldable f => f a -> Bool
是一个函数,该函数采用f a
(在这种情况下为[a]
)并返回Bool
。它检查列表是否为空。它并没有产生一个列表。