haskell - 我什么时候应该通过类型类或其他方式定义多态函数?

标签 haskell polymorphism typeclass adhoc-polymorphism

我试图弄清楚类型类的用途,如果不使用类型类还有什么。

类型类是定义多态函数的一种方法吗?

类型类是定义多态函数的唯一方法吗?例如:

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/

相关文章:

haskell - 是什么阻碍了高效的 Haskell 虚拟机(如 JVM)?

haskell - 在 Haskell 中生成二维网格

Haskell 将递归步骤保存到列表中

c++ - C++ STL 容器中的多态性

haskell - 使用 ghc 专门研究类型类

haskell - 当我指定 x 的类型为 a 时,为什么 Haskell 会尝试推断它的类型为 a0 ?

c++ - 什么时候使用虚拟析构函数?

java - 传递将两个接口(interface)实现为两个不同子类型的类的实例

scala - 为什么抽象类型的具体实现不能用于推断 ClassTag?

haskell - 使用 fsharp-typeclasses 来创建适用于任意 monad 的函数