假设我有一个持久类型,并希望从这种类型中投射一些值:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
User
name Text
email Text
|]
...
getName :: Entity User -> Text
getName (Entity uid vals) = userName vals
问题是,如果我使用mkPersist sqlSettings {mpsGenerateLenses = True}
生成所述类型的镜头,我需要在每个投影功能的开头添加下划线或使用镜头吸气剂:
getName :: Entity User -> Text
getName (Entity uid vals) = _userName vals
getName' :: Entity User -> Text
getName (Entity uid vals) = vals ^. userName
userName vals
,并添加下划线以使用镜头吸气剂vals ^. _userName
?答案 0 :(得分:2)
首先,如何将其恢复为默认值
userName vals
,并添加下划线以使用镜头吸气剂vals ^. _userName
?
Database.Persist.TH
没有提供该选项(要查看它存在的样子,参见Control.Lens.TH
),所以,假设您不会在此基础上分叉库,似乎不是一种方式。 (顺便说一句,查找mpsGenerateLenses
in the source会准确显示下划线的添加位置。)
其次,为什么会这样,而不是相反?
大概是因为图书馆认为如果你生成镜头,你将在任何地方使用它们而不是记录访问者/标签,包括获得场的价值。我唯一的化妆品建议是,如果将订单从_userName vals
更改为vals ^. userName
会让您感到困扰,则可能更喜欢使用view
而不是(^.)
,如{ {1}}。