为什么这两种都有相同的类型?
ghci> :k [Int]
[Int] :: *
ghci> :k [Int -> Int]
[Int -> Int] :: *
Run Code Online (Sandbox Code Playgroud)
编辑 @ Gabriel Gonzalez的有用评论.
我不太了解kinds,所以我没有很好的基础来期待上述类型的变化kind.
好吧,我们来看看吧.
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)
这意味着将任何类型放入不合适的列表中是一个编译错误*.当你确实提供了类似的东西时*,结果总会很好*.
你的困惑来自于不保持水平分离.许多不同类型都有相同的类型.毕竟,善意*或多或少意味着"这种类型可以有价值".(有一些小的例外,但它们是低级别的内部事物,你必须努力工作.)如果你可以有一个类型的值,这是一个非常好的赌注,该类型有类型*.