haskell 如何避免出现警告“冗余约束:函子f”中的getter?

rpppsulh  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(143)

我有一些记录SomeRecord和字段,比如_user_password。我想为一个“虚拟”字段写一个Getter,比如identity,它看起来像<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有什么问题?如何在不发出警告的情况下编写它?

编辑:

刚在Web中找到this thread
评论(由ekmett提供):
为了不被GHC 8上lens的用户的抱怨所淹没,我们很可能只是给to添加约束,并依赖于{-# INLINE #-}在实践中放弃它。这是一个足够常见的场景,足以保证我们一边吃噪音。
当然,如果你把一个不遵守法律的遍历声明为一个折叠,你会得到同样的结果。在那里,我恐怕唯一的答案是压制警告。GHC看不到“法律”。

g52tjvyc

g52tjvyc1#

这是由于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类型一起使用。
您的函数的“适当”类型如下所示:

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

相关问题