monad
私はそれが であることを覚えていmonoid
ます。つまり、連想二項演算 *
が存在するため、ma
とmb
がモナド値の場合、 もモナド値になりma * mb
ます。
上記が正しければ、Option
Scala でのその二項演算は何ですか? たとえば、何が入ることができます*
かSome(1) * Some(2)
?
monad
私はそれが であることを覚えていmonoid
ます。つまり、連想二項演算 *
が存在するため、ma
とmb
がモナド値の場合、 もモナド値になりma * mb
ます。
上記が正しければ、Option
Scala でのその二項演算は何ですか? たとえば、何が入ることができます*
かSome(1) * Some(2)
?
orElse
有効な連想二項演算子だと思います:
def test(a: Option[Int], b: Option[Int], c: Option[Int]): Boolean =
((a orElse b) orElse c) == (a orElse (b orElse c))
Seq(Option(1), Option(2), None).permutations.forall {
case Seq(a, b, c) => test(a, b, c)
}
これは成立します。私はこのプロパティを FingerTree 実装で使用しました。Hinze と Paterson が Haskell バージョンで提案したもので、インターバル ツリーの実装に使用されています。
がOption
それ自体ではモノイドでないのと同様に、 自体はモノイドでInteger
はありません。モノイドは、型と連想二項演算です。
整数型 AND 加算をモノイドと見なすことができます。整数と乗算もモノイドです。2 つInteger
の s をString
変換して連結する ("2" + "3" = "23") ことも有効な連想演算であり、整数でモノイドを作成できます: 実際には("2" concat "3") concat "4"
= "2" concat ("3" concat "4"
) = "234" です。
問題は、型の「モノイド」の定義を完了する連想操作を定義するのはあなた次第なので、「連想操作とは....」という質問は整形式ではありません。
整数と同様にOption[Int]
、加算または乗算はモノイドになることができますが、Option[Int]
それ自体はそうではありません。
@seniaが彼の答えで行っているように、「T自体がモノイドである場合、Option[T]に基づいてモノイドを定義できます」と言うことができます。その場合、連想操作は T に対して定義されたものを使用Some[a] append Some[b]
でき、Some[a append b]
.
orElse
または、@0__ が行ったように、一緒にOption[Int]
モノイドを作成する特定の操作 ( ) を見つけることができます。それも正しいです (ただし、答えが「orElse は有効な連想二項演算子です」で始まることに注意してください)。
モノイドには 2 つの異なる意味があります。モナドは、圏論の意味でのモノイド オブジェクトです(最後の例を参照してください)。それは抽象代数の意味でのモノイドではありません(他のほとんどの回答が話している)。
実際にはありません。Monad
forOption
はMonoid
forではありませんOption[T]
。Monad
は に対して定義されM[_]
、Monoid
は に対して定義されT
ます。
次のようなforがある場合は、 Monoid
forを作成できます。Option[T]
Monoid
T
def optionMonoid[T: Monoid]: Monoid[Option[T]] = new Monoid {
def zero: Option[T] = None
def append(f1: Option[T], f2: => Option[T]): Option[T] = (fi, f2) match {
case (None, None) => None
case (Some(a), Some(b)) => Some(a |+| b)
case (r @ Some(_), None) => r
case (None, r @ Some(_)) => r
}
}