ウィキペディアの自由対象の定義に基づくと、Haskではすべてのファンクターが自由であるように思われます。逆に、すべてのフリーオブジェクトもファンクターである必要があります。これは正しいですか、それとも私は誤解していますか?
1 に答える
どういう意味かわかりません。多くの場合、カテゴリ定義は、関数型プログラミングのコンテキストで必要とされるよりも一般的に記述されます。具体的なカテゴリを使用してウィキペディアの定義を使用するのではなく、自由にしたい種類のものをパラメータとして扱う場所で取得する定義を検討してください。
定義:freefoo。型上 の自由なfooは、fooのようなT
オブジェクトであり、他のfooのような関数と、そこにある関数は、のような一意のfoo射を存在します。FT
F
i :: T -> FT
S
f :: T -> S
f'
f' . i = f
「モノイド」と言うと、自由モノイド、群、自由群などが得られます。この定義は、本質的に圏論を使用せず、ファンクターについてはほとんど説明していません。ウィキペディアで与えられた定義よりも形式的ではありませんが、直感的に機能するはずです。この定義を考えると、自由な構造は自由なオブジェクトを作成する一般的な方法です。たとえば[]
、モノイドの自由な構造を提供します。つまり、すべて[a]
のの自由モノイドです。a
a
すべてのファンクターがフリーファンクターであるとは限りません。また、Haskのすべての無料の構造がHaskellファンクターであるということはないと思います(すべての無料の構造が抽象的なファンクターにつながることは些細なことです)。
私の「無料」の定義はある種のものにのみ適用され*
ますが、より一般的な定義は他の種類にも適用されます。たとえば、無料のモナド。
あなたはすべて出かけて、クレイジーなことをすることができます。たとえば、GADTを使用して列挙可能なSing k
(種類のシングルトンタイプk
)で自由ブール代数を定義できます。k
これが「機能的」なものを含むことは、Haskでは非常に明白ではありません。