2016-11-20 58 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