是否有一个库定义了一个定义有效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来表示它。有什么事情已经做到了吗?
答案 0 :(得分:4)
您正在寻找the type-related ADTs in template-haskell
。请注意,Type
是Ppr
的一个实例,具有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
相同(也许a
和b
最终会略微不同Name
s,但仍然是!)