打字判断有一种吗?

时间:2016-03-14 23:02:42

标签: haskell types polymorphism dependent-type type-kinds

在理查德艾森伯格的talk关于他对依赖Haskell的levity多态性的研究中,他清楚地表明这种判断/类型是合理的:

type Star = (* :: (* :: (* :: *)))

这是否意味着打字判断本身有*种?或者更灵活,因为* 可能* 来自(* :: *)的返回... (目前我不确定)。

考虑到这个假设(* :: *) :: *,这也意味着这种类型也是关联的:

type Star = (((* :: *) :: *) :: *)

我认为不正确。有人可以帮我澄清一下吗?

2 个答案:

答案 0 :(得分:11)

没有。我认为你误解了发生的事情。类型级别的::类似于值::。考虑:

three :: Int
three = 3 :: (Int :: *)

这只是3 :: Int,只是3。已经在Haskell +亲切的签名中,您已经能够写出:(((Int :: *) :: *) :: *)Int相同。或者在简单的Haskell 2010中,(((3 :: Int) :: Int) :: Int)。之前,你被限制在你能走多远的地方"权利相关的"因为种类没有种类。公理* :: *改变了这一点。

::意味着它一直意味着什么。我不会将::视为"返回"一些东西。它只是一种允许向类型检查器提供信息的语法,但在其他方面无关紧要。如果你真的,真的希望将它视为某种运算符,它的行为就像const,尽管很难写下它的"类型"会的。

答案 1 :(得分:8)

这不是打字判断,而是类型归属。通常,表达式foo :: bar具有值foo和类型bar(前提是类型检查器可以判断这是合理的)。直接后果是,foo :: bar类型*是不正确的,除非bar(语义上)等于*。到目前为止,我不知道在Haskell或GHC中编写一个表达式来反映一个值的类型判断,但如果是,它的类型肯定不会是*