给出表达式的类型

时间:2019-01-24 04:35:48

标签: haskell types

因此,我被要求“为每种类型提供可能的类型(不涉及任何类型变量) 以下表达式(或解释为什么您认为 表达式输入错误)” 我正在努力表达 [ [], [[]], [[[]]], [[[[]]]], [[[[[ ]]]]] ]

当我将:t *the above expression*放入ghci时,它告诉我它的类型为[[[[[[a]]]]]]。我很困惑这个表情在说什么,为什么它给了我这种类型。

:t [ [True], [[]], [[[]]], [[[[]]]], [[[[[]]]]] ]给出了一个错误,我也不知道为什么它的打字错误。我认为第一个答案可以帮助我理解第二个表达式为何失败。

2 个答案:

答案 0 :(得分:7)

要了解为什么表达式[ [], [[]], [[[]]], [[[[]]]], [[[[[ ]]]]] ]具有类型[[[[[[a]]]]]],需要首先了解[]的类型。

实际上,[]等效于[a'],其中a'是类型变量,没有任何约束。这意味着a'可以是任何类型。因此,当构造一个列表,例如[ [], [[]] ]时,将a'替换为[a]是合法的:

[ [], [[]] ] ~ [ [a'] [[a]] ] ~ [ [[a]], [[a]] ] ~ [ [[a]] ]

相同的原因

[ [], [[]], [[[]]], [[[[]]]], [[[[[ ]]]]] ] ~  [ [[[[[a]]]]] ]

但是,当您将列表构造为[ [True], [[]] ]时,即使True可以是任何类型的列表,也无法将[a]转换为列表。 [ [True], [[]], [[[]]], [[[[]]]], [[[[[]]]]] ]非法的相同原因。

答案 1 :(得分:3)

您具有值[ [], [[]], [[[]]], [[[[]]]], [[[[[ ]]]]] ],它是嵌套列表的列表。

  • 最右边的值是最受限制的:我们知道此列表必须嵌套的深度。
  • 最左边的值受约束最少:它只是一个空列表,因此可以是任何东西的列表。

如果将最小约束类型应用于每个约束,则得到:

[
  [        ] -- [    a    ]
, [[      ]] -- [[   b   ]]
, [[[    ]]] -- [[[  c  ]]]
, [[[[  ]]]] -- [[[[ d ]]]]
, [[[[[]]]]] -- [[[[[e]]]]]
]

列表必须具有同质类型,因此我们将其统一。如果我们尝试统一前两种类型,[a][[b]],我们会看到a[b],所以我们现在有:

[
  [  ] -- [[b]]
, [[]] -- [[b]]
, ...
]

如果我们继续进行此过程直到[[[[d]]]][[[[[e]]]]],我们会看到d[e],因此最终得到:

[
  [        ] -- [[[[[e]]]]]
, [[      ]] -- [[[[[e]]]]]
, [[[    ]]] -- [[[[[e]]]]]
, [[[[  ]]]] -- [[[[[e]]]]]
, [[[[[]]]]] -- [[[[[e]]]]]
]

最后,整个列表的类型为[[[[[[e]]]]]]

这是因为第一个元素是任何内容的空列表,第二个元素是具有任何内容的空列表的单元素列表,依此类推。您可以无限地重复此过程,嵌套的单例列表以一个空列表结尾,您的类型为[[...[a]...]]

因此,既然您知道在引入自己的类型之前必须有多少层嵌套(通过替换e),您应该能够了解为什么[ [True], [[]], [[[]]], [[[[]]]], [[[[[]]]]] ]无效,但是[ [], [[]], [[[]]], [[[[]]]], [[[[[True]]]]] ]是。