为什么GHCI在此处为所需的上下文添加约束:
> let f = fmap show
> :t f
f :: (Functor f, Show a) => f a -> f String
但不是吗?
> :t over
over :: Lens s t a b -> (a -> b) -> s -> t
> :t _all'
_all' :: (Applicative f, Eq a) => a -> (a -> f a) -> [a] -> f [a]
> :t over (_all' 2)
<interactive>:1:7: error:
• Could not deduce (Applicative f) arising from a use of ‘_all'’
这两种情况之间有什么重大差异吗?
答案 0 :(得分:1)
请注意,这不是镜头库定义的
over
类型。话虽这么说,你的版本不起作用,因为Lens
是type Lens = forall f. Functor f => (a -> f b) -> s -> f t
和
_all' 2 :: forall f. Applicative f => ..
换句话说,
over
要求的功能适用于任何Functor
,但您提供的功能仅适用于Applicative
(这是一个更强的约束,Functor
并不意味着Applicative
)。
@ user2407038的评论。
正如评论中所提到的,您可以通过修复over
的类型签名来解决您的问题。它应该是lens
中使用分布函子或更简单的
type Setter s t a b = (a -> Identity b) -> s -> Identity t
over :: Setter s t a b -> (a -> b) -> s -> t
由于身份类型既是仿函数又是应用程序,它与镜头和(我假设在你的情况下)遍历一致。