Haskellの言語拡張たち 2

前のやつ の続き。

今回調べた拡張

  • レコード系
    • RecordWildCards
  • 型系
    • ExistentialQuantification

RecordWildCards

レコードワイルドカードが使える。
レコードパターン中で .. とすれば、レコード内のフィールドを一気に束縛したり、現在のスコープの変数から与えたりできる。

{-# LANGUAGE RecordWildCards #-}

data Ele = Ele { a :: Int, b :: Int, s1 :: String, s2 :: String }

-- RecordWildCards 拡張が必要
create :: Ele
create = Ele { b = 2, ..}
 where
  a = 3
  s1 = "hoge"
  s2 = "piyo"

-- RecordWildCards 拡張が必要
str :: Ele -> String
str (Ele { a = 1, ..}) = s1
str (Ele { a = 2, ..}) = s2
str (Ele { a = 3, ..}) = s1 ++ s2
str (Ele {..}) = s1

main = putStrLn . str $ create
$ runhaskell record_wildcarts.hs
hogepiyo

ExistentialQuantification

存在量化されたデータ構築子が書ける。
型クラスをインタフェースのように使った動的多態のようなことができる。

{-# LANGUAGE ExistentialQuantification #-}

-- ExistentialQuantification 拡張が必要
data Ele = forall a . (Show a) => Ele a

instance Show Ele where
  show (Ele x) = show x

eles :: [Ele]
eles = [Ele "hoge", Ele 1, Ele (3,6), Ele $ Just 2, Ele [4,3], Ele ["a", "b"], Ele 1.23]

main = putStrLn . unlines $ show `map` eles
$ runhaskell existential_quantification.hs
"hoge"
1
(3,6)
Just 2
[4,3]
["a","b"]
1.23