最後のステートメントから関数の戻り型を推測できるカスタム言語を実装しようとしています。ただし、直接または間接の再帰関数呼び出しが見つかった場合、型推論システムは明らかに失敗します。
func factorial(a:int) ->
if a == 0
1
else
a * factorial(a - 1)
たとえば、F#は、引数の型が指定されていない場合でもこれを行います。
let rec fact i =
if i = 0 then 1 else i * fact (i-1)
このシステムはどのように機能しますか?