当我看到这个非常有趣的例子时,我正在浏览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中实现(至少它不能为我编译),并且浏览门票证明是非常压倒性的。知道我应该寻找什么吗?
答案 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。