1

コードに再帰ラムダを含めることに興味があったため、修正について読んでいるときに、この特定のコード例に出くわしました(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) がこの行を評価する際にどこで問題が発生したのでしょうか?

4

1 に答える 1

1

ラムダの型は次のように読み取ることができます。

(b -> b) -> (b -> b)

これにより、 に提供するとどうなるかが明確になる場合がありますfix。戻り値は、例b -> bの引数ですぐに適用される別の関数5です。

于 2016-03-02T15:03:52.083 に答える