我有一些记录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'
,问题是Getter
有Functor f
的约束,但to
不需要它。因此出现了警告,因为否则您可以将它与非函子类型f
一起使用。
"proper"函数的类型类似于:
identity :: (Profunctor p, Contravariant f) => Optic' p f SomeRecord String