NamedFieldPuns, RecordWildCards

初めて知ったのでメモ.

NamedFieldPuns

旧名 RecordPuns.
レコード型のパターンマッチを書くときの手間を少し減らすもの.
もともと

data C = C { field1 :: Int, field2 :: String }
f C { field1 = x } = x + 1

というようにパターンマッチを書けるのだが,このときフィールド名と同名の変数に束縛することがよく(?)あるので

f C { field1 } = field1 + 1

みたいに書けるようになる拡張.

RecordWildCards

RecordPuns を更に進めてすべてのフィールドに対してそれを行う.

g C {..} = field1 + length field2

みたいなかんじ.


さらにこれらはパターンマッチだけでなく,

let field1 = 2 in f C { field1, field2 = "foo" }

とか

fuga = f C {..}
  where
    field1 = 3
    field2 = "hi"

というような式も書けるようになる.
フィールドの数が多く,複雑な式を与えるときは便利かもしれない.