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 vals私が持っている唯一の表面的な提案は、 からへの書き順の変更がvals ^. userName気になる場合は、 のように ではなく を使用することを好むかもしれないということviewです。(^.)view userName vals

于 2016-11-20T15:48:04.233 に答える