読者です 読者をやめる 読者になる 読者になる

必ず成功させるという設計選択

Haskell

リストの先頭要素を取得するPreludeのhead関数は、空リストを与えると失敗します。


「1要素以上なら必ず成功する」という大半の状況でうまくいく処理のためにエラーハンドリングをするのはめんどくさいですし、エラーの可能性を残すというのは不安です。現状では必ず1要素以上のリストが渡されるけど、将来もしもここの箇所に0要素で来たら落ちるかもしれないからエラーハンドリングしておこう、という、現状では無駄なコードを書くことになるかもしれません。


この問題へのアプローチとして、「必ず1要素以上が入ることが保証されたリスト」を定義することで、エラーハンドリングすらさせない、というものが考えられます。


以下はHaskellで書いたものです。

type NeverEmptyList a = (a, [a])

front :: NeverEmptyList a -> a
front xs = fst xs

main = print $ front (1, [2, 3])

このNeverEmptyList型(名前はてきとうです)は、単なる1要素とリストのタプルです。
タプルは固定長であるため、要素数が確定した状況では先頭要素を取得する処理が失敗することはありません。


このアプローチは他の言語でも比較的簡単にできます。
1要素のオブジェクトとリストを包含するクラスを、「1要素以上が入ることが保証されたリスト」として定義すればよいのです。


エラーハンドリングすらさせず必ず成功させる、という設計選択はかなり強力なんじゃないかと思います。


参考:
エラーハンドリング勉強会で発表してきました - Yet Another Ranha