fugafuga.write

日々のログ

すごいH本 part43

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

所感

:: <型> は型注釈。というのを忘れていた。

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

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

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