私は、通常私が使用する言語でアルゴリズムWを実装することで、ヒンドレーミルナー型の推論を教えようとしています、Clojure。私はlet
推論の問題に遭遇しています。私が何か間違っているのか、私が期待している結果がアルゴリズム以外のものを必要としているのかどうかはわかりません。ヒンドレー・ミルナーの推論を聞きました
Num a => t -> a
しかし、私はこれを取得する必要があります:
Num a => a -> a
を、私はこれを取得
\a -> let b = a in b + 1
:私はこのタイプを推測しようとした場合、Haskellの表記法を使用して、基本的に
、
もう一度、私は実際にClojureでこれをやっていますが、問題はClojure固有であるとは思わないので、私はHaskellの表記法を使っていますそれをもっと明確にする。私がハスケルでそれを試してみると、私は期待される結果を得る。
とにかく、私は例えば、機能のアプリケーションにすべてのlet
を変換することにより、その特定の問題を解決することができます:
\a -> (\b -> b + 1) a
しかし、その後、私はlet
多型を失います。私はHMの事前知識がないので、ここで何かが紛失しているのか、それともアルゴリズムがうまくいくのかということです。
EDIT誰でも同様の問題があり、私はそれを解決する方法不思議場合
、私はAlgorith W Step By Stepに従っていました。 2ページの最後には、「タイプのメソッドをリストに拡張することが時々役に立ちます。」それは私には必須の音ではなかったので、私はその部分をスキップして後で再訪することに決めました。
TypeEnv
の機能を次のように直接Clojureに翻訳しました:(ftv (vals env))
。 ftv
をcond
という形式で実装していたので、seq
の句がないため、(vals env)
の場合はnil
と返されました。これはまさに静的型システムが捉えるように設計されたバグです。とにかく、env
のマップに関するftv
の句を(reduce set/union #{} (map ftv (vals env)))
と改めただけです。
あなたは正しい方向に私を指摘しました。問題は、私が環境内の自由型変数をどのように扱っているかにありました。ありがとう! – grandinero