見出し画像

💎コンビネータと高階関数(higher-order function)の違い Ocamlのマニュアルとか調べ 関数を引数にとるひとたち Tacit(暗黙の)プログラミング

コンビネータ理論とラムダ計算が親戚みたいなもので、コンビネータは高階関数(higher-order function)

不動点コンビネータとは引数関数の固定点を返す高階関数である

https://en.wikipedia.org/wiki/Fixed-point_combinator

関数を引数/返り値とする ような関数を高階関数(higher-order function)と呼ぶ.

https://www.fos.kuis.kyoto-u.ac.jp/~igarashi/class/isle4-05w/mltext/ocaml005.html

関数の抽象化を表すラムダ式を、自由変数を持たない原始関数であるコンビネータに置き換えたものである。

https://en.wikipedia.org/wiki/Combinatory_logic

Tacit(暗黙の)プログラミングは、ポイントフリースタイルとも呼ばれ、関数定義が操作する引数(または「ポイント」)を特定しないプログラミングパラダイムである。関数定義は、引数を操作するコンビネータを含む他の関数を単に合成するだけである。Tacitプログラミングは、合成を厳密に行うことで等式推論に適したプログラムが得られるため、理論的にも興味深い[1]。 また、APLとその派生言語[2]、Forthなどの連結型言語など、特定のプログラミング言語では当然のスタイルとされている。

https://en.wikipedia.org/wiki/Tacit_programming

そしてディスってくるWIKIPEDIA フリースタイルだけに

引数の命名がないため、ポイントフリースタイルは不必要に曖昧であるという評判があり、それゆえ "pointless style "という蔑称がある

ポイントレス(的を得ない)と揶揄されている、一体誰に…
パイソンの例があった
def example(x):
    y = foo(x)
    z = bar(y)
    w = baz(z)
    return w
これをこー
from functools import partial, reduce
def compose(*fns):
    return partial(reduce, lambda v, fn: fn(v), fns)

example = compose(foo, bar, baz)

なるほど、メソッドチェーンとかパイプに似ている。パイプの例も出てくる

Javascriptでみるコンビネータの違い

高階関数 (Higher-order function)

  • 高階関数は、他の関数を引数として取ったり、関数を結果として返したりする関数を指します。

  • 高階関数は、関数型プログラミングの中核的な概念で、関数を第一級のオブジェクトとして扱う言語の特性を活かしています。

  • 例:map, filter, reduce などの関数は高階関数です。これらは関数を引数として受け取り、リストやシーケンスに対してその関数を適用します。

  • コンビネータ (Combinator)

    • コンビネータは、自身の定義に外部の変数を一切使用しない、閉じた関数を指します。つまり、コンビネータは、その定義内部でのみ使用される変数(通常は引数として受け取る変数)にのみ依存します。

    • コンビネータロジックは、これらのコンビネータを使用して計算を構築するための理論的枠組みです。

    • コンビネータの例としては、SKI コンビネータ計算が知られています。この中で、S, K, I は基本的なコンビネータです。

これらの違いを要約すると、高階関数は他の関数を引数や返り値として扱う関数ですが、コンビネータは独立して自身の内部の変数のみに依存する関数を指します。

Tacit プログラミング、または暗黙のプログラミングとは、プログラムが変数の明示的な参照や名前付けを避けるスタイルのことを指します。

このプログラミングスタイルは、関数の合成と高階関数を用いて表現されることが多いです。Tacit プログラミングは、特に配列指向プログラム言語や関数型プログラム言語でよく見られるスタイルです。

以下は、Tacit プログラミングの特徴やその他の関連情報です:

  1. 変数の不使用:Tacit プログラミングの主な特徴は、変数名を直接使用しないことです。代わりに、関数や演算子がその役割を果たします。

  2. 関数の合成:Tacit プログラミングは、関数の合成を強調します。つまり、一連の関数を連鎖させてデータの変換や操作を行うことが一般的です。

  3. 可読性の議論:一部のプログラマは、Tacit プログラミングがコードの可読性を向上させると考えています。なぜなら、コードがデータの流れや変換に焦点を当てるため、意図が明確になると感じるからです。しかし、慣れていないプログラマにとっては理解しづらいとも言われています。

  4. 言語との関連:Tacit プログラミングは、J や APL のような配列指向言語で特に一般的です。しかし、Haskell や Lisp のような他の関数型プログラム言語でも、Tacit のスタイルを取り入れることができます。

  5. 点自由スタイル:Tacit プログラミングの一部として、点自由スタイル(point-free style)というアプローチがあります。これは、関数定義時に引数を具体的に指定しないスタイルを指します。


A minimalist and whimsical fairy-tale style illustration suitable for a children's book, depicting the concept of higher-order functions and combinators in programming. The scene features fabric ghosts, styled like Matryoshka dolls, to represent functions. One large fabric ghost (higher-order function) is depicted interacting with smaller fabric ghosts (regular functions) by either lifting them up or adjusting them. Another part of the scene shows several fabric ghosts combining parts to create a new ghost (combinator), symbolizing the creation of new functions. The color palette is limited to enhance the minimalist aesthetic

お願い致します