2017-03-03 53 views
3

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

讲解,让我提出这可能是什么样子:

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

为什么选择GADT而不是ADT?是['template-haskell'](https://hackage.haskell.org/package/template-haskell-2.11.1.0/docs/Language-Haskell-TH.html#g:17)你在找什么? – Alec

+0

我不介意它是不是GADT,只要我可以做一些漂亮的打印等等。 – Clinton

回答

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 ...的东西,我就可以“引用”的类型我要找

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

而且x'相同x(以及可能ab最终被略有不同Name S,但仍)!