为什么 a -> a 不是函子?

Why is a -> a not a functor?

具体参考https://bartoszmilewski.com/2015/04/07/natural-transformations/

作者说 "This is not a functor".

我可以将 fmap :: (a -> b) -> (a -> a) -> (b -> b) 定义为 fmap f aa = id,这似乎符合函子定律。

我不是说为什么它不是 X 语言中 Functor 类型类的明确部分,我只是说为什么它不被承认为仿函数。

在 Haskell 的上下文中,我认为您在谈论 newtype Endo a = Endo (a -> a)(使用新类型来获得所需的 * -> * 类型)。

我们确实可以定义

instance Functor Endo where
    fmap _ _ = Endo id

但是 Functor 法则之一是 fmap id = id,即使用 id 的 fmapping 必须等同于什么都不做。您建议的定义违反了这条规则:

fmap id (Endo toUpper)

应该导致 Endo toUpper,但您的代码使它成为 Endo id。其中一个将 'a' 转换为 'A',另一个将 'a' 转换为 'a'.