导出Functor实例总是做显而易见的事情。这通常是很好的,但偶尔会错过机会。例如,假设我写 data Pair a = Pair a a deriving Functor
data Digit a = One a | Two a a deriving Functor
data Queue a =
Empty
| Single a
| Deep !(Digit a) (Queue (Pair a)) !(Digit a) deriving Functor 这将生成(在ghc 8.2中) instance Functor Queue where
fmap ...
x <$ Empty = Empty
x <$ Single y = Single x
x <$ Deep pr m sf = Deep (x <$ pr) (fmap (x <$) m) (x <$ sf) 用手写最后一个例子是可能的: x <$ Deep pr m sf = Deep (x <$ pr) (Pair x x <$ m) (x <$ sf) 可以看到实际的派生代码-ddump-deriv...... 展开详请