圏論では、filter
操作は射と見なされますか?もしそうなら、それはどのような射ですか?例(Scala)
val myNums: Seq[Int] = Seq(-1, 3, -4, 2)
myNums.filter(_ > 0)
// Seq[Int] = List(3, 2) // result = subset, same type
myNums.filter(_ > -99)
// Seq[Int] = List(-1, 3, -4, 2) // result = identical than original
myNums.filter(_ > 99)
// Seq[Int] = List() // result = empty, same type
このような質問に答えるために、まずフィルタリングの本質を理解したいと思います。
たとえば、入力がリストであることは重要ですか?木をフィルタリングできますか?なぜだかわかりません!ツリーの各ノードに述語を適用し、テストに失敗したノードを破棄します。
しかし、結果の形はどうなるでしょうか?ノードの削除が常に定義されているとは限らないか、あいまいです。あなたはリストを返すことができます。しかし、なぜリストなのか?追加をサポートする任意のデータ構造が機能します。追加プロセスを開始するには、データ構造の空のメンバーも必要です。ですから、どんな単一のマグマでもかまいません。結合性を主張すると、モノイドが得られます。の定義を振り返るfilter
と、結果はリストになります。これは確かにモノイドです。ですから、私たちは正しい方向に進んでいます。
これfilter
は、いわゆる特殊なケースですFoldable
。結果をモノイドに蓄積しながら折りたたむことができるデータ構造です。特に、述語を使用して、それがtrueの場合、シングルトンリストを出力することができます。または、falseの場合は、空のリスト(ID要素)。
カテゴリカルな答えが必要な場合、フォールドはカタモルフィズムの例であり、代数のカテゴリの射の例です。折りたたむ(再帰的な)データ構造(の場合はリストfilter
)は、一部のファンクター(この場合はリストファンクター)の始代数であり、述語はこのファンクターの代数を定義するために使用されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加