NamedFieldPuns
レコードから値を取り出す場合、レコードのフィールド名がgetterのように使える。
code:haskell
data T = T { fld :: Int }
get :: T -> Int
getFld = fld
-- >>> getFld (T {fld = 42}) ~~> 42
フィールドが10個あるうちから3つだけ取り出したい、などの場合にいちいちgetterで取り出すのは面倒だしパターンマッチでシュッと取りたい。
OCamlerならそう考える。
code:ocaml
type t = {
f1 : int;
f2 : int;
......
}
let t = { f1 = 0; f2 = 1; ......}
let f { f3; f4; f8 } = f3 + f4 + f8 (* let f t = t.f3 + t.f4 + t.f8 *)
Haskellには NamedFieldPuns という言語拡張として提供されている。
code:haskell
{-# LANGUAGE NamedFieldPuns #-} data T = T { f1 :: Int, f2 :: Int, ...... }
f :: T -> Int
f T{ f3, f4, f8 } = f3 + f4 + f8
-- as パターンとも併用可能
g :: T -> (T, Int)
g t@T{ f3, f4, f5 } = (t, f3 + f4 + f5)