💎関数型におけるバイファンクターとプロファンクターについて説明をお願いします

関数型プログラミングにおいて、「バイファンクター」(Bifunctor)と「プロファンクター」(Profunctor)は両方とも重要な抽象概念で、多くのプログラムの設計やデータ構造に応用されます。それぞれの概念は異なる種類の操作や関数の適用に対応しており、圏論からのアイディアを反映しています。


バイファンクター (Bifunctor)

バイファンクターは、二つの引数を持つ関手であり、それぞれの引数に対して共変的(covariant)に作用します。つまり、二つの型パラメータを持ち、それぞれの型に対してマップ関数を適用することができる関手です。バイファンクターは一般的に、データ構造が二つの異なる型の値を含む場合に有用です。例えば、Haskellにおける (,) タプルや Either 型などがバイファンクターのインスタンスです。

プロファンクター (Profunctor)

プロファンクターは、双変(または反変と共変の組み合わせ)の関手であり、二つのカテゴリの間の射を対象間の射に映す機能を持ちます。プロファンクターは、入力型に対して反変的に、出力型に対して共変的に作用します。これは、入力を受け取る前の関数や、出力を生成する関数に対して変換を行うことができることを意味します。

  1. 関手 (Functor): データ構造を通じて関数をマッピングする方法を提供する抽象化で、データ構造の形を保ちつつ、その内容を変換します。

  2. 共変 (Covariant): 型が変換される際にその変換を「同じ方向で追従」する性質を持つデータ構造のことを指します(例えば、サブタイプ関係が保持される)。

  3. 反変 (Contravariant): 型が変換される際にその変換を「逆方向で追従」する性質を持つデータ構造のことを指します(例えば、スーパータイプ関係が逆転する)。

  4. バイファンクター (Bifunctor): 二つの型引数を取り、それぞれに対して共変的に関数を適用できるデータ構造のこと。

  5. プロファンクター (Profunctor): 入力型に対して反変的に、出力型に対して共変的に作用する関手のこと。

  6. dimap: プロファンクターにおいて、入力を変更する関数と出力を変更する関数を同時に適用する操作。

 https://note.com/rodz/n/n6eb84ae1960b #


お願い致します