我试图弄清楚类型类的用途,如果不使用类型类还有什么。
类型类是定义多态函数的一种方法吗?
类型类是定义多态函数的唯一方法吗?例如:
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y = not (x == y)
instance Eq Bool where
False == False = True
True == True = True
_ == _ = False
我可以定义 ==
和/=
对于 Bool
(和任何其他类型)不使用类型类 Eq
?
哪里还有其他方式,什么时候应该使用哪种方式来定义多态函数,使用类型类还是使用其他方式?
最佳答案
您始终可以编写无约束多态函数,不需要任何类型类。一个简单的例子是
length :: [a] -> Int
– 这无需类型类即可工作,并且(嗯,因为)它适用于任何类型 a
。也就是说,length
实际上并不关心该列表中的值是什么,它只关心包含这些值的结构。它实际上从未对这些值本身执行任何操作,多态类型实际上保证了这一点。
如果您需要的多态任务是这种形式,即您实际上不需要访问的类型,您只知道它在那里,那么您不应该编写/调用类型类,只需使用 ML 风格的参数多态性,如 length
中所示。然而,很多时候您将需要访问这些值本身,并以某种方式检查它们。类型类的作用就是做到这一点而不将您限制于特定的具体类型。 Eq
,正如您自己引用的那样,就是一个例子。
关于haskell - 我什么时候应该通过类型类或其他方式定义多态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57098679/