为表达式提供类型

csS*_*ent -1 haskell types

所以我被要求"为以下每个表达式提供可能的类型(不涉及任何类型变量)(或者解释为什么你认为表达式是错误的类型)"并且我正在努力表达 [ [], [[]], [[[]]], [[[[]]]], [[[[[ ]]]]] ].

当我:t *the above expression*输入ghci它告诉我它有类型[[[[[[a]]]]]].我很困惑表达甚至在说什么以及它为什么给我这种类型.

:t [ [True], [[]], [[[]]], [[[[]]]], [[[[[]]]]] ]给出了一个错误,我不知道为什么它是病态的.我认为第一个答案将帮助我理解为什么第二个表达式失败.

ass*_*.jc 7

要理解表达式为什么[ [], [[]], [[[]]], [[[[]]]], [[[[[ ]]]]] ]有类型[[[[[[a]]]]]],你需要先了解它的类型[].

实际上,[]相当于[a'],哪里a'是没有任何约束的类型变量.这意味着a'可以是任何类型.所以,当构建一个列表,比如,[ [], [[]] ],它是合法的,以取代a'[a]如下:

[ [], [[]] ] ~ [ [a'] [[a]] ] ~ [ [[a]], [[a]] ] ~ [ [[a]] ]
Run Code Online (Sandbox Code Playgroud)

同样的道理

[ [], [[]], [[[]]], [[[[]]]], [[[[[ ]]]]] ] ~  [ [[[[[a]]]]] ]
Run Code Online (Sandbox Code Playgroud)

但是,当您构建列表时,即使可以是任何类型的列表[ [True], [[]] ],也无法转换True[a]列表.同样的原因[ [True], [[]], [[[]]], [[[[]]]], [[[[[]]]]] ]是非法的.