fugafuga.write

日々のログ

すごいH本 part45

型シノニムの話

[Charl] と String は同値でこれは型シノニムを使って実装されている。型シノニムはある方に別の名前を与えて、コードやドキュメントを読みやすくする。

このように書く

type String = [Char]

この型宣言と

toUpperString :: [Char] -> [Char]

この型宣言は同じ

toUpperString :: String -> String

後者の方が読みやすい

電話帳のリストの型シノニム

これを

phoneBook :: [(String, String)]
phoneBook =
  [("betty", "555-2938")
  ,("bonnie1", "334-8878")
  ,("bonnie1", "334-8877")
  ,("bonnie1", "334-8876")
  ,("bonnie1", "334-8875")
  ,("bonnie2", "334-8878")
  ,("bonnie3", "334-8878")
  ,("bonnie3", "335-8878")
  ,("bonnie4", "334-8878")
  ]

こう

type PhoneNumber = String
type Name = String
type PhoneBook = [(Name, PhoneNumber)]

phoneBook :: PhoneBook
phoneBook =
  [("betty", "555-2938")
  ,("bonnie1", "334-8878")
  ,("bonnie1", "334-8877")
  ,("bonnie1", "334-8876")
  ,("bonnie1", "334-8875")
  ,("bonnie2", "334-8878")
  ,("bonnie3", "334-8878")
  ,("bonnie3", "335-8878")
  ,("bonnie4", "334-8878")
  ]

inPhoneBook :: Name -> PhoneNumber -> PhoneBook -> Bool
inPhoneBook name pnumber pbook = (name, pnumber) `elem` pbook

実行結果

*Main> inPhoneBook "betty" "555-2938" phoneBook
True

型宣言の表現力が上がるが、型シノニムの使いすぎは良くないらしい。型シノニムを使う場面としては、

  • 自作の関数内で既存の型が何を表しているか示す場合
  • 長々しい型 [(String, String)] のような が自作の関数の文脈で何か特定のものを表現している場合

所感

エイリアスみたいなものか。それにしても7章が長い...

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

  • 作者: MiranLipovaca
  • 出版社/メーカー: オーム社
  • 発売日: 2017/07/14
  • メディア: Kindle版
  • 購入: 4人 クリック: 9回
  • この商品を含むブログを見る