7

この質問に対する答えは、Scala の Option での fold メソッドがカタモフィズムであることを示唆しています。ウィキペディアによると、カタモフィズムは「初期代数から他の代数への固有の準同型写像です。この概念は、関数型プログラミングに折り畳みとして適用されています」。それは公平に思えますが、 F-algebrasのカテゴリの初期オブジェクトとしての初期代数に私を導きます。

したがって、Option の折り畳みが本当にカタモフィズムである場合、Option が最初のオブジェクトである F 代数の圏を作成するために、ファンクター F が必要です。このファンクターが何であるかわかりません。

タイプのリストの場合A、ファンクタFF[X] = 1 + A * Xです。List は再帰的なデータ型であるため、これは理にかなっています。したがって、上記の if Xis List[A]then は、型のリストがA空のリスト ( 1)、または ( ) anと a+のペア ( ) のいずれかであると読み取ります。しかし Option は再帰的ではありません。(Nothing または an )になります。したがって、ファンクターがどこにあるのかわかりません。*AList[A]Option[A]1 + AA

明確にするために、 Option は にかかるという点で既にファンクターであることを認識していますAOption[A]、リストに対して行われることは異なり、Aは修正され、データ型を再帰的に構築する方法を記述するためにファンクターが使用されます。

関連する注意事項として、カタモルフィズムでない場合は、おそらく混乱を招くため、襞と呼ぶべきではありません。

4

1 に答える 1

2

さて、コメントは正しい軌道に乗っています。初心者なので誤解があるかもしれません。はい、要点は再帰型をモデル化できることですが、「非再帰」F代数を排除するものは何もないと思います。初期代数は方程式 X ~= F X の「最小不動点」解であるため、オプションの場合、再帰が含まれないため、解は自明です:)

初期代数の他の例:

List[X] = 1 + A * リストを表す X = Nil | コンスリスト

Tree[X] = A + A * X * 木を表す X = 葉 a | 木の木をノード化する

同じやり方で:

Option[X] = 1 + オプションを表す A = なし | いくつかの

「定数」ファンクターの存在を正当化する理由は非常に簡単です。ツリーのノードをどのように表すのでしょうか? 実際、(単純な) 再帰的なデータ型を代数的にモデル化するには、次のファンクターのみが必要です。

  • U (単位、空を表す)
  • K (定数、値を取得)
  • I (アイデンティティ、再帰的な位置を表す)
  • * (製品)
  • + (副産物)

私が見つけた良い参考文献はFunctional Generic Programmingです

恥知らずなプラグイン: scala-reggen のコードでこれらの概念をいじっています

于 2014-07-08T06:57:21.073 に答える