Bab*_*ham 6 haskell typeclass gadt
我试图找出类型类和GADTS之间的差异,尤其是在使用-XMultiParamTypeClasses
扩展时.
两者似乎都有类似的用途:
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
Run Code Online (Sandbox Code Playgroud)
到目前为止,我真正看到的唯一区别是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) = ...
Run Code Online (Sandbox Code Playgroud)
虽然使用类型类不容易做到这一点.
是否有任何其他差异或用例使用一个而不是另一个?
如果您有一个类,则可以随时添加新实例.
如果您使用GADT,则您拥有永久固定的数据结构.您无法在不更改原始定义的情况下向其添加新案例.但是,正如您所说,它更加灵活.
实际上,它们适用于不同的用例.当您希望能够对许多不同的数据类型执行某些操作时,这些类就是彼此无关的.(例如,你可以做(==)
的Int
和String
,但这些类型不是很相似.)GADTs是当你想有一个类型,但它的一些类型参数的告诉你一些事情.规范示例是GADT表示某种编程语言中的表达式,并且您希望使用Haskell类型系统来强制执行其他语言的类型系统.
什么类不是我们在面向对象编程中使用的"类".;-)请把所有这些想法都放在你的大脑之外.