我已经阅读了很多有关类型,高级类型等等的有趣内容。默认情况下,Haskell支持两种类型:
*
* → *
最新的GHC语言扩展ConstraintKinds增加了一种新的类型:
Constraint
同样在阅读this mailing list后,很明显可能存在另一种类型,但GHC不支持它(但这种支持是在.NET中实现的):
#
我已经了解了polymorphic kinds,我想我理解这个想法。 Haskell也支持明确的量化。
所以我的问题是:
subkinding
是什么意思?它在哪里实施/有用?kinds
之上是否存在类型系统,kinds
是types
之上的类型系统? (只是感兴趣)答案 0 :(得分:14)
是的,存在其他类型。页面Intermediate Types描述了GHC中使用的其他类型(包括未装箱类型和一些更复杂的类型)。 Ωmega语言将更高级的类型转换为最大逻辑扩展,允许用户可定义的类型(和排序,以及更高)。 This page为GHC提出了一种类型的系统扩展,它允许Haskell中用户可定义的类型,以及它们为什么有用的一个很好的例子。
作为一个简短的摘录,假设你想要一个列表类型,它具有列表长度的类型级注释,如下所示:
data Zero
data Succ n
data List :: * -> * -> * where
Nil :: List a Zero
Cons :: a -> List a n -> List a (Succ n)
目的是最后一个类型参数应该只是Zero
或Succ n
,其中n
只是Zero
或Succ n
。简而言之,您需要引入一种名为Nat
的新类型,它只包含两种类型Zero
和Succ n
。然后List
数据类型可以表示最后一个参数不是*
,而是Nat
,如
data List :: * -> Nat -> * where
Nil :: List a Zero
Cons :: a -> List a n -> List a (Succ n)
这将使类型检查器在接受的内容中更具辨别力,并使类型级编程更具表现力。
答案 1 :(得分:10)
正如类型按种类分类,种类按类别分类。
Ωmega programming language在任何级别都有一个用户可定义种类的系统。 (所以说它的wiki。我认为它指的是上面的种类和级别,但我不确定。)
答案 2 :(得分:10)
有人建议将类型提升到类型级别,将值提升到类型级别。但我不知道这是否已经实施(或者它是否会达到“黄金时间”)
请考虑以下代码:
data Z
data S a
data Vec (a :: *) (b :: *) where
VNil :: Vec Z a
VCons :: a -> Vec l a -> Vec (S l) a
这是一个Vector,它的维度在类型中编码。我们使用Z和S来生成自然数。这有点不错但我们不能“打字检查”如果我们在生成Vec时使用正确的类型(我们可能会意外地切换内容类型的长度)并且我们还需要生成类型S和Z,如果我们已经很不方便像这样定义了自然数:
data Nat = Z | S Nat
根据提案,你可以这样写:
data Nat = Z | S Nat
data Vec (a :: Nat) (b :: *) where
VNil :: Vec Z a
VCons :: a -> Vec l a -> Vec (S l) a
如果需要,这会将Nat提升到类型级别,将S和Z提升到类型级别。所以Nat是另一种,与*一样生活在同一水平。
这是Brent Yorgey的演讲