RecordWildCards
recordを引数に取る時に、field名を略記する
ただし、これらは別物なので RecordWildCards
を有効にしても、自動で NamedFieldPuns
も有効になったりはしない
何が変わるのか
こういう型があったときに
hsdata Hoge = Hoge { h1 :: Int, h2 :: Int }
通常では
hsf 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
{}
内で、 ..
が使えるようになる
部分的な略記もできる
hsf Hoge { h1 = 2, ..} = h2
h1 == 2
でパターンマッチしている

Constructもできる
hsmkHoge h1 h2 = Hoge {..}
これとか
hsmkHoge :: Hoge
mkHoge = Hoge {..}
where
h1 = 2
h2 = 3
これとか
hsmkHoge :: IO Hoge
mkHoge = do
h1 <- getH1
h2 <- getH2
return Hoge{..}
getH1 :: IO Int
getH2 :: IO Int
このような型の元で、
hsdata Hoge = Hoge { h1 :: Int, h2 :: Int }
こう書くと、
h2
が足りないのでwarningが出る
これは無視すると実行時エラーになるので無視してはいけない
globalな状態のRecordから色々取り出す事が多いパターンだから

参考