从Persistent中生成镜头的字段中删除下划线

时间:2016-11-20 15:01:32

标签: haskell haskell-persistent

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

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

1 个答案:

答案 0 :(得分:2)

  

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

Database.Persist.TH没有提供该选项(要查看它存在的样子,参见Control.Lens.TH),所以,假设您不会在此基础上分叉库,似乎不是一种方式。 (顺便说一句,查找mpsGenerateLenses in the source会准确显示下划线的添加位置。)

  

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

大概是因为图书馆认为如果你生成镜头,你将在任何地方使用它们而不是记录访问者/标签,包括获得场的价值。我唯一的化妆品建议是,如果将订单从_userName vals更改为vals ^. userName会让您感到困扰,则可能更喜欢使用view而不是(^.),如{ {1}}。