为什么 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'
.
具体参考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'
.