为什么即使我不应用 f 参数,我也需要在 fmap 的定义中再次调用构造函数?

gec*_*kos 5 haskell functor algebraic-data-types sum-type

我不知道为什么fmap _ a = a下面是非法的。这是代码:

data Sum a b = First a | Second b

instance Functor (Sum a) where
  fmap f (Second b) = Second (f b)
  fmap _ (First a)  = First a
  fmap _ a          = a  -- Why can't I do this instead?
Run Code Online (Sandbox Code Playgroud)

另一个问题是,这是否会影响性能,还是仅在编译时才会发生?