因此,我被要求“为每种类型提供可能的类型(不涉及任何类型变量)
以下表达式(或解释为什么您认为
表达式输入错误)”
我正在努力表达
[ [], [[]], [[[]]], [[[[]]]], [[[[[ ]]]]] ]
。
当我将:t *the above expression*
放入ghci时,它告诉我它的类型为[[[[[[a]]]]]]
。我很困惑这个表情在说什么,为什么它给了我这种类型。
也:t [ [True], [[]], [[[]]], [[[[]]]], [[[[[]]]]] ]
给出了一个错误,我也不知道为什么它的打字错误。我认为第一个答案可以帮助我理解第二个表达式为何失败。
答案 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]]]]] ]
是。