2

monad私はそれが であることを覚えていmonoidます。つまり、連想二項演算 *が存在するため、mambモナド値の場合、 もモナド値になりma * mbます。

上記が正しければ、OptionScala でのその二項演算は何ですか? たとえば、何が入ることができます*Some(1) * Some(2)?

4

5 に答える 5

4

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 バージョンで提案したもので、インターバル ツリーの実装に使用されています。

于 2014-02-17T11:54:35.467 に答える
4
于 2014-02-17T13:25:36.643 に答える
3

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 は有効な連想二項演算子です」で始まることに注意してください)。

于 2014-02-17T11:48:38.567 に答える
2

モノイドには 2 つの異なる意味があります。モナドは、圏論の意味でのモノイド オブジェクトです(最後の例を参照してください)。それは抽象代数の意味でのモノイドではありません(他のほとんどの回答が話している)。

于 2014-02-17T14:00:10.737 に答える
2

実際にはありません。MonadforOptionMonoidforではありませんOption[T]Monadは に対して定義されM[_]Monoidは に対して定義されTます。

次のようなforがある場合は、 Monoidforを作成できます。Option[T]MonoidT

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
  }
}
于 2014-02-17T11:00:31.093 に答える