ラムダ計算におけるλx.λf.fx(逆適用のような)の名前は何ですか?対応する関数にはプログラミングの標準名がありますか?


15

ラムダ計算におけるλx.λf.fxの名前は何ですか?

対応する関数は、Haskellのような関数型プログラミング言語の標準名を持っていますか?

オブジェクト指向プログラミングではfoo、引数として関数を受け取るメソッドに通常の名前がありx.foo(f)ますf(x)か?


3
辞書を買う必要があります。
ロバートハーヴェイ

13
どれ?どこ?いくら?
アレクセイ

4
投票権がわかりません。それは私にとって完全に合理的な質問のようです。
ジョルジオ

私は以下の回答を掲載しているが、私は削除したので、私はOPは、このラムダ式の名前が何であるかを尋ねたことに気づい= D
ジェイソン・

あなたがコンビネータとして知られている参照概念、あなたが慣れていない場合は、ここでの読み取りを持ってen.wikipedia.org/wiki/SKI_combinator_calculus私はあなたがかかわらを参照してください自然の既知のコンビネータに慣れていないんだけれども、CからBCKWは(それのフリップ)近いがありません同じ en.wikipedia.org/wiki/B,C,K,W_systemいくつかの楽しみを持っており、それらのコンビネータの組み合わせを思い付くない理由:)あなたの関数で結果
ジミー・ホッファ

回答:


9

Haskellでは、\x.\f.f xあるflip ($)としてどの$ように読まれている適用、私はのように読んでいました、逆適用されます

ほぼ/programming/4090168/is-there-an-inverse-of-the-haskell-operatorに基づいています


この間違った...フリップは\f.\x.\y.f y xフリップがここにCであるen.wikipedia.org/wiki/B,C,K,W_system
ジミー・ホッファ

また、追加し$、このように反転させることは、あなたが部分的にすべてをかけるように、最後の2反転しようとしている2つの引数を引き継ぎ、部分的に適用された機能が、これらの2期待している
ジミー・ホッファ

6
だから、それ(\f.\x.\y.f y x) (\f.\x.f x)(\x.\f.f x)モジュロの名前変更に減ることを疑いますか?それはします。
ダンD.

5

標準のコンビネータを使用すると、この関数を次のように表現できます

C I

どこ

C f x y = (f y) x

Haskellでは

flip id

ここidのタイプはに特化し(a -> b) -> a -> bていてflipスワップa -> baます。

SKI計算でそれを表現することもできます:

S (K (S I)) K

このためのコンビネータを推測するための+1。私は本当に彼が教会の数字に関連し、それの何かを特定している場合、CIはanyonesの教会数字研究のどこに該当するとして文書化されている場合、私は不思議に傾いていても、それは、あまり知られていることだ疑いはありません
ジミー・ホッファ

5

元のアロンゾ教会の「ラムダ変換の計算」では、彼はこのコンビネーターをTで示しています。

教会の数字の文脈では、expと呼ばれます。これは、用語Nを用語Mに「適用」するために教会が使用する「略記法」表記と一致します。「[ M N ]」は「(NM)」を表します。

プログラミングにおける類似の機能の標準的な名前はまだ聞いていません。


3

これは、ツグミコンビネーターと呼ばれることもあり、Clojureではスレッドファーストマクロと呼ばれます。それの主な用途は、あなたは彼らが実行順序でチェーン一連の計算などの計算を表現することが可能である。例えば、値を取るx関数に渡し、fその後の結果を渡し、f(x)関数にg、のように記述されるだろうg(f(x))標準の関数構成を使用しg (f x)ます(または暗黙的な括弧を使用している場合)。チェーンされた関数が多数ある場合、実行方法と逆の順序でそれらを読み取る必要があるため、これは厄介な場合があります。ツグミのコンビネーターを次のように定義すると、ツグミのコンビネーターでこれを別の方法で表現できます。

T x f = f x
T x f g ... = T (T x f) g ...

すると式はにT x f g hなりh (g (f x))ます。

(より多くの情報と、ラケット言語での具体的な実装を探している人のために、私は主題に関するブログ記事を持っています:ラケットのThrush Combinator


2

私はあなたの質問を正しく理解することを望みますが、これはML言語で(逆)パイプ演算子として知られていると思います。

[1; 2; 3] |> List.map sq // let it = [1; 4; 9]

操作の順序を支援するリバースパイプオペレーターもあります。

printf "The value is.." <| 2 + 3 // let it = "The value is..5"

パイプされていないフォームは

printf "The value is.." 2 + 3 ;; error

"The value is.." 2定義された+演算子がないため、printfは評価とエラーを試みるため、エラーになります。それを機能させるには、括弧を使用します。

printf "The value is.." (2 + 3) // let it = "The value is..5"

実際の使用に関しては、|>オペレーターは非常に便利であり、F#、LiveScript、Elixirなど、多くのMLおよびMLにヒントを得た言語の基本的なものです。<|あまり一般的ではなく、通常、読みやすさが向上した場合にのみ使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.