はじめての型推論

ひょっとしたら型推論をサポートする言語を使っていないと、ピンとこないかも知れないので、今更ながらご紹介。

次のような、変数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を渡している行をコメントアウトするとコンパイルが通ります。