我有一些记录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看不到“法律”。
1条答案
按热度按时间g52tjvyc1#
这是由于Edward Kmett的透镜库的工作方式。
Getter
是一个类型同义词:同时,
to
的类型为:别管
Optic'
了,问题是Getter
有Functor f
约束,但to
不需要它,所以才有了这个警告,因为否则你可以把它和不是函子的f
类型一起使用。您的函数的“适当”类型如下所示: