我正在尝试实现一个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 a
与r -> 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/