为什么[(True,[]),(False,[['a']])],“ [(Bool,[[char]])]]”类型?

时间:2019-12-24 18:31:53

标签: haskell type-inference

当我在ghci中键入:type [(True,[]),(False, [['a']])] , "[(Bool,[[char]])]"时,它会输出[ (Bool , [ [char] ] )]。 Haskell的类型推断如何将空列表和[[char]]视为相同。

1 个答案:

答案 0 :(得分:9)

Haskell知道TrueFalseBool,此外,我们知道列表中的所有元素都具有相同的类型。

因此,我们正在寻找类型[(True,[]),(False, [['a']])]。我们看到该元素是一个2元组,第一个元素为Bool,第二个元素为空列表,因此类型为[] :: [a]a,位于那个时候,未知。

现在,如果我们看第二项,并看到(False, [['a']])。因此,这是一个2元组,其中False作为第一项,[['a']]作为第二项。 'a'的类型为Char,因此['a']的类型为[Char],而[['a']]的类型为[[Char]]。由于列表的元素应具有相同的类型,因此我们得出第一项的a类型参数为a ~ [Char],因此外部列表的类型为[(True,[]),(False, [['a']])] :: [(Bool, [[Char]])]。 / p>