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
に適用する書き方は、型検査をパスしてしまうことです。
試してませんが、異なるフィールドを持つレコードを上と同じように直和で複数つないでしまう定義もできそうですね。
こういうデータを定義しようと考えたことがありませんでしたが、気をつけましょう。