13

この質問には、実際に質問する前に長い前置きがあります:)

タイプAとタイプBがカテゴリを表し、次に関数を表すとします。

f :: B-> A

2つのカテゴリ間の射です。次のように、AとBをオブジェクトとして、fを矢印として新しいカテゴリを作成できます。

ここに画像の説明を入力してください

それでは、新しいカテゴリCと関数gを紹介しましょう。

g :: C-> B-> A

上記のカテゴリにCとgを追加できるようにしたいのですが、その方法がわかりません。直感的には、次のようなものが必要です。

ここに画像の説明を入力してください

しかし、私はこれまでカテゴリー図でそのようなものを見たことがありません。このコーシャを作成するには、ダミーの矢印g'を導入して、次のような2つのカテゴリを作成します。

ここに画像の説明を入力してください

しかし、それは鈍い絵のようです。(もちろん、上に描いた絵を適切なものの省略形として使用することもできます。)また、gとg'が何であるかはもう正確にはわかりません。gは、カテゴリCを入力として受け取り、射を返す関数ではなくなりました:: B-> A.代わりに、

g'::(C-> C)

g ::(C-> C)->(B-> A)

アイデンティティを渡すと、すべてが正常に機能します。しかし、他の関数を渡すと、何が起こるか誰が知っているでしょうか。

だから私の質問は:n-カテゴリー内のn-矢印は本当に私たちがアリティnを持つ関数について考える方法ですか?または、この関数を、私が見逃した標準のカテゴリに分類する簡単な方法はありますか?

4

2 に答える 2

12

ここで「カテゴリ間の射」について話すと、カテゴリ エラーの可能性があるように聞こえます (ハ、ハ)。Haskell では、ほとんどの場合、主張された圏 Haskについて話します。これは、オブジェクトが種類の型であり、射が関数である圏の矛盾した理想化(0)バージョンです。Hask*の射ではない場合、カテゴリ間の「関数」がここにあるのかどうかは不明です。

一方、より一般的な設定では、オブジェクトが他のカテゴリ(1)であるカテゴリを確実に定義でき、必要なプロパティが満たされるように任意の射を使用できます。これの通常の例は、射が関手である小さな圏の圏であるCatです。

とはいえ、どちらの場合でも、あなたの質問に対する答えは本質的に同じです。2 つのオブジェクト間の射のコレクションについて、そのコレクション自体がオブジェクトであるかのように (つまり、他の射のソースまたは宛先として) 話すには、その役割を満たすオブジェクトと、射について間接的に話す何らかの方法が必要です。前後に翻訳できます。

これを行う1つの方法は、オブジェクトのペアを単一のオブジェクト(通常、何らかの「積」と呼ばれる)として話す方法がすでにある場合、射A⊗B→Cの集合と射 A→C Bの集合。オブジェクト C Bが射 B→C の集合の代わりになることができます。

問題の「オブジェクトのペア」が実際にカテゴリ積である場合、 HaskCatの両方であるデカルト閉カテゴリがあります。Haskell では、上記の等価物は関数と(2)です。curryuncurry

もちろん、オブジェクトとしての射について話す方法はこれだけではありません。一般的な概念は、単に「クローズド カテゴリ」と呼ばれます。しかし、高階関数と関数型プログラミングの観点から考えている場合は、デカルトの閉じたカテゴリがおそらく頭に浮かんでいるものです。


(0)これには通常、⊥ が存在しないふりをする (すべての関数が合計になるようにする) ことや、同じ出力を生成する関数を同一のものとして扱う (たとえば、パフォーマンスの違いを無視する) ことが含まれます。

(1)しかし、オブジェクトがすべてカテゴリーであるカテゴリーについて話そうとしないでください

(2)もちろん、論理学者 Haskell Curryにちなんで名付けられました。

于 2012-09-24T20:25:03.727 に答える
4

私は圏論ではかなり学校に通っていませんが、:

Haskellプログラミングでは、私たちはしばしば(私たちのふりをして)カテゴリHaskを扱います。そのオブジェクトは、Haskellタイプであり、射はHaskell関数です。

その理解をあなたの例に当てはめると、私はそれBAオブジェクトであり、fそれらの間の射であることがわかります。

gただし、との間の射ではないため、との間の矢印として描画しようとしないでください。CfgCf

->型コンストラクターの右結合性を適用すると、が得られg :: C -> (B -> A)ます。それ自体はHaskellタイプであるため、それ自体がHaskB -> Aのオブジェクトである必要があります。ただし、そのオブジェクトではありません。これは型の特定の値の1つですが、オブジェクトは型自体になります。fB -> AB -> A

これは、純粋にHaskellの用語で考えることも理にかなっています。型の値にg適用すると型Cの関数が得られるからといって、それは'戻り値が型の他の関数であると関係があることをB -> A意味するわけではありません。gfB -> A

つまり、オブジェクトとオブジェクトの間に描かれた射として、およびオブジェクトとfオブジェクトの間に描かれた射として私たちを与えます。BAgCB -> A

ここで私の圏論の知識が崩壊します。Haskellはtypeの値であるため、fとオブジェクトの間には何らかの関係があるはずです。その関係が圏論の用語で何であるかはわかりません。B -> AfB -> A

CA McCannの答えは、カテゴリによって直接モデル化されていないいくつかの「余分な」関係によってそれを処理する必要があるように聞こえます。カテゴリに関する限り、オブジェクトは;B -> Aと呼ばれることもあります。Dそれは、他のオブジェクトに接続する射によって与えられる場合を除いて、他のものとは何の関係もありません。、、、、および(実際には)の間Aの接続を識別できるのは、カテゴリの「外部」からの他の情報と組み合わせた場合のみです。しかし、私はその説明を誤解しているかもしれません。BfDB -> A

于 2012-09-25T00:11:37.560 に答える