与Int - > Int列表相比,Int列表的相同种类?

Kev*_*ith 4 haskell

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

ghci> :k [Int]
[Int] :: *
ghci> :k [Int -> Int]
[Int -> Int] :: *
Run Code Online (Sandbox Code Playgroud)

编辑 @ Gabriel Gonzalez的有用评论.

我不太了解kinds,所以我没有很好的基础来期待上述类型的变化kind.

Car*_*arl 9

好吧,我们来看看吧.

Int :: *
[] :: * -> *
Run Code Online (Sandbox Code Playgroud)

因此,当您将Int类型应用于[]类型构造函数时:

[] Int :: *
Run Code Online (Sandbox Code Playgroud)

这只是另一种(合法的)写作方式

[Int] :: *
Run Code Online (Sandbox Code Playgroud)

好的,那一个非常容易.

Int :: *
(->) :: * -> * -> *
[] :: * -> *

(->) Int :: * -> *
(->) Int Int :: *
Run Code Online (Sandbox Code Playgroud)

哪个是一样的

Int -> Int :: *
Run Code Online (Sandbox Code Playgroud)

因此,通过与上述相同的推理,

[Int -> Int] :: *
Run Code Online (Sandbox Code Playgroud)

但这是一个秘密.仔细看看那种[].

[] :: * -> *
Run Code Online (Sandbox Code Playgroud)

这意味着将任何类型放入不合适的列表中是一个编译错误*.当你确实提供了类似的东西时*,结果总会很好*.

你的困惑来自于不保持水平分离.许多不同类型都有相同的类型.毕竟,善意*或多或少意味着"这种类型可以有价值".(有一些小的例外,但它们是低级别的内部事物,你必须努力工作.)如果你可以有一个类型的值,这是一个非常好的赌注,该类型有类型*.