为什么Functor不公开fmap的默认实现?

And*_*man 4 haskell functor

Functor类类型定义中:

class Functor f where
    fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

为什么没有fmap默认实现?像这样的东西:

class Functor f where
    fmap :: (a -> b) -> f a -> f b
    fmap fn (f a) = (f $ (fn) a)
Run Code Online (Sandbox Code Playgroud)

当我编写实例时Functor,我手动为每个实例编写相同的代码.有没有办法指定默认实现?

chi*_*chi 14

你可能想要这个:

{-# LANGUAGE DeriveFunctor #-}

data T1 a = T1 a
  deriving Functor
data T2 a = T2 a
  deriving Functor
Run Code Online (Sandbox Code Playgroud)

至于为什么没有针对仿函数的默认实现:只有f身份仿函数(直到同构),你的提议才有效.也就是说,它可以工作

data F a = F a
Run Code Online (Sandbox Code Playgroud)

但它不会起作用

data F a = F a a
Run Code Online (Sandbox Code Playgroud)

要么

data F a = F (Int -> a) [a] (Maybe a)
Run Code Online (Sandbox Code Playgroud)

这需要更复杂的fmaps.

虽然不能写一个fmap在每种情况下都有效的默认值,但在许多简单的情况下,例如上面的那些,看起来fmap应该是什么似乎微不足道.幸运的是,我们现在已经derive Functor涵盖了这些简单的案例.

  • @Bush在这里工作.发布所有代码,并确保使用了`LANGUAGE`编译指示. (2认同)