为什么是 [ ( True , [ ] ) , ( False , [ ['a'] ] ) ] , "[ (Bool , [ [char] ] )]" 的类型?

Rah*_*hat 3 haskell type-inference

当我输入:type [(True,[]),(False, [['a']])] , "[(Bool,[[char]])]"ghci 时,它会输出[ (Bool , [ [char] ] )]. Haskell 的类型推断怎么可能将空列表和 [[char]] 视为相同的。

Wil*_*sem 9

Haskell 知道TrueFalseBools,而且我们知道列表的所有元素都具有相同的类型。

因此,我们正在寻找一种类型[(True,[]),(False, [['a']])]。我们看到,这是一个2元组作为第一元素的元素Bool,并作为第二个项目有一个空的列表,以便有型[] :: [a]a,在那个时候,未知。

现在,如果我们查看第二项,并查看(False, [['a']]). 因此,这是一个 2 元组,False作为第一项,[['a']]作为第二项。'a'is的类型Char,因此['a']有 type [Char],并且[['a']]有 type [[Char]]。由于列表的元素应该具有相同的类型,因此我们推导出a第一项的类型参数是a ~ [Char],因此外部列表具有类型[(True,[]),(False, [['a']])] :: [(Bool, [[Char]])]

  • 如果我说“这里有两扇门,后面都有相同的东西”,然后我打开第二扇门,给你看一只猫,你能告诉我第一扇门后面是什么吗?这就是编译器在这里所​​做的事情。 (4认同)
  • @Rahat 是的,完全正确。(这就是答案中`a ~ [Char]`的含义——你可以将`~`读作等式;语言创建者只选择了`~`而不是`=`,因为`=`已经有这么多在语法中使用。) (3认同)