为什么是 - >不是算子?

时间:2018-02-18 16:22:11

标签: functional-programming functor category-theory

具体是指https://bartoszmilewski.com/2015/04/07/natural-transformations/

作者说“这不是一个算人”。

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

我不是说为什么它没有明确地成为X语言中Functor类型类的一部分,我只是说它为什么不被认为是一个算子。

1 个答案:

答案 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'