Show と Read は文字列へ変換できるもの、文字列から変換できるものの型クラス。ある型をそれらのインスタンスにしたいなら、その型の値コンストラクタにフィールドがあれば、それらの型も Show や Read に属している必要がある。
data Person = Person { firstName :: String , lastName :: String , age :: Int } deriving (Eq, Show, Read)
これで人物の情報をターミナルに出力できる。
*Main> mikeD Person {firstName = "Michael", lastName = "Diamond", age = 43} *Main> "mikeD is: " ++ show mikeD "mikeD is: Person {firstName = \"Michael\", lastName = \"Diamond\", age = 43}"
Read は文字列を読み込む
mysteryDude = "Person { firstName = \"Michael\"" ++ ", lastName = \"Diamond\"" ++ ", age = 43 }"
読み込む
*Main> read mysteryDude :: Person Person {firstName = "Michael", lastName = "Diamond", age = 43}
read した結果どの型が返ることを期待しているのかを明示する必要がある。ただし、型推論できるような場合は不要。
*Main> read mysteryDude == mikeD True
多相型も読み取ることができる。
*Main> read "Just 3" :: Maybe a <interactive>:51:1: error: • No instance for (Read a1) arising from a use of ‘read’ Possible fix: add (Read a1) to the context of an expression type signature: Maybe a1 • In the expression: read "Just 3" :: Maybe a In an equation for ‘it’: it = read "Just 3" :: Maybe a
この場合型変数 a にどの型が入るのかわからないためエラーとなる。明示的に型を指定すると動く。
*Main> read "Just 3" :: Maybe Int Just 3
所感
:: <型>
は型注釈。というのを忘れていた。

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