1

假设我有一个持久类型,并希望从该类型中投射一些值:

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
  • 其次,为什么是这样而不是相反?
4

1 回答 1

3

首先,如何将其恢复为默认值,userName vals并添加下划线以使用镜头吸气剂,vals ^. _userName

Database.Persist.TH不提供该选项(查看它是否存在时的外观,参见Control.Lens.TH),因此,假设您不会为此分叉库,似乎没有办法。(顺便说一句,mpsGenerateLenses 在源代码中查找将准确显示添加下划线的位置。)

其次,为什么是这样而不是相反?

大概是因为库假设如果您生成镜头,您将在任何地方使用它们而不是记录访问器/标签,包括获取字段的值。我唯一的装饰性建议是,如果将书写顺序从_userName valsto更改为vals ^. userName困扰您,您可能更喜欢使用view而不是(^.), 如view userName vals.

于 2016-11-20T15:48:04.233 回答