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

时间:2019-04-07 21:54:41

标签: haskell functor

我正在尝试实现

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

对于Con2,我的思维过程是fmap必须类似于

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

然后我需要像这样的列表映射函数f'

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)((a->x) -> (a->y))获取x -> 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。)相同?

谢谢。

1 个答案:

答案 0 :(得分:6)

解决方案确实是等效的。 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函数的结果。