これら2つの手順(JavaScriptで書かれています)とhellipを指定すると、プロシージャの実装に基づいてプロシージャのHM型を派生させるには?
// comp :: (b -> c) -> (a -> b) -> (a -> c)
const comp = f=> g=> x=> f (g (x))
// comp2 :: (c -> d) -> (a -> b -> c) -> (a -> b -> d)
const comp2 = comp (comp) (comp)
私の質問は、私たちがcomp
の実装を知っている場合、それは簡単&hellipだの実装
'comp
を参照なしのHindley-Milner Type' comp2
を導出する方法です。展開モデル&hellipに到達するためには、評価全体を通じて置換モデルを使用できます。
comp (comp) (comp)
= (f => g => x => f (g (x))) (comp) (comp)
= x => comp (comp (x))
= y => comp (comp (y))
= y => (f => g => x => f (g (x))) (comp (y))
... keep going until ...
= f=> g=> x=> y=> f (g (x) (y))
Ring-a-ding。拡大評価はcomp2
のタイプと一致します。誰も感銘を受けません。
// comp2 :: (c -> d) -> (a -> b -> c) -> (a -> b -> d)
const comp2 = f=> g=> x=> y=> f (g (x) (y))
しかし、私たちが唯一comp
のタイプを知っていたし、はないその実装をご存知でしたか?もし型を決定するためにコードを評価する代わりに、comp2
の型になるようにcomp
の型の置換/評価を実行できましたか?
この場合、問題はもっと難しくなります。 (少なくとも私のために)
ちょっと道がありますか?これは何ではないalgebraic data typesはすべてについてですか?
のは私の質問を明確にするために簡略化した例を見てみましょう:私たちはadd
とmap
&hellipのような機能を持っている場合。
// add :: Number -> Number -> Number
// map :: (a -> b) -> [a] -> [b]
我々はmap
とadd
を使用して関数を定義したい場合は、我々はタイプを把握できたが、体系
// add :: Number -> Number -> Number
// map :: (a -> b) -> [a] -> [b]
// add6 :: Number -> Number
let add6 = add (6)
// mapAdd6 :: [Number] -> [Number]
let mapAdd6 = map(add6)
add
またはmap
の実装を知らなくても、これは本当に強力であることので実装を掘り進むことなく、あなたが作っていなかったコードを推論することができます(それだけ)
comp2
例でそれをやろうとしたときにしかし、私は、我々が知っているか見てみましょうMILNER
すばらしい説明。ありがとう^ _ ^ – naomik