常に全域関数を定義
しよう
例えばInt -> Intという型の関数なら
全てのIntの入力を許容して、
必ずIntを返すべし
パターンマッチの漏れをなくそう
hsには警告するやつがあったはず
例えばhead関数
HaskellのPreludeでは、[a] -> aで定義されている
だが、実際は空リスト[]を適用するとerrorが起こる
つまり、入力が[]だった場合の出力が未定義(部分関数)になっている
型シグネチャが嘘を付いているmrsekut.icon
どうするか?
例えば、NonEmpty f a -> aに変える
入力側で空リストを許容しないようにする
例えば、a -> Maybe aに変える
空リストは許容するが、必ず値が返ってくるとは限らないことを明示する
Haskellにはいくつか部分関数が定義されているが使用しないようにする
head, tail
[a] -> aだが、空配列を入力に与えたときが未定義
(!!)
[a] -> Int -> aだが、要素数を超えている数値を与えたときが未定義
div
第2引数が0のときが未定義
どうするか?