为什么这两个有相同的类型?
ghci> :k [Int]
[Int] :: *
ghci> :k [Int -> Int]
[Int -> Int] :: *
编辑每@ Gabriel Gonzalez很有帮助的评论。
我不太了解 kinds
,因此我没有良好的基础来期望上述类型在 kind
上有所不同。
最佳答案
好吧,让我们检查一下。
Int :: *
[] :: * -> *
因此,当您将 Int
类型应用于 []
类型构造函数时:
[] Int :: *
这只是另一种(合法的)书写方式
[Int] :: *
好吧,这个很容易理解。
Int :: *
(->) :: * -> * -> *
[] :: * -> *
(->) Int :: * -> *
(->) Int Int :: *
与以下内容相同
Int -> Int :: *
因此,根据与上述相同的推理,
[Int -> Int] :: *
但这里有一个 secret ..仔细看看 []
的类型。
[] :: * -> *
这意味着将任何类型放入非 *
类型的列表中都会产生编译错误。当您确实向它提供某种*
时,结果将始终具有某种*
。
您的困惑来自于没有将级别分开。很多很多不同的类型都有相同的类型。毕竟,kind *
或多或少意味着“这种类型可以有值”。 (有一些小的异常(exception),但它们是低级内部的东西,你必须非常努力才能看到。)如果你可以有一个类型的值,那么很有可能该类型具有 kind *
.
关于haskell - Int 列表与 Int -> Int 列表相比,类型相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983642/