函子和类型 类

Functor and type classes

我是 Haskell 的新人。我明白了什么是仿函数和范畴。

但我还有一个问题。我必须使用 Functor 类型 class 的函子吗?

我想我也可以定义另一种类型 class 来做与 Functor?

相同的事情

他们两个都可以做同样的事情。

instance Functor MyData where
    fmap f (MyData a) = MyData (f a)

class MyDataFunctor f where
   fmap :: (a -> b) -> f a -> f b

instance MyDataFunctor MyData where
   fmap f (MyData a) = MyData (f a)

当然可以。它只是有点重新发明轮子。标准 classes 的优点是每个人都会在适当的时候创建它们的类型实例,所以如果你编写一个可以在泛型 Functor f 上运行的函数,那么它将与 来自数百个库的大量 不同类型构造函数f。如果您将函数更改为 require MyDataFunctor f,它会做完全相同的事情,但是 与您自己的类型 MyData.

您想要编写自己的 class 的唯一合理原因是您想要不同的 行为。