haskell - Int 列表与 Int -> Int 列表相比,类型相同吗?

标签 haskell

为什么这两个有相同的类型?

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/

相关文章:

C# Continuation Monad 实现

haskell - Haskell 中组合的参数数量

haskell - 即使不再使用旧向量,是否也会创建新向量?

haskell - 输入安全的相等元组大小。

haskell - 为什么 GHC 认为类型变量对于具有默认实现的类是不明确的?

Haskell servant 组合api实现

haskell - 是否有预定义的方法来跳过导致 Nothing 的计算?

string - Haskell 读取文件 : Couldn't match expected type ‘[String]’ with actual type ‘IO String’

haskell - 在类和实例声明中键入关键字

haskell - 在 Haskell CIS194 第 2 周练习 2 中使用匿名函数