私は次与えてきた私のHaskellの対象のためのユニからの継続練習を持っている: data Expr = Con Value
| And Expr Expr
data Value = IntValue Int
| BoolValue Bool
est :: Expr -> Val
est (Con v) = v
est (And x y) =
ca
は、私は本当に持って主張します式が型付けされました。この行はコンパイラが渡さ data PPair where
PPair :: (String, Expr a) -> PPair
たら、私は私は本当に間違って何かをやっていると感じていた:私はGADTでPPairを定義し、[PPair]として、私は状態を実装しようとしました。私はその考えを抑え、コーディングを続けた。私が手 eval
GADTの紹介hereを読んでいました。プログラマーに構文木の種類を偉大にするように制限するというアイデアがありました。このアイデアを簡単なラムダ計算インタープリタに入れました。後で私はこの構文木に文字列をパースすることができないことに気づきました。なぜなら、1つの解析関数は、入力に応じてさまざまな種類の構文木を返す必要があるからです。 {-# LANGUAGE GADTs #-}
data I
私はただ読んでいるだけです。種類をparametrisedの導入部で、著者はこの宣言 data List (A : Set) : Set where
[] : List A
_::_ : A → List A → List A
にListの種類がSet → Setであることを言及し、Aこと、すなわち両方のコンストラクタへの暗黙の引数になります。 [] : {A : Set}
GADTとデータ型を組み合わせるのが本当に好きです。以前よりも型の安全性が向上しています(ほとんどの場合、AgqなどのCoqとほとんど同じです)。悲しいことに、最も単純な例ではパターンマッチングは失敗し、型クラス以外の関数を書く方法はないと思います。 は、ここに私の悲しみを説明するための例です: data Nat = Z | S Nat deriving Eq
data Le :: Nat -
Type-Safe Observable Sharing in Haskell Andy Gillは、DSLのHaskellレベルで存在していた共有を回復する方法を示しています。彼の解決策はdata-reify packageに実装されています。このアプローチはGADTと連携するように変更できますか?例えば、このGADTを与え: data Ast e where
IntLit :: In