2013-06-16 5 views
8

標準makeLenses実装では、アンダースコアで始まるレコードのすべてのフィールドのレンズが生成されます。私は非常に多くの理由で私の記録にそのような厄介な命名規則を導入しなければならないという考えを嫌う。私がしたいのは、レコードのすべてのフィールドのレンズを生成し、フィールド名に接尾辞 "L"を追加するだけです。 FC-ラベルライブラリとデフォルトの「アンダースコア」ベースのものの代わりにカスタムネームプロセッサを使用した「レンズ」ライブラリのレンズの生成

私は

mkLabelsWith (++ "L") [''MyRecord] 

た達成するためにしなければならなかったすべてが、レンズライブラリがないようであるrulesetsとスタッフとはるかに関わる構成を持っています周りの心を簡単に取得します。だから私は同じことを達成するための具体的なレシピを求めています。

答えて

15

コードを見ると、かなりわかりやすいようです。 LensRulesには、lensField :: String -> Maybe String(レンズの名前を指定するか失敗する)という機能があります。だから、

myMakeLenses = makeLensesWith $ lensRules 
    & lensField .~ (\name -> Just (name ++ "L")) 

のように機能させることができ、makeLensesの代わりにそれを使用します。もちろん、(++ "L")で関数のパラメータを設定することもできます。

また、好きなようにインラインで書くこともできます。

makeLensesWith ?? ''Foo $ lensRules 
    & lensField .~ (\name -> Just (name ++ "L")) 

は((??)が正しい順序で引数を渡すためだけの中置flipであることに注意してください。あなたは第二引数は、内に充填受けることをこの場合の「穴」と考えることができます。そして、(&)がちょうど反転しています($)

+0

グレート(これは4.4でラムダは、パラメータとしてのみ\_ nameを取ると、4.5+です):

は、こちらのバージョンで動作実装です!どうもありがとうございました! –

+0

これは、template-haskell関連のコードを変更したレンズ4.4で壊れていることに注意してください。 –

18

テンプレートハイスクール関連のAPIを変更したレンズ4.4+でシャハフの答えは機能しません。

import Language.Haskell.TH 

myMakeLenses :: Name -> DecsQ 
myMakeLenses = makeLensesWith $ lensRules 
    & lensField .~ \_ _ name -> [TopName (mkName $ nameBase name ++ "L")] 

関連する問題