打字判断有种类吗?

Do typing judgements have a kind?

在 Richard Eisenberg 的 talk 中,他对从属 Haskell 的轻度多态性进行了研究,他清楚地表明这种判断/类型是合理的:

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

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

鉴于此假设,(* :: *) :: *,这也意味着此类型也将是关联的:

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

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

没有。我认为你误解了正在发生的事情。 :: 在类型级别就像 :: 在值级别。考虑:

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

这就是 3 :: Int 这就是 3。在 Haskell + kind 签名中,您已经能够编写:(((Int :: *) :: *) :: *)Int 相同。或者简单地说 Haskell 2010,(((3 :: Int) :: Int) :: Int)。以前,您只能在 "right associated" 方式中走多远,因为种类本身没有种类。公理 * :: * 改变了这一点。

:: 意味着它总是意味着什么。我不会将 :: 视为 "returns" 某物的运算符。它只是一段允许向类型检查器提供信息的语法,但在其他方面无关紧要。如果你真的,真的想把它看作某种运算符,它的行为会像const,尽管很难写下它的"type"会是什么是。

这不是类型判断,而是类型归属。一般来说,表达式 foo :: bar 的值是 foo,类型是 bar(前提是类型检查器可以做出正确的判断)。作为直接结果,说 foo :: bar 具有类型 * 是完全错误的,除非 bar(语义上)等于 *。据我所知,在 Haskell 或 GHC 中不可能编写一个表达式来将类型判断反映到一个值中,但如果是的话,它的类型肯定也不会是 *.