問題タブ [combinators]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
302 参照

haskell - コンビネータを使用して有用なライブラリを設計する方法がわからない

私はコンビネータについて読んでいて、それらがどれほど有用であるかを見てきました(たとえば、HaskellのParsecで)。私の問題は、それらを実際にどのように使用するかがよくわからないことです。

問題の概要は次のとおりです。ディストリビューションは、生成、フィルタリング、および変更できます。ディストリビューションを組み合わせて、新しいディストリビューションを作成できます。

基本的なインターフェースは(疑似Haskellタイプの用語で):

今、私は3つのコンビネータを見ていると思います。

これらは実際にコンビネータですか?コンビネータは理にかなっていますか/私が見逃している他の明らかなコンビネータはありますか?

アドバイスありがとうございます。

0 投票する
1 に答える
1347 参照

javascript - JavaScript の SKI コンビネーターで Y を表現する

私は JavaScript でコンビネータをいじっていて、S を動作させることを (できれば) 誇りに思っていましたが、ウィキペディアに出くわしたとき、「Y コンビネータは、SKI 計算で Y = S (K (SII)) ( S (S (KS) K) (K (SII)))」なので、それを試してみる必要がありました。

私は何を間違っていますか?私はその表現を正しく翻訳していませんか? これについて私が行っている方法に何か問題がありますか?それは理にかなっていますか?このようなものについて読まなければならないことのほとんどは、私の脳を爆発させたくなるだけなので、この演習の主なポイントは、表記法を理解しているかどうか (したがって、JavaScript に変換できるかどうか) を確認することでした。

ああ、ところで、私が再び読んだりいじったりしたのは、prototype.js が Prototype.K として実装しているものは、実際には I コンビネータであるということでした。誰か気づいた?

0 投票する
6 に答える
941 参照

haskell - このコードを書くためのより短い方法

次のパターンは、Haskellコードで非常に頻繁に表示されます。それを書くためのより短い方法はありますか?

0 投票する
1 に答える
16954 参照

functional-programming - 働く人のためのコンビネータの説明

コンビネータとは??

「自由変数のない関数または定義」ですか(SOで定義されています)?

または、これはどうですか: John Hughesによる、Arrows に関する有名な論文によると、「コンビネータは、プログラムのフラグメントからプログラムのフラグメントを構築する関数です」。すべての詳細を手で書くのではなく、自動的にプログラムします。」彼は続けて、 とはそのようなコンビネータの 2 つの一般的な例だmapと言います。filter

最初の定義に一致するいくつかのコンビネータ:

  • S
  • K
  • To Mock a Mockingbird のその他(私は間違っているかもしれません -- 私はこの本を読んでいません)

2 番目の定義に一致するいくつかのコンビネータ:

  • 地図
  • フィルター
  • 折りたたむ/減らす(おそらく)
  • >>=、compose、fmap のいずれか ?????

私は最初の定義には興味がありません-それらは実際のプログラムを書くのに役立ちません(私が間違っていると確信したら+1)。 2 番目の定義を理解するのを手伝ってください。map、filter、reduce は便利だと思います。これらを使用すると、より高いレベルでプログラミングを行うことができます。つまり、間違いが少なくなり、コードがより短く、より明確になります。コンビネータに関する私の具体的な質問のいくつかを次に示します。

  1. マップ、フィルターなどのコンビネーターの例は何ですか?
  2. プログラミング言語がよく実装するコンビネータは何ですか?
  3. コンビネータは、より優れた API を設計するのにどのように役立ちますか?
  4. 効果的なコンビネータを設計するにはどうすればよいですか?
  5. 非関数型言語 (Java など) のコンビネーターと似ているものは何ですか? または、これらの言語はコンビネーターの代わりに何を使用していますか?

アップデート

@CA McCann のおかげで、コンビネータの理解が少し深まりました。しかし、1 つの質問がまだ私にとっての障害となっています。

コンビネータを多用して書かれた関数型プログラムとそうでない関数型プログラムの違いは何ですか?

答えは、コンビネータを多用したバージョンの方が短く、明確で、より一般的であるということだと思いますが、可能であれば、より詳細な議論をいただければ幸いです。

foldまた、一般的なプログラミング言語での複雑なコンビネータ (つまり より複雑) の例と説明も探しています。

0 投票する
5 に答える
5409 参照

ruby - タップのような組み合わせメソッドですが、別の値を返すことができますか?

私は一時変数を避け、より流動的なコーディングスタイルを使用できる条件付きの過剰使用を回避しようとする段階を経ています。返品する必要のある価値を手に入れたい場所で使用するのがとても好き#tapですが、返品する前に何かをしてください。

対 手順:

明らかに上記の例は単純ですが、それでもこれはルビーコミュニティではかなり一般的なコーディングスタイルです。#injectオブジェクトを一連のフィルターに通すためにも使用することがあります。

対 手順:

今、私は次のような条件の繰り返しの使用に直面しており、それを処理するためのより流動的なアプローチを探しています。

(わずかに)よりクリーンな解決策は、重複を犠牲にして一時変数を回避することです。

でも、ここのようなものを使いたいという気持ちを感じずにはいられませ#tap

ここで他にどのようなパターンに従うことができますか。これはすべて一部の人にとっては無意味な砂糖であり、もっと興味深い問題に移るべきだと思いますが、もっと機能的なスタイルで書くことを学ぼうとしているので、長期的なルビイストが何を決定したのか興味がありますこのような状況に取り組む良い方法であるために。これらの例は非常に単純化されています。

0 投票する
2 に答える
174 参照

python - このコンビネータに名前はありますか?

この関数 f は引数リストを受け入れ、同じ引数リストを持つ別の callable を返すため、他の関数をそれに適用できます。

あなたは何と呼んでいますfか?これはある種のコンビネーターですか?

0 投票する
2 に答える
1581 参照

haskell - スーパーコンビネータと一定の適用形式とは何ですか?

私はスーパーコンビネータとは何かに苦労しています:

スーパーコンビネータは、定数、またはサブ式としてスーパーコンビネータのみを含むコンビネータのいずれかです。

また、ConstantApplicativeFormsとは次のとおりです。

ラムダ抽象化ではないスーパーコンビネータ。これには、12、((+)1 2)、[1,2,3]などの真に定数の式と、((+)4)などの部分的に適用される関数が含まれます。この最後の例は、eta抽象化では、CAFではない\ x->(+)4xと同等であることに注意してください。

これは私には意味がありません!((+) 4)12と同じくらい「本当に一定」ではありませんか?CAFは、私の単純な心には価値観のように聞こえます。

0 投票する
5 に答える
623 参照

haskell - ポイントフリースタイルで関数を書くための一般的なスキームは何ですか?

私は現在、 20 の中級 Haskell 演習に取り組んでいますが、これは非常に楽しい演習です。Functorこれには、型クラスand Monad(およびFunctors とs を引数として取る関数)のさまざまなインスタンスを実装する必要がありますが、andMonadのようなかわいらしい名前を付けて、実行していることを偽装します (興味深いコードを作成します)。FurryMisty

私はこれのいくつかをポイントフリー スタイルで実行しようとしてきましたが、ポイントフル (?) 定義をポイントフリー定義に変換するための一般的なスキームがあるかどうか疑問に思いました。たとえば、 の型クラスは次のとおりですMisty

(関数unicornbananareturn>>=であり、明らかでない場合に備えて)、これがapple( に相当するflip ap)の実装です。

演習の後半ではliftMliftM2などのバージョンを実装します。私の解決策は次のとおりです。

さて、 (またはbanana1と同等) の適切な定義により、無意味なスタイルで実装することができました。しかし、他の 3 つの関数では、パラメーターを使用する必要がありました。liftMfmapappleTurnover

私の質問は次のとおりです。これらのような定義を無意味な定義に変えるためのレシピはありますか?