これは宿題の質問です。
部分的なパラメーター化でルーチンの型が受ける変換を説明してください。
これまでのところ、カレーについて理解しています。しかし、このような関数がコンパイラによってメモリ内に実装される方法に関するリソースは見つかりません。検索するキーワードやリソースへのリンク、または質問に関連する他のものの中でコンパイラがどのように型とシンボルテーブルを生成するかについてのここでの説明かもしれません。
ありがとう。
これは宿題の質問です。
部分的なパラメーター化でルーチンの型が受ける変換を説明してください。
これまでのところ、カレーについて理解しています。しかし、このような関数がコンパイラによってメモリ内に実装される方法に関するリソースは見つかりません。検索するキーワードやリソースへのリンク、または質問に関連する他のものの中でコンパイラがどのように型とシンボルテーブルを生成するかについてのここでの説明かもしれません。
ありがとう。
カリー化とは、n個の引数関数をn個の単項関数に変換することです。
たとえば、三項関数f :: t1 x t2 x t3-> tがある場合、この関数を次のように表すことができます。
f1 :: t1 -> (t2 -> (t3 -> t))
つまり、f1は、タイプt1の引数を取り、タイプf2の関数を返す関数です。
f2 :: t2 -> (t3 -> t)
f2は、タイプt2の引数を取り、タイプf3の関数を返す関数です。
f3 :: t3 -> t
f3は、タイプt3の引数を取り、タイプtを返す関数です。
たとえば、f(a、b、c)= a + b * cの場合、次のようになります。
f3(C) == c1+c2*C where c1 and c2 are constant.
f2(B) == f3(C) where c1 is constant and c2 is replaced with B.
f1(A) == f2(B) where c1 is replaced with A.
関数型言語では、関数は第一級市民であるため、戻り型として持つのが一般的です。
カリー化は、関数のパラメーターを修正するようなものです。本当に変更する必要があるのは、呼び出された関数のプロトタイプです。たとえばretn_type function(param1, param2)
、最初のパラメーターでカリー化した場合、それを固定値に設定するとretn_type(param2)
、別の方法で呼び出して渡すことができる新しい関数を取得できます。オリジナルのものから。
実際には、コンパイラでさまざまな方法やハックで取得できますが、その単純さの核心は、最初のバージョンにリンクされている新しいバージョンを再定義することです。したがって、呼び出すときretn_type(param2)
は、parameter1がcurryficationによって指定されていると仮定して、最初の関数と同じコードを実行します。