この機能的な「パターン」とは何ですか?
-
22-07-2019 - |
質問
この関数の必要性に出くわしたとき、いくつかの関数型プログラミングにだまされていましたが、標準的な命名法でこの種のものが何と呼ばれるかわかりません。 誰もがそれを認識していますか?
function WhatAmIDoing(args...)
return function()
return args
end
end
編集:関数を一般化して、可変量の引数(または暗黙的なリスト)を取り、呼び出されるとすべての引数を返す関数を返します。これはカレーやピクルスのようなものですが、どちらでもないようです。
解決
WhatAmIDoingは、別の関数を返す関数であるため、高階関数です。
返されるのは、サンクです。実価。通常、サンクは式を遅延評価(および場合によってはメモ)するために作成されますが、他の場合は、" constantly 5
&quotの場合のように、裸の値の代わりに関数が必要です;、一部の言語では常に5を返す関数を返します。
後者は与えられた例に当てはまるかもしれません。なぜなら、言語が適用順序で評価する(つまり、関数を呼び出す前に引数を評価する)と仮定すると、関数は値をそれらを返す関数に変える以外の目的を果たさないからです。
WhatAmIDoingは、実際には" constantly"の実装です。私が説明していた機能。ただし、一般に、内部関数で args
を返すだけではありません。 " ackermann(args)
"を返すことができますが、次のように時間がかかる可能性があります...
function WhatAmIDoing2(args...)
return function()
return ackermann(args)
end
end
しかし、 closure 。 (はい、call-by-value言語でも。)
他のヒント
関数型プログラミングでは、別の関数を引数として取る関数または別の関数を返す関数は、 higher-と呼ばれます。注文関数。
XXXXは、x、y、zの値にバインドされた名前のない関数の closure を返します。
この wikipedia の記事は、いくつかの光を放つ可能性があります
Currying は、関数をそれぞれ1つのパラメーターのみをとる関数のチェーンに変換することです。そして別のそのような関数を返します。したがって、この例はカリー化とは関係ありません。
Picklingは、通常、何らかのシリアル化を示すために使用される用語です。多分複数の値から構築されたオブジェクトを保存するため。
興味のある側面が、返された関数がXXXX関数の引数にアクセスできることである場合、Remo.Dを使用します。
他の人が言ったように、それは高階関数です。 「パターン」があるようにあなたの質問で、私は機能言語のこの機能はしばしば strategy pattern 高階関数のない言語。
非常によく似たものは、Clojureでは constantly
と呼ばれます:
constantly
が返す関数のみが任意の量の引数を取り、パターンよりも一般的(かつ柔軟)にします。
このパターンに名前があるかどうかはわかりませんが、通常は関数が期待される場合に使用しますが、気にするのは特定の値が返されることだけです:
(map (constantly 9) [1 2 3])
=> (9 9 9)
不思議に思って、これを何に使うのですか?
デリゲート?
基本的には関数を返しますか?または関数の出力?
理解できませんでした、申し訳ありません...