我正在尝试实现一个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。)相同?

先感谢您。

最佳答案

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

关于haskell - 如果f是类型a-> b的函数,(fmap f)是否与(f。)相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55564018/

10-11 22:33
查看更多