2

ラムダ計算の問題を解かなければなりません。特定のポイントに達しましたが、続行する方法がわかりません:

h f x = \g -> g (f x g)

(h::a1 f::a2 x::a3)::a4 = (\g -> g::a5 (f::a2 x::a3 g::a5)::a6)::a4

a1 = a2 -> a3 -> a4
a2 = a3 -> a5 -> a6
a5 = a6 -> a4

a1 = (a3 -> a5 -> a4) -> a3 -> a4
a1 = (a3 -> (a6->a4) -> a4) -> a3 -> a4

仕上げる方法はありますか?「a1,a2,a3...」を使用して、要素または関数の型を表します。たとえば、1::Int、2.4::Float、f::a1、x::a3 などです。それが十分に明確かどうかはわかりません...

どうもありがとう!!

4

1 に答える 1

3

あなたは間違いを犯しました。g=a5: a6 -/-> a4.2行目のブラケットが間違っています。

h f x = \g -> g (f x g)

(h::a1 f::a2 x::a3)::a4 = (\g -> (g::a5 (f::a2 x::a3 g::a5)::a6)::a7)::a4

a1 = a2 -> a3 -> a4
a2 = a3 -> a5 -> a6
a5 = a6 -> a7
a4 = a5 -> a7

a1 = (a3 -> a5 -> a6) -> a3 -> a4
a1 = (a3 -> (a6->a7) -> a6) -> a3 -> a5 -> a7
a1 = (a3 -> (a6->a7) -> a6) -> a3 -> (a6 -> a7) -> a7

fun h f x = (fn g => g (f x g) )したがって、これは h の正しい型です ( SML プロンプトに入力してまったく同じ結果を得るだけで、妄想的かどうかを確認できます。適切な構文の Haskell についても同様です)。h は多相関数なので、a はすべて任意ですが、h の引数の型と h を適用した結果の引数の関係などを表します。

于 2011-08-31T13:28:26.673 に答える