鉴于以下newtype
:
newtype Bar a = Bar { foo :: Int -> a }
我尝试为它定义一个Functor
实例。
instance Functor (Bar) where
fmap g (Bar f) = Bar $ fmap f
我打算将Int -> a
映射到Int -> b
- 我认为这是正确的结果类型。
但是,我收到了编译时错误:
Couldn't match type `f0 Int' with `Int'
Expected type: Int -> f0 a
Actual type: f0 Int -> f0 a In the second argument of `($)', namely `fmap f'
In the expression: Bar $ fmap f
如何实现此Functor
实例?
答案 0 :(得分:7)
应该是
instance Functor Bar where
fmap g (Bar f) = Bar $ fmap g f
我想你可能错过了g
。您看到f0 Int -> f0 a
因为f :: Int -> a
所以fmap f :: Functor f0 => f0 Int -> f0 a
。自g :: a -> b
起,您希望fmap g
超过f
,以便fmap g f :: Int -> b
。