具体是指https://bartoszmilewski.com/2015/04/07/natural-transformations/
作者说“这不是一个算人”。
我可以将fmap :: (a -> b) -> (a -> a) -> (b -> b)
定义为fmap f aa = id
,这似乎符合仿函数法律。
我不是说为什么它没有明确地成为X语言中Functor类型类的一部分,我只是说它为什么不被认为是一个算子。
答案 0 :(得分:5)
在Haskell的上下文中,我认为您正在谈论newtype Endo a = Endo (a -> a)
(使用newtype来获取所需的* -> *
类型。)
确实我们可以定义
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'
。