はじめての型推論
ひょっとしたら型推論をサポートする言語を使っていないと、ピンとこないかも知れないので、今更ながらご紹介。
次のような、変数x,yを足す関数を定義し、コンパイルします。
def add (x, y) { x + y }
すると、当然のごとく、
app.n:2:5:2:10: error: typing fails on operator `op_Addition' on ? and ?
型が指定されていないので、+演算子が定義されていないと怒られます。
では、もうちょっとコンパイラにヒントを出します。
def add (x, y) { x + y } add (1, 2);
今度のコードでは、実際にadd関数を呼び出しています。引数に整数を渡しているので、コンパイラはaddの引数はintだと推論し、先ほどのエラーは無くなります。しかし、今度は、
app.n:2:5:2:10: error: expected void, got int in call result: the types int and void are not compatible [simple unify]
戻り値が無いはずなのに、add関数はintを返しているのでおかしいと言い出します。これは、add関数の呼び出しで戻り値を拾っていないため、コンパイラはadd関数には戻り値が無いと推論しているのです。なかなか分かってくれなくてもどかしいですが、もう少しヒントをあげてみましょう。
def add (x, y) { x + y } def asn = add (1, 2);
これでコンパイラは推論することが出来ました。ただし、型推論は厳密に型を認識しますので、
def add (x, y) { x + y } def asn = add (1, 2); def str = add ("Hello", "World");
このように引数をintで推論させておいて、文字列を渡すと当然コンパイルエラーになります。もちろん、引数1,2を渡している行をコメントアウトするとコンパイルが通ります。