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

Mik*_*cki 1 haskell ghc

当我看到这个非常有趣的例子时,我正在浏览关于TypeNatsGHC维基部分.他们正在创建类型列表:

type family Get (n :: Nat1) (xs :: [*]) :: *
type instance Get Zero     (x `: xs) = x
type instance Get (Succ n) (x `: xs) = Get n xs
Run Code Online (Sandbox Code Playgroud)

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

sha*_*haf 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
Run Code Online (Sandbox Code Playgroud)

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

data HList :: [*] -> * where
  HNil :: List '[]
  HCons :: t -> List ts -> List (t ': ts)
Run Code Online (Sandbox Code Playgroud)

如上所述这里.最相关的GHC扩展是DataKinds,最相关的论文可能是给Haskell一个促销.