2017-03-03 99 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,但仍)!