GHCI何时不推断所需的背景?

时间:2017-08-21 22:04:50

标签: haskell

为什么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'’

这两种情况之间有什么重大差异吗?

1 个答案:

答案 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

由于身份类型既是仿函数又是应用程序,它与镜头和(我假设在你的情况下)遍历一致。