haskell

Haskellで例外が出るケース

Haskellは実行時の例外がとても少ない言語として知られていますが、それでも出るケースはあります。

Haskell Programming from first principalsという本を読んでいて一つ面白い例を知りました。

Chapter 11.11の最後の方に書かれています。

本の例ほぼそのままですが、以下のようなデータ型を定義してしまうと、レコードのフィールドにアクセスした時に例外が出る可能性があります。

data Person
  = Null
  | Person
      { name :: String
      , age  :: Int
      }
  deriving (Show, Eq)

-- これはOK
personName :: String
personName = name $ Person "Keanu" "35"

-- これは例外が出る
nullPersonName :: String
nullPersonName = name Null

本にも書いてある通りこれはやってはいけない定義の仕方で、もしPersonが無い場合があるならMaybeやEitherなどを使えば良いだけです。
ただ少し驚いたのは、nullPersonNameのようにフィールドへのアクセサをNullに適用する書き方は、型検査をパスしてしまうことです。

試してませんが、異なるフィールドを持つレコードを上と同じように直和で複数つないでしまう定義もできそうですね。
こういうデータを定義しようと考えたことがありませんでしたが、気をつけましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です