在理查德艾森伯格的talk关于他对依赖Haskell的levity多态性的研究中,他清楚地表明这种判断/类型是合理的:
type Star = (* :: (* :: (* :: *)))
这是否意味着打字判断本身有*
种?或者更灵活,因为*
可能的*
或来自(* :: *)
的返回... (目前我不确定)。
考虑到这个假设(* :: *) :: *
,这也意味着这种类型也是关联的:
type Star = (((* :: *) :: *) :: *)
我认为不正确。有人可以帮我澄清一下吗?
答案 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中编写一个表达式来反映一个值的类型判断,但如果是,它的类型肯定不会是*
。