私は "異種ツリー"をモデル化しようとしています。ノードが異なる「種類」を持っており、それぞれの「種類」が、彼らは含まれていてもよい子どもたちの「種類」に制限されているツリー: type id = string
type block
type inline
type _ node =
| Paragraph : id * inline node list -> block nod
{-# LANGUAGE GADTs #-}
data Expr a where
Val :: Num a => a -> Expr a
Eq :: Eq a => Expr a -> Expr a -> Expr Bool
eval :: Expr a -> a
eval (Val x) = x
eval (Eq x y) = (eval x) == (eval
私はメタデータが1つのタイプパラメータとして表され、もう1つのレコードフィールドとしてメタデータが表現される2つのライブラリをインターフェースしなければなりませんでした。私はGADTを使ってアダプタを書いた。蒸留バージョンは次のとおりです。 {-# LANGUAGE GADTs #-}
newtype TFId a = MkId a
data TFDup a = MkDup !a !a
私は型クラスとGADTSの違いを理解しようとしています。特に、-XMultiParamTypeClasses拡張子を使用している場合は、 はどちらも同様の用途を持っているように見えます: class MyClass a b where
f :: a -> b -> Bool
instance MyClass String String where
f s1 s2 = ...
ここには示されていない無関係のコード部分に使用するGADT拡張機能でコンパイルするときに、タイプエラーが発生するため、以下の関数が拒否されます。 newtype Church = Church { unC :: forall a. (a -> a) -> a -> a }
to_c :: Int -> Church
to_c 0 = let f0 f c = c in Church f0
t
私は、その引数が順序付けられていれば意味をなさないデータ型を持っていますが、それを動作させるには複雑で潜在的にハッキリなものに深く関わる必要があるようです(主にGADT)。 私がやっていることは(制約付きのデータ型)悪いハズケルの習慣とみなされていますか?これを回避する方法はありますか?興味のある方のため は、ここに関連するコードです: {-# LANGUAGE GADTs #-}
{-# LA