Amosapientiam

備忘録

型で仕様を表す

整数を受け取って整数を返す関数のつもりで、私が以下の関数を書いたとします。

// 仕様:この関数は整数を受け取って整数を返す関数だよ!
let my_clever_function x = "hello!"

上のプログラムは当然コンパイルできますし、私は仕様どおり正しい実装を書けた気がしています。何も問題ありません...ほんとに?

心配になったのでコメントに書かれていた仕様を型で書きなおすことにしました。

val my_clever_function : int -> int
let my_clever_function x = "hello!"

これをコンパイルしようとすると、コンパイラは以下のように間違いを指摘してくれます。

  • 整数型の式を書いてくれると思っていた場所に、文字列型の"hello!"という式が書いてあるよ!

たったしかに〜〜〜!!全然気づかなかった!!!

...というように、型を明示することで、式にその型を付けられるかどうかコンパイラがチェックしてくれます。 型には「コンパイラからも読める仕様」「コンパイラがチェックしてくれる仕様」としての一面があるのです。