我对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)] == [(,)]
答案 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