【问题标题】:why is the type of [ ( True , [ ] ) , ( False , [ ['a'] ] ) ] , "[ (Bool , [ [char] ] )]"?为什么是 [ ( True , [ ] ) , ( False , [ ['a'] ] ) ] , "[ (Bool , [ [char] ] )]" 的类型?
【发布时间】:2019-12-24 18:31:53
【问题描述】:

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

【问题讨论】:

  • 空列表的类型为[] :: [a],因为另一个列表是[['a']],它知道a ~ [Char]
  • 它绝对不会将空列表和[[Char]] 视为相同。但是,它将空列表视为[[Char]] 类型的值——为什么不应该这样做?
  • [] 又名Empty 是一种 重载类型构造函数,就像NothingMaybe a 一样。它可以属于携带类型变量的多种类型。

标签: haskell type-inference


【解决方案1】:

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

因此我们正在寻找一个类型[(True,[]),(False, [['a']])]。我们看到元素是一个二元组,第一个元素是Bool,第二个元素是一个空列表,所以它的类型为[] :: [a]a,当时未知。

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

【讨论】:

  • @Rahat 是的,完全正确。 (这就是答案中a ~ [Char] 的含义——您可以将~ 视为等式;语言创建者只选择~ 而不是=,因为= 在语法中已经有很多用途.)
  • 如果我说“这里有两扇门,它们后面都有相同的东西”然后我打开第二扇门,给你看一只猫,你能告诉我第一扇门后面是什么吗?这就是编译器在这里所​​做的。
  • 干杯,非常感谢您的帮助。祝大家圣诞快乐。
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 2022-07-16
  • 2022-07-05
  • 1970-01-01
  • 2013-06-27
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多