如果 f 是类型 a->b 的函数,(fmap f) 是否与 (f .) 相同?

Is (fmap f) the same as (f .) if f is a function of type a->b?

我正在尝试实现

的 Functor 实例
data ComplicatedA a b
    = Con1 a b
    | Con2 [Maybe (a -> b)]

对于 Con2,我的思考过程是 fmap 需要类似于

fmap f (Con2 xs) = Con2 (map f' xs)

然后我需要一个列表映射函数 f' like

Maybe (a -> x) -> Maybe (a -> y)

因为Maybe是一个函子,我可以把f'写成

fmap ((a->x) -> (a->y))

为了得到((a->x) -> (a->y)),我以为我可以做到 fmap (x->y)(fmap f)

相同

所以我的选择是

instance Functor (ComplicatedA a) where
    fmap f (Con1 x y) = Con1 x (f y)
    fmap f (Con2 xs) = Con2 (map (fmap (fmap f)) xs)

但是真正的解决方案是使用 (f .) 而不是 (fmap f)x -> y 得到 ((a->x) -> (a->y)) 并且看起来像这样

instance Functor (ComplicatedA a) where
    fmap f (Con1 a b) = Con1 a (f b)
    fmap f (Con2 l) = Con2 (map (fmap (f .)) l)

我只是想知道我的思维过程和解决方案有什么问题。如果 f 是类型 a->b 的函数,(fmap f) 是否与 (f .) 相同?

提前谢谢你。

解确实是等价的。 fmap for the function/reader functor(.):

instance Functor ((->) r) where
    fmap = (.)

(->) r 是与前缀语法一起使用的函数类型构造函数——(->) r ar -> a 相同。)

直觉是,正如您所指出的,(.) :: (x -> y) -> (a -> x) -> (a -> y) 使用 x -> y 函数修改 a -> x 函数的结果。