繁体   English   中英

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

[英]Compare a null list with [(a,b)] Haskell

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

例如我知道null [1] == []会给我们True

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

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

我知道[]是一个空列表,类型为[a]

是的,但是理解“type [a] ”的真正含义很重要。 实际上它的意思是输入forall a. [a] 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)]的空列表?

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

例如我知道null [1] == []会给我们True

null:: Foldable f => fa -> Bool是一个 function 接受一个fa (在这种情况下是一个[a] ),并返回一个Bool 检查列表是否为空。 不会生成列表。

我会像下面这样声明我的清单:

let myList = [] :: [(Integer, Integer)]

那么myList将具有类型:t myList将产生myList:: [(Integer, Integer)]

在评估null myList时,它产生True

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM