• 作成:

lensのコード生成時にフィールド名をアンダースコアで始める必要は無かった

昔はあんまり好きじゃなかったlensをamazonkaの使用とともに受け入れ始めました。

HaskellとJSON、そしてレコード型 - syocy’s diary を見て、 makeFieldsのプレフィクス除去良いなあと思いました。

でもフィールド名をアンダースコアで始めるとlens専用のインターフェイスみたいになって、純粋なHaskellのレコード操作が奇妙な感じになるので、 lensだけを使うことを決断しないと使いにくいよねと感じてlensインターフェイスを作るのを躊躇していました。

しかしそれは私の勘違いで、別にフィールドをアンダースコアで始めなくてもコード生成が行われました。

以下のようなコードで実現可能です。

-- | The multi way bi tree.
-- 複数の子を持つ可能性があり、子の左右を区別するツリー。
data MwbTree a
  = MwbTree
    { -- | トップレベルデータ。
      -- フィールドに正格評価を採用しているので先頭でなくても良いのですが、
      -- Lazyな表記に慣れても違和感を感じないように、
      -- 中央ではなくトップレベルに持ってきています。
      mwbTreeLabel :: !a
      -- | 左要素
    , mwbTreeLeft  :: ![MwbTree a]
      -- | 右要素
    , mwbTreeRight :: ![MwbTree a]
    } deriving (Eq, Ord,  Show, Read, Generic)

makeFields ''MwbTree

この場合MwbTreeではなくMWBTreeとしてしまうとcamelCaseとして認識されずにうまいこと生成されないので注意が必要です。