私は少し混乱しているので、誰かに説明してもらいたいです。私の現在の理解を概説しましょう:
はE
自己関数子、はA
何らかのカテゴリです。
E : A -> A.
Haskellの型と射はすべてカテゴリに含まれるのでHask
、ファンクタHaskellでもエンドファンクタ? F : Hask -> Hask
。
私は間違っている、そしてどういうわけかこれを単純化しすぎているという確信があります。そして、私がどんなに愚かであるかを誰かに教えてもらいたいです。ありがとうございます。
ベストアンサー1
「Haskell の関数」について尋ねているのか、それともFunctor
「」について尋ねているのかを明確にしたほうがよいかもしれません。Haskell でカテゴリー理論の用語が使用されている場合、どのようなカテゴリーが想定されているのかが必ずしも明確ではありません。
しかし、デフォルトの仮定はハスクは、Haskellの型の射としての関数のカテゴリとみなされる。その場合、ハスク任意の型Aを型F(A)と任意の関数にマッピングするふ2つのタイプAとBの間の関数F(ふ) は、いくつかのタイプ F(A) と F(B) の間に存在します。
次に、任意の型を、種類 を持つ型コンストラクタであるa
型にマップするエンドファンクタのみに限定すると、関数 の関連マップを、型 を持つ高階関数として記述できます。これは、もちろん と呼ばれる型クラスです。(f a)
f
* -> *
(a -> b) -> (f a -> f b)
Functor
しかし、次のような関数が適切に動作することは容易に想像できる。ハスクFunctor
これは、型a
を にマッピングする関数子のように、のインスタンスとして(直接)記述することはできませんEither a t
。また、 から への関数子にはあまり意味がありませんが、ハスク全く別のカテゴリに、(反変)関数を考えることは合理的である。ハスクにハスクop .
Functor
それを超えると、カテゴリ全体から必然的にマップされるインスタンスハスクそれをある部分集合に当てはめると、カテゴリも形成される。しかし、関数について話すことも合理的である。間のサブセットハスクたとえば、型Maybe a
を に送信する関数を考えます[a]
。
ぜひご覧くださいcategory-extras
パッケージ、その中に埋め込まれたいくつかのカテゴリー理論に触発された構造を提供しますハスク全体を想定するのではなく。