如果 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 a
与 r -> a
相同。)
直觉是,正如您所指出的,(.) :: (x -> y) -> (a -> x) -> (a -> y)
使用 x -> y
函数修改 a -> x
函数的结果。
我正在尝试实现
的 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 a
与 r -> a
相同。)
直觉是,正如您所指出的,(.) :: (x -> y) -> (a -> x) -> (a -> y)
使用 x -> y
函数修改 a -> x
函数的结果。