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