ghc wiki,未来功能和类型列表

时间:2013-01-24 06:18:31

标签: haskell ghc

当我看到这个非常有趣的例子时,我正在浏览GHC wiki on TypeNats的部分。他们正在创建类型列表:

type family Get (n :: Nat1) (xs :: [*]) :: *
type instance Get Zero     (x `: xs) = x
type instance Get (Succ n) (x `: xs) = Get n xs

我想了解更多相关信息。我假设这个功能没有在7.6.1中实现(至少它不能为我编译),并且浏览门票证明是非常压倒性的。知道我应该寻找什么吗?

1 个答案:

答案 0 :(得分:5)

这段代码在GHC 7.6中运行良好,几乎 - 你需要打开一些扩展,并使用'而不是`(显然语法已经改变了?)。这个例子编译:

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}

data Nat1 = Zero | Succ Nat1

type family Get (n :: Nat1) (xs :: [*]) :: *
type instance Get Zero     (x ': xs) = x
type instance Get (Succ n) (x ': xs) = Get n xs

如果您只关心类型列表而不是这些TypeNats,您可能会发现这样的示例更有用:

data HList :: [*] -> * where
  HNil :: List '[]
  HCons :: t -> List ts -> List (t ': ts)

如上所述here。最相关的GHC扩展名为DataKinds,最相关的论文可能是Giving Haskell a Promotion