如何避免吸气器中的警告"Redundant constraint: Functor f"?



我有一些记录SomeRecord和字段,如_user, _password。我想用Getter表示一个"虚拟的"字段,如标识符,将看起来像<user>:<password>:

identity:: Getter SomeRecord String
identity = to $ srec -> srec^.user <> ":" <> srec^.password

这个getter会导致警告:

• Redundant constraint: Functor f
• In the type signature for:
       identity :: Getter SomeRecord Stringtypecheck(-Wredundant-constraints)

这个getter有什么问题,如何在没有警告的情况下编写它?

编辑:

刚刚在网上找到这个线程:

注释(by ekmett):

为了不被淹没在用户的抱怨中在GHC 8上lens,我们可能只是将约束添加到to并依赖{-# INLINE #-}在实践中放弃了它。这是一种常见的有足够的理由让我们吃掉我们这边的噪音。

当然,如果你声明a,你也会得到同样的结果不受法律约束的横贯,如折痕等。那里恐怕是唯一答案将是压制警告。GHC看不到"法律"。

这是由于Edward Kmett的镜头库的工作方式。

Getter是一个类型同义词:

type Getter s a = forall f. (Contravariant f, Functor f) => (a -> f a) -> s -> f s

同时to的类型为:

to :: (Profunctor p, Contravariant f) => (s -> a) -> Optic' p f s a

别管Optic',问题是GetterFunctor f的约束,但to不需要它。因此出现了警告,因为否则您可以将它与非函子类型f一起使用。

"proper"函数的类型类似于:

identity :: (Profunctor p, Contravariant f) => Optic' p f SomeRecord String

最新更新