为什么 Functor 不公开 fmap 的默认实现?
Why does Functor not expose a default implementation of fmap?
在Functor
class类型定义中:
class Functor f where
fmap :: (a -> b) -> f a -> f b
为什么 fmap
没有默认实现?类似的东西:
class Functor f where
fmap :: (a -> b) -> f a -> f b
fmap fn (f a) = (f $ (fn) a)
当我编写 Functor
的实例时,我手动为每个实例编写 相同的 代码。有没有办法让我指定默认实现?
你可能想要这个:
{-# LANGUAGE DeriveFunctor #-}
data T1 a = T1 a
deriving Functor
data T2 a = T2 a
deriving Functor
至于为什么没有仿函数的默认实现:您的提议仅在 f
是恒等仿函数(直到同构)时才有效。也就是说,它适用于
data F a = F a
但它不适用于
data F a = F a a
或
data F a = F (Int -> a) [a] (Maybe a)
这需要更复杂的 fmap
s。
虽然不能写出适用于所有情况的默认 fmap
,但在许多简单的情况下,例如上述情况,发现 fmap
应该是什么似乎微不足道。
幸运的是,我们现在有涵盖这些简单案例的 derive Functor
。
在Functor
class类型定义中:
class Functor f where
fmap :: (a -> b) -> f a -> f b
为什么 fmap
没有默认实现?类似的东西:
class Functor f where
fmap :: (a -> b) -> f a -> f b
fmap fn (f a) = (f $ (fn) a)
当我编写 Functor
的实例时,我手动为每个实例编写 相同的 代码。有没有办法让我指定默认实现?
你可能想要这个:
{-# LANGUAGE DeriveFunctor #-}
data T1 a = T1 a
deriving Functor
data T2 a = T2 a
deriving Functor
至于为什么没有仿函数的默认实现:您的提议仅在 f
是恒等仿函数(直到同构)时才有效。也就是说,它适用于
data F a = F a
但它不适用于
data F a = F a a
或
data F a = F (Int -> a) [a] (Maybe a)
这需要更复杂的 fmap
s。
虽然不能写出适用于所有情况的默认 fmap
,但在许多简单的情况下,例如上述情况,发现 fmap
应该是什么似乎微不足道。
幸运的是,我们现在有涵盖这些简单案例的 derive Functor
。