コードに再帰ラムダを含めることに興味があったため、修正について読んでいるときに、この特定のコード例に出くわしました(Hereから):
fix (\rec n -> if n == 0 then 1 else n * rec (n-1)) 5
fix の型シグネチャを無視すると、そのコードに何か問題があるように感じます。
修正(a -> a) -> a
のタイプはラムダのタイプですが、(a -> a) -> a -> a
このコードを間違って読んでいると確信していますが、最初に読んだ方法は「修正は2つの引数に適用されます」でした。修正は1つの引数しか受け入れないため、これは間違っています、関数 (a -> a)、明らかに欠けているものがあるに違いありません。
a -> a -> a
次に、ラムダのタイプと修正のタイプを調べたところ、「ちょっと待ってください。大きな不一致はありませんか? カリー化された関数を使用すると、引数が不十分なタイプの関数をフィードできることがわかります。新しい関数を作成しますが、ここでは関数にフィード(a -> a) -> a -> a
し(a -> a) -> a
ています。間違った引数を修正関数にフィードして、象をピンホールに通そうとしているようです。
内部パーサーと型チェッカー (brain 1.0) がこの行を評価する際にどこで問題が発生したのでしょうか?