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"
というような式も書けるようになる.
フィールドの数が多く,複雑な式を与えるときは便利かもしれない.