[英]Haskell: concat a list of tuples with an element and a list: [(a,[b])] -> [(a,b)]
[英]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.