2017-03-03 13 views
3

有効なHaskell型を定義するデータ型を定義するライブラリがあります(これはおそらくGADTになります)。有効な型を表すHaskellデータ型

私はこれがどのように見えるかを提案してみましょう、説明すること:私は、私は良い実装で提案してきたものとは言わないよ

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

:これは表すことになり

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)))) 

私は何を意味するのかを明らかにしようとしています。

タイプ定義の文法を定義できる場合は、それを表すGADTを作成できます。すでにこれをしていることはありますか?

+0

なぜADTではなくGADTですか? ['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 

、GHCがありTemplateHaskell言語拡張は、この驚くほど簡単で遊んで行います。代わりにForallT ...ものを書くことの、私は、ちょうど「引用」私は

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

そしてx'を探していますタイプはxと同じである(まあ多分ab若干異なるName秒になってしまうことができますそれでも)!

関連する問題