2016-07-07 12 views
1

私はモナドが(スカラだけではなく、スカラーを使って)理解しています。のは、モナドのほとんど(私の意見では)簡単な例を考えてみましょう:スカラのモナドを理解する

scala.Some 

いくつかの記事が述べているように、its classic sense内のすべてのモナドはflatMapunit機能のためのいくつかのルールを守る必要があります。ここで

は、私はそれfrom the category theory standpointを理解したい、より良い、それを理解し、だから、scala.Some

@inline final def flatMap[B](f: A => Option[B]): Option[B] 

から定義です。だから、私たちはモナドを考えていて、それはファンクタ(ですが、どういう意味ですか?の間)です。ここで

我々は、カテゴリOption[A]Option[B]に持っており、それに渡さf: A => Option[B]とともにflatMapは、それらの間のFunctorを定義することになっています。しかし、tranditionalカテゴリの定義では、カテゴリからそれ自身のファンクタです。

+2

あなたの質問は何ですか?モナドの考え方と 'flatMap'のしくみは単純です:モナドは値を保持するボックスで、' flatMap'に 'f'という関数を与えて、ボックスの値で何かを行います。元のボックスの値に 'f'を適用した結果を含む別のボックスです。 – Jesper

+1

カテゴリはスカラ型のカテゴリなので、 'Option'はそのカテゴリの内書館です。 – Lee

+0

@Leeそれで、それぞれのタイプ 'T'を' Option [T] 'にマップしますか? – user3663882

答えて

4

カテゴリは、オブジェクトが型であり、矢印がそれらの型の値間の関数であるスカラ型のカテゴリです。 Optionはこのカテゴリの内科医です。 Scalaカテゴリの各オブジェクト(すなわちタイプ)に対して、Option型コンストラクタは、各タイプAをタイプOption[A]にマップします。

さらに、各矢印f: A => Bを矢印fo: Option[A] => Option[B]にマップします。これは、Option.mapです。

モナドはFunctor Mと、2つの操作unit: A => M[A]join: M[M[A]] => M[A]です。 Optionため、unit(x: A) = Some(x)joinのように定義することができる。

def join[A](o: Option[Option[A]]): Option[A] = o match { 
    case None => None 
    case Some(i) => i 
} 

flatMapは次にflatMap(f, m) = join(map(f, m))、として定義することができます。あるいは、モナドは、unitflatMapjoinを定義して、join(m) = flatMap(id, m)と定義することができます。

+0

スカラーの 'join'は' flatten'です(私が知る限り)。 – user3663882

+0

もう1つ質問があります。あなたが言ったように、我々は2つの操作が 'join'と' unit'を持っています。 [カテゴリモナド定義](https://en.wikipedia.org/wiki/Monad_(category_theory)#Formal_definition)では、2つの自然な変換もあります。モナドがカテゴリ定義に従って「モナド」であることと同じか、それとも私たちが証明できるか私はそれを自分でやっていないし、実際の証明を望んでいない(それが本当なら)。そうであるかどうかだけを知りたい – user3663882

+1

@ user3663882はい、 'join'と' unit'はmuとetaに正確に対応しています。さらに、[法律はそれらを保持する](http://eed3si9n.com/learning-scalaz/Monad+laws.html);結合性はT^3の図に対応し、左右の同一性はIIRCであり、他のものと同等である。 – phg

関連する問題