Hom 関手 は、最初のHom(-,-)
引数で反変であり、2 番目の引数で共変です。
この事実は、Scala のFunction1[-T1, +R]が同じプロパティを持っている理由の別の説明を何らかの方法で提供できますか?
たとえばここでこの主張がなされているのを見たことがありますが、2つの概念の関係が説明されるはずだった時点で、あまりにも多くの手を振って私を吹き飛ばしました.
Hom 関手 は、最初のHom(-,-)
引数で反変であり、2 番目の引数で共変です。
この事実は、Scala のFunction1[-T1, +R]が同じプロパティを持っている理由の別の説明を何らかの方法で提供できますか?
たとえばここでこの主張がなされているのを見たことがありますが、2つの概念の関係が説明されるはずだった時点で、あまりにも多くの手を振って私を吹き飛ばしました.
Scala 型には 2 つのカテゴリがあります。
1 つは通常の型と関数のカテゴリで、型はオブジェクトで、矢印は関数です。
もう 1 つは、タイプとサブタイプのカテゴリです。タイプはオブジェクトであり、サブタイプの関係は矢印です。このカテゴリはポーズセットです。
Scala における共分散と反分散は、まさにこの後者のカテゴリーにおけるエンドファンクターの共分散と反分散です。
サブタイプをスーパータイプにマッピングする射影矢印により、2 番目のカテゴリはたまたま最初のカテゴリのサブカテゴリになります。最初のカテゴリのこれらの矢印は、正確に (すべて) 2 番目のカテゴリの矢印です。したがって、最初のカテゴリーのすべての共変エンドファンクターは、自然に(つまり、自然な変換を介して) 2 番目のカテゴリーの共変エンドファンクターです。
実際、ファンクタがおよびにおよびすべての矢印を矢印 にF
マップA
し、が のサブタイプである場合、射影矢印は射影 arrow にマップされ、存在する場合は ' のサブタイプです。反変関手についても同じことが言えます。A'
B
B'
f: A -> B
f': A' -> B'
A
B
prj_A,B
prj_A',B'
A'
B
あとは、これがある意味で Hom 関手であることを確認するだけFunction1
です。実際、Scala 型をその値のセットと見なすと、 からまでFunction1[A,B]
の射 (Scala 関数) のセットになります。矢印のマッピングは合成によって与えられます。そして、それは最初のカテゴリーで共変 (反変) であるため、2 番目のカテゴリーでも共変 (反変) でなければなりません。A
B
編集:サブタイプ/スーパーテュープの混乱を修正。
免責事項: 私は圏論を勉強したことがありません。何を言っているのか分からないかもしれません。