我是Haskell的新手。我理解什么是仿函数和类别。
但我有另一个问题。我必须使用Functor
类型的仿函数吗?
我想我还可以定义另一个类型类与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)
答案 0 :(得分:8)
当然可以这样做。它只是有点重新发明轮子。标准类的优点是每个人都会在适当的时候创建它们的类型实例,所以如果你编写一个可以在通用Functor f
上运行的函数,那么它将使用 huge 来自数百个库的不同类型构造函数f
的数量。如果您将功能更改为需要MyDataFunctor f
,那么它将执行完全相同的操作,但仅具有您自己的类型MyData
。
您可能想要编写自己的类的唯一明智的理由是,如果您想要不同的行为。