ラムダ計算におけるλx.λf.fxの名前は何ですか?
対応する関数は、Haskellのような関数型プログラミング言語の標準名を持っていますか?
オブジェクト指向プログラミングではfoo
、引数として関数を受け取るメソッドに通常の名前がありx.foo(f)
ますf(x)
か?
ラムダ計算におけるλx.λf.fxの名前は何ですか?
対応する関数は、Haskellのような関数型プログラミング言語の標準名を持っていますか?
オブジェクト指向プログラミングではfoo
、引数として関数を受け取るメソッドに通常の名前がありx.foo(f)
ますf(x)
か?
回答:
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期待している
(\f.\x.\y.f y x) (\f.\x.f x)
が(\x.\f.f x)
モジュロの名前変更に減ることを疑いますか?それはします。
標準のコンビネータを使用すると、この関数を次のように表現できます
C I
どこ
C f x y = (f y) x
Haskellでは
flip id
ここid
のタイプはに特化し(a -> b) -> a -> b
ていてflip
スワップa -> b
しa
ます。
SKI計算でそれを表現することもできます:
S (K (S I)) K
元のアロンゾ教会の「ラムダ変換の計算」では、彼はこのコンビネーターをTで示しています。
教会の数字の文脈では、expと呼ばれます。これは、用語Nを用語Mに「適用」するために教会が使用する「略記法」表記と一致します。「[ M N ]」は「(NM)」を表します。
プログラミングにおける類似の機能の標準的な名前はまだ聞いていません。
これは、ツグミコンビネーターと呼ばれることもあり、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)
私はあなたの質問を正しく理解することを望みますが、これは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にヒントを得た言語の基本的なものです。<|
あまり一般的ではなく、通常、読みやすさが向上した場合にのみ使用されます。