Haskell 函子与类型类

Haskell 函子与类型类,haskell,functor,Haskell,Functor,我是哈斯克尔的新成员。我知道什么是函子和范畴 但我还有一个问题。我必须将functor与functor类型类一起使用吗 我想我还可以定义另一个类型类来执行与Functor相同的操作 他们两个都可以做同样的事情 instance Functor MyData where fmap f (MyData a) = MyData (f a) 及 当然你能做到。这就像是在改造轮子。标准类的优点是,如果合适的话,每个人都会使其类型成为它们的实例,因此,如果您编写的函数可以在泛型Functor f上

我是哈斯克尔的新成员。我知道什么是函子和范畴

但我还有一个问题。我必须将functor与
functor
类型类一起使用吗

我想我还可以定义另一个类型类来执行与
Functor
相同的操作

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

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


当然你能做到。这就像是在改造轮子。标准类的优点是,如果合适的话,每个人都会使其类型成为它们的实例,因此,如果您编写的函数可以在泛型
Functor f
上运行,那么它将与数百个库中的大量不同类型构造函数
f
一起工作。如果您将函数改为require
MyDataFunctor f
,它将执行完全相同的操作,但只使用您自己的类型
MyData


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

您当然可以,但这违背了拥有单一接口的目的(typeclasses启用了该接口),不是吗?当然,使用内置函子不是强制性的。但如果不使用标准函子,您将失去它的许多优点。
class MyDataFunctor f where
   fmap :: (a -> b) -> f a -> f b

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