generated at
RecordWildCards
recordを引数に取る時に、field名を略記する
NamedFieldPunsからさらに略記させるようなもの
ただし、これらは別物なので RecordWildCards を有効にしても、自動で NamedFieldPuns も有効になったりはしない


何が変わるのか
こういう型があったときに
hs
data Hoge = Hoge { h1 :: Int, h2 :: Int }
通常では
hs
f Hoge { h1 = h1, h2 = h2 } = h1 + h2
NamedFiledPuns あり
hs
{-# LANGUAGE NamedFieldPuns #-} f Hoge { h1, h2 } = h1 + h2
RecordWildCards あり
hs
{-# LANGUAGE RecordWildCards #-} f Hoge {..} = h1 + h2
{} 内で、 .. が使えるようになる


asパターンとの併用もできる
hs
f h@Hoge {..} = h
部分的な略記もできる
hs
f Hoge { h1 = 2, ..} = h2
h1 == 2 でパターンマッチしているmrsekut
Constructもできる
hs
mkHoge h1 h2 = Hoge {..}
これとか
hs
mkHoge :: Hoge mkHoge = Hoge {..} where h1 = 2 h2 = 3
これとか
hs
mkHoge :: IO Hoge mkHoge = do h1 <- getH1 h2 <- getH2 return Hoge{..} getH1 :: IO Int getH2 :: IO Int


W-missing-field警告を無視しない
このような型の元で、
hs
data Hoge = Hoge { h1 :: Int, h2 :: Int }
こう書くと、
hs
mkHoge h1 = Hoge {..}
h2 が足りないのでwarningが出る
これは無視すると実行時エラーになるので無視してはいけない



globalな状態のRecordから色々取り出す事が多いパターンだからmrsekut





参考