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

时间:2019-10-07 11:54:13

标签: list haskell boolean tuples

我对Haskell中列表的工作方式有些困惑。 我知道compile "org.apache.flink:flink-java:$flinkVersion" compile "org.apache.flink:flink-clients_2.11:$flinkVersion" compile 'org.apache.hadoop:hadoop-hdfs:$hadoopVersion' compile 'org.apache.hadoop:hadoop-client:$hadoopVersion' 是类型为[a]的空列表。有没有办法定义类型为[(a,b)]的空列表?

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

True给了我我不正确的类型错误。

我想知道是否有可能像null [(1,2)] == []这样的话会给我们null [(1,2)] == [(,)]

4 个答案:

答案 0 :(得分:7)

  

我知道[]是类型为[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

答案 1 :(得分:5)

  

有没有一种方法可以定义类型为[(a,b)]的空列表?

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

  

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

null :: Foldable f => f a -> Bool是一个接受f a(在本例中为[a])并返回<Bool 的函数。它检查列表是否为空。它不会生成列表。

答案 2 :(得分:2)

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

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

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

评估null myList时得出True

答案 3 :(得分:0)

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

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