Functional programming 为什么->不是函子?

Functional programming 为什么->不是函子?,functional-programming,functor,category-theory,Functional Programming,Functor,Category Theory,具体指 作者说这不是一个函子 我可以将fmap::a->b->a->a->b->b定义为fmap f aa=id,这似乎符合函子定律 我不是说为什么它在X语言中不是显式的函子类型类的一部分,我只是说为什么它不会被承认为函子。在Haskell的上下文中,我想你说的是新类型Endo a=Endo a->a使用新类型来获得所需的*->*类型 事实上,我们可以定义 instance Functor Endo where fmap _ _ = Endo id 但函子定律之一是fmap id=id

具体指

作者说这不是一个函子

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


我不是说为什么它在X语言中不是显式的函子类型类的一部分,我只是说为什么它不会被承认为函子。

在Haskell的上下文中,我想你说的是新类型Endo a=Endo a->a使用新类型来获得所需的*->*类型

事实上,我们可以定义

instance Functor Endo where
    fmap _ _ = Endo id
但函子定律之一是fmap id=id,即使用id的fmapping必须与不执行任何操作相同。您建议的定义违反了此规则:

fmap id (Endo toUpper)

应该会产生Endo toUpper,但您的代码将其设置为Endo id。其中一个将“a”转换为“a”,另一个将“a”转换为“a”。

在Haskell的上下文中,我认为您所说的是新类型Endo a=Endo a->a使用新类型来获得所需的*->*类型

事实上,我们可以定义

instance Functor Endo where
    fmap _ _ = Endo id
但函子定律之一是fmap id=id,即使用id的fmapping必须与不执行任何操作相同。您建议的定义违反了此规则:

fmap id (Endo toUpper)

应该导致Endo toUpper,但您的代码将其设置为Endo id。其中一个将“a”转换为“a”,另一个将“a”转换为“a”。

这与问题无关。我将澄清我的问题。请注意,类型a->a只有一个成员,身份函数id。它几乎相当于单位。@ZhekaKozlov-这些函数都没有类型a->a。@ZhekaKozlov好的,我可能应该说是一个函子。是一个函子实例吗?这与问题无关。我会澄清我的问题。注意类型a->a只有一个成员,标识函数id。它几乎等同于单位。@ZhekaKozlov-这些函数都没有类型a->a。@ZhekaKozlov好的,我可能应该说作为函子。是函子实例吗?事实上,fmap id+1返回+0而不是+1。违反了第一条法律。我明白了,这就是我的想法。完全愚蠢的认为a->a将被非id函数占据。事实上,fmap id+1返回+0而不是+1。违反了第一条法律。我明白了,这就是我的想法。完全愚蠢的认为a->a将被非id函数占据。