表示有效类型的Haskell数据类型

时间:2017-03-03 01:34:20

标签: haskell types

是否有一个库定义了一个定义有效Haskell类型的数据类型(可能这是一个GADT)。

为了解释,让我建议这可能是什么样的:

data A
data B

class Free t
instance Free A
instance Free B

x = Forall A (Forall B (Constraint (NumConstraint A) 
      (Constructor Function A (Constructor Function B A))))

这表示:

forall a b. Num a => a -> b -> a

我并不是说我所建议的是一个很好的实施方式,我只是想表明我的意思。

当然,如果您可以定义类型定义的语法,您可以创建一个GADT来表示它。有什么事情已经做到了吗?

1 个答案:

答案 0 :(得分:4)

您正在寻找the type-related ADTs in template-haskell。请注意,TypePpr的一个实例,具有ppr漂亮打印功能。

ghci> import Language.Haskell.TH
ghci> :{
ghci> x <- runQ $ do
ghci|        a <- newName "a"
ghci|        b <- newName "b"
ghci|        pure $ ForallT [PlainTV a,PlainTV b] [AppT (ConT (mkName "Num")) (VarT a)] (AppT (AppT ArrowT (VarT a)) (AppT (AppT ArrowT (VarT b)) (VarT a)))
ghci| :}
ghci> x
ForallT [PlainTV a_4,PlainTV b_5] [AppT (ConT Num) (VarT a_4)] (AppT (AppT ArrowT (VarT a_4)) (AppT (AppT ArrowT (VarT b_5)) (VarT a_4)))
ghci> ppr x
forall a_0 b_1 . Num a_0 => a_0 -> b_1 -> a_0

事实上,TemplateHaskell语言扩展GHC将使这个游戏变得非常容易。我没有必要写出ForallT ...的东西,而只能引用&#34;引用&#34;我正在寻找的类型

ghci> :set -XTemplateHaskell -XExplicitForall
ghci> x' <- runQ [t| forall a b. Num a => a -> b -> a |]

x'x相同(也许ab最终会略微不同Name s,但仍然是!)