2017-01-12 10 views
2

私はHaskell/Category theoryを読み、ここにその記事からdefinition of monadですよ:HaskellのすべてのMonadインスタンスは、HaskからHaskへのマッピング方法が異なりますか?

モナドは、いくつかの追加の構造をサポートし、同じ カテゴリに分類から、ファンクタの特殊なタイプです。したがって、 の定義に至ります。

単位:C内のすべてオブジェクトXのための2つの 射とともに、C-> C:モナドはファンクタMであり、X - > M(X)

参加:M (M(X))→M(X)

私が理解しているように、Haskell returnunitに相当します。

x :: [Int] -- x is a member of Lst category 
x = return 5 

を、これはHaskellのに有効なコードです。しかし、returnで、私は書くことができます。 ご覧のとおり、5Lstのメンバーではありませんが、returnのメンバーです。

だから、私はLstはM からСではないことを推測する:C-> C。しかし誰ですか?

はたぶん正しい答えはHaskですが、私は「そのサブカテゴリのカテゴリからファンクタは」「同じカテゴリのカテゴリからファンクタ」と同じであることはよく分かりません。

+0

「ハスク」とは何ですか? – Thilo

+0

"Haskell/Categry theory"から: "この記事では、Haskell型をオブジェクトとして扱い、Haskellは型として機能するHaskleが主なカテゴリーです" – azaviruha

+1

'M:C - > Cは 'class Monad m where ..'の 'm 'に対応し、' C'は 'Hask'のカテゴリであるが、' ..:C - > C'では 'C'はオブジェクトこの場合はタイプです。 'M:Obj(C) - > Obj(C)'と書くのはもっと正しいと思います。 – user2407038

答えて

7

これは混乱の一般的な点であり、あなたはそれが答えるために十分に明確に質問しています。

私は「カテゴリからそれまでファンクタはサブカテゴリだ」ということはよく分からないが、「カテゴリから同じカテゴリからファンクタ」と同じです。

これは同じではありません。ファンクタは、ソースカテゴリC、ターゲットカテゴリD、CのオブジェクトからDのオブジェクトへのマッピング、およびCのモーフィズムとDのモーフィズムのマッピングからなる4つのデータから構成され、いくつかの条件を満たす。 Dを変更すると、ファンクタが変更されます。

しかし、ファンクタを定義すると、カテゴリDで何らかの選択肢があることがよくあります。私はLstLstのオブジェクトが[a]のタイプのタイプであるHaskのサブカテゴリであると推測していますが、Lstのモーフがどうなっているのか分かりません。我々は、これら2つの形状のいずれかのファンクタ[]を定義することができます。

  1. []Hask - >Lst(すなわち、[]の対象カテゴリがLstある)

  2. []を:Hask - >Hask(すなわち、[]の対象カテゴリはHask

これらは技術的に異なるファンクタです。選択する必要があります。このコンテキストでは、正しい選択肢は選択肢2です。[]の出力に[]joinを適用する必要があるため、ソースとターゲットのカテゴリを同じにする必要があります。したがってC = HaskおよびM = []です。

一般的に、タイプコンストラクタのイメージとして定義されているLstのようなカテゴリは、ほとんど考慮しないとわかりません。私はこの(非常に一般的な)発想がどこから来るのかは分かりません。私はあなたが "カテゴリLst"の考えを脇に置くことをお勧めします。 1つのカテゴリで十分です。

類推のために、実数f(x)= x^2を2乗する関数を考えてみましょう。これをf(x)が負でない実数値だけをとるようにしても、これを実数から実数への関数f:R→Rとして見ることができる。 fの目標は、fの画像(入力値で実際にfによって達成される値)と等しくなる必要はありません。

+0

ありがとうございます、あなたの答えは非常に有用です! – azaviruha

0

モナドは、定義によれば、エンドフンターです。 Functorは、型を取り、新しい型を返す(つまり、種類が* -> *の)型レベル関数である型コンストラクタに対して、Functorのインスタンスが定義されているので、本当にendofunctorを表します。

return :: Monad m => a -> m aので、returnはタイプIntの値を取り、タイプ[Int]の値を返すことができることは驚くべきことではありません。

関連する問題