generated at
常に全域関数を定義
しよう
逆に言うと、部分関数を定義しないようにしようということ
型は仕様なので型シグネチャに嘘を付くなという話



例えば Int -> Int という型の関数なら
全ての Int の入力を許容して、
必ず Int を返すべし
パターンマッチの漏れをなくそう
hsには警告するやつがあったはず


例えば head 関数
HaskellのPreludeでは、 [a] -> a で定義されている
だが、実際は空リスト [] を適用するとerrorが起こる
つまり、入力が [] だった場合の出力が未定義(部分関数)になっている
型シグネチャが嘘を付いているmrsekut
どうするか?
例えば、 NonEmpty f a -> a に変える
入力側で空リストを許容しないようにする
例えば、 a -> Maybe a に変える
空リストは許容するが、必ず値が返ってくるとは限らないことを明示する



Haskellにはいくつか部分関数が定義されているが使用しないようにする
head , tail
[a] -> a だが、空配列を入力に与えたときが未定義
(!!)
[a] -> Int -> a だが、要素数を超えている数値を与えたときが未定義
div
第2引数が0のときが未定義
どうするか?
例えばこのように書きかえる
Custom Preludeでpartial functionsを除いているものを使う