J'essaie de comprendre les différences entre les classes de type et GADTS, en particulier lorsque vous utilisez l'extension -XMultiParamTypeClasses
.Comprendre quand utiliser des classes de types ou des GADT?
Les deux semblent avoir des utilisations similaires:
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
Jusqu'à présent, la seule différence que je vois vraiment que permettre de GADT une interface de type fonction d'avoir un des arguments de nombre flexibles:
data Gadt a where
PassTwoArgs :: String -> String -> Gadt Bool
PassOneArgs :: String -> Gadt Bool
myFunction :: Gadt a -> a
myFunction (PassTwoArgs s1 s2) = ...
myFunction (PassOneArgs s1) = ...
Alors que Ce n'est pas facile avec les classes de types.
Existe-t-il d'autres différences ou cas d'utilisation pour utiliser l'un sur l'autre?