0

関数型プログラミング試験の勉強中に、以前の試験で次の質問に出くわしました。

t2 = (\x -> \y -> \z -> (x y, x (x z)))

t3 = t2 (take 3 . reverse) mnr mnr

t2の場合、ステートメントの最も一般的なタイプを判別するように求められます。答えは次のようです。

(a -> a) -> a -> a -> (a,a)

WinHugsにステートメントを入力することで答えを見つけることができますが、この答えはどのようにして見つけられますか?以前の投稿から、ラムダ関数と関係があることは理解していますが、それ以外は、ここで何が起こっているのかを説明するのに迷っています。

次に、質問の2番目の部分(t3)は、変数mnrの2つのインスタンスに2つの関数を適用します。mnr = [0,1,2,3,4,5,6]の場合、次のようになります。

([6,5,4],[4,5,6])

これはどのように作動しますか?関数のテイクとリバースは明確ですが、t2のラムダ関数にどのように適用されますか?

4

2 に答える 2

6

結果として、真ん中から始めましょう。

(x y, x (x z))

x物(、、、)に適用されているyため、z疑問符が未知のタイプを表すx zタイプであることがわかります。(a -> ?)現在、の結果xはに渡されているxためx (x z)、その入力タイプはその出力タイプである必要があります。

x :: a -> a

現在、はとにx適用されるyためz、両方ともタイプである必要がありますax yまた、x (x z)両方とも型であるためa(つまり、xの戻り型であるため)、t2型の何かを返します(a, a)

これを引数の型(、、、x)と組み合わせると、次の型にyなりzます。

(a -> a) -- x's type
-> a -- y's type
-> a -- z's type
-> (a, a) -- the result type

2番目の質問として、まず、の定義内のどの変数にどのようなものがバインドされているかを見てみましょうt2。最初の引数はxなので、この場合

x = (take 3 . reverse)

次の引数はyなので、

y = mnr

同様にzの場合、

z = mnr

結果は、になるので(x y, x (x z))、これを評価しましょう

(x y, x (x z))
= ((take 3 . reverse) mnr, (take 3 . reverse) ((take 3 . reverse) mnr))
= (take 3 (reverse mnr), take 3 (reverse (take 3 (reverse mnr))))

この特定のケースではmnr = [0,1,2,3,4,5,6]

= (take 3 (reverse [0,1,2,3,4,5,6]), take 3 (reverse (take 3 (reverse [0,1,2,3,4,5,6]))))
= (take 3 [6,5,4,3,2,1,0], take 3 (reverse (take 3 [6,5,4,3,2,1,0])))
= ([6,5,4], take 3 (reverse [6,5,4]))
= ([6,5,4], take 3 [4,5,6])
= ([6,5,4], [4,5,6])
于 2012-06-20T19:16:14.623 に答える
1

t2 =(\ x-> \ y-> \ z->(xy、x(xz)))

最後のアプリケーションに注目してください。xはyに適用されるため、xは関数である必要があります。xは(xz)にも適用されるため、xは引数と同じ型を返す必要があります。

2番目の質問の意味がわかりません。mnrの2つのインスタンス?

編集:したがって、t3は単に引数に適用されるt2です(3を取ります。reverse)mnrmnr。最初の引数はt2でxとして知られていたものであり、上記でxがyに適用されてから(xz)に適用されることがわかりました。

結果は次のようになります((take 3 . reverse) mnr, (take 3 . reverse) ((take 3 . reverse) mnr))

タプルの最初の部分のmnrは、引数(y)として渡される最初のmnrです。2番目の部分の1つは、2番目の引数(z)です。もちろん、それらは同じです。

于 2012-06-20T19:02:21.743 に答える