RecordWildCards
recordを引数に取る時に、field名を略記する
ただし、これらは別物なのでRecordWildCardsを有効にしても、自動でNamedFieldPunsも有効になったりはしない
何が変わるのか
こういう型があったときに
code:hs
data Hoge = Hoge { h1 :: Int, h2 :: Int }
通常では
code:hs
f Hoge { h1 = h1, h2 = h2 } = h1 + h2
NamedFiledPunsあり
code:hs
{-# LANGUAGE NamedFieldPuns #-} f Hoge { h1, h2 } = h1 + h2
RecordWildCardsあり
code:hs
{-# LANGUAGE RecordWildCards #-} f Hoge {..} = h1 + h2
{}内で、..が使えるようになる
code:hs
f h@Hoge {..} = h
部分的な略記もできる
code:hs
f Hoge { h1 = 2, ..} = h2
h1 == 2でパターンマッチしているmrsekut.icon
Constructもできる
code:hs
mkHoge h1 h2 = Hoge {..}
これとか
code:hs
mkHoge :: Hoge
mkHoge = Hoge {..}
where
h1 = 2
h2 = 3
これとか
code:hs
mkHoge :: IO Hoge
mkHoge = do
h1 <- getH1
h2 <- getH2
return Hoge{..}
getH1 :: IO Int
getH2 :: IO Int
このような型の元で、
code:hs
data Hoge = Hoge { h1 :: Int, h2 :: Int }
こう書くと、
code:hs
mkHoge h1 = Hoge {..}
h2が足りないのでwarningが出る
これは無視すると実行時エラーになるので無視してはいけない
globalな状態のRecordから色々取り出す事が多いパターンだからmrsekut.icon
参考