私は型クラスとGADTSの違いを理解しようとしています。特に、-XMultiParamTypeClasses
拡張子を使用している場合は、タイプクラスまたはGADTを使用するタイミングを理解していますか?
はどちらも同様の用途を持っているように見えます:
class MyClass a b where
f :: a -> b -> Bool
instance MyClass String String where
f s1 s2 = ...
instance MyClass Int Int where
f i1 i2 = ...
data Gadt a where
F :: String -> String -> Bool
F2 :: Int -> Int -> Bool
はこれまでのところ、私は本当に見唯一の違いは、GADTのは、柔軟な数の引数を持つように関数型インターフェースを有効にすることである:
data Gadt a where
PassTwoArgs :: String -> String -> Gadt Bool
PassOneArgs :: String -> Gadt Bool
myFunction :: Gadt a -> a
myFunction (PassTwoArgs s1 s2) = ...
myFunction (PassOneArgs s1) = ...
ながら、これは型クラスでは簡単にはできません。
他の相違点や使用例がありますか?