为什么:k [False]导致GHCI出错?

Ana*_*Ana 12 haskell data-kinds

我对下面会话结束时收到的错误感到困惑:

$ ghci
GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
Ok, modules loaded: Main.
*Main> :set -XDataKinds

*Main> :t [False, True]
[False, True] :: [Bool]

*Main> :t [False]
[False] :: [Bool]

*Main> :k [False, True]
[False, True] :: [Bool]

*Main> :k [False]

<interactive>:1:2:
    Expected kind ‘*’, but ‘False’ has kind ‘Bool’
    In a type in a GHCi command: [False]
Run Code Online (Sandbox Code Playgroud)

为什么错误?


未来的实验揭示:

*Main> :k [Int]
[Int] :: *

*Main> :k [Int, Int]
[Int, Int] :: [*]
Run Code Online (Sandbox Code Playgroud)

[Int]可以有人居住的价值,所以它是善良的*,但它也是有意义的[*].


更多数据点:

*Main> :k []
[] :: * -> *

*Main> :k [Bool]
[Bool] :: *
Run Code Online (Sandbox Code Playgroud)

And*_*ács 11

如果你有只有一个元素的类型级别列表,GHC认为它不是一个提升列表,而是一个应用于某种类型的常规列表类型构造函数*.

您应该在列表前面加上撇号,以明确选择提升列表:

> :k '[False]
'[False] :: [Bool]
Run Code Online (Sandbox Code Playgroud)

与空列表类似:

> :k '[]
'[] :: [k]
Run Code Online (Sandbox Code Playgroud)

  • 特别是`[False]`被解析为`类型[] ::* - >*应用于类型False :: Bool`,有一种不匹配 - `[]`期望一个`*`给出观察到的"善意的错误". (2认同)