2016-11-20 82 views
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},我需要在每个投影功能的开头加上下划线或使用镜头的getter:

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

对于什么是值得的,使用getter没有任何开销。 '^。 userName'生成与_userName相同的代码。 –

回答

2

首先,我怎么可以还原为默认值,userName vals,并添加使用镜片吸除,vals ^. _userName下划线?

Database.Persist.TH不提供该选项(看到它可能是什么样子,如果它存在,参见Control.Lens.TH),因此,假设你不会叉在这个库中,似乎没有要一种方式。 (顺便说一下,找mpsGenerateLensesin the source将准确显示在下划线被添加。)

其次,这是为什么这种方式,而不是周围的其他方式?

大概是因为图书馆认为如果您生成镜头,您将使用它们到处而不是记录访问器/标签,包括获取字段的值。我唯一的美容建议是,如果书写顺序从_userName vals更改为vals ^. userName困扰你,你可能更喜欢使用view而不是(^.),如view userName vals