モノイド
巨人の肩の上に立って、一般的な抽象化とそれらを使用するために構築されたライブラリを利用できることに気付くと、人生がずっと楽になるかもしれません。この目的のために、この質問は基本的に
モノイドの取り扱いに関するものであり(これについては以下の関連する質問を参照してください)、問題のライブラリはscalazと呼ばれます。
scalaz FPを使用すると、これは次のようになります。
def add(a: Option[Int], b: Option[Int]) = ~(a |+| b)
さらに、これは任意のモノイドMで機能します。
def add[M: Monoid](a: Option[M], b: Option[M]) = ~(a |+| b)
さらに便利なことに、Foldable
コンテナ内に配置されたそれらの任意の数で機能します。
def add[M: Monoid, F: Foldable](as: F[Option[M]]) = ~as.asMA.sum
Int
明らかな、、を除いて、いくつかのかなり有用なモノイドは次のとおりであることに注意してString
くださいBoolean
。
Map[A, B: Monoid]
A => (B: Monoid)
Option[A: Monoid]
実際、独自のメソッドを抽出することはほとんど価値がありません。
scala> some(some(some(1))) #:: some(some(some(2))) #:: Stream.empty
res0: scala.collection.immutable.Stream[Option[Option[Option[Int]]]] = Stream(Some(Some(Some(1))), ?)
scala> ~res0.asMA.sum
res1: Option[Option[Int]] = Some(Some(3))
いくつかの関連する質問
Q.モノイドとは何ですか?
モノイドは、結合二項演算とこの演算の下に単位元M
が存在する型であり、すべての型に対して(M, M) => M
I
mplus(m, I) == m == mplus(I, m)
m
M
Q.とは何|+|
ですか?
mplus
これは、二項演算の単なるscalazの省略形(またはASCIIマッドネス、ymmv)です。
Q.とは何~
ですか?
これは、「またはアイデンティティ」を意味する単項演算子であり、scalazライブラリによって(scalaの暗黙の変換を使用して)モノイドのOption[M]
ifに後付けされます。M
明らかに、空でないオプションはその内容を返します。空のオプションは、モノイドのIDに置き換えられます。
Q.とは何asMA.sum
ですか?
AFoldable
は基本的に、折りたたむことができるデータ構造です(foldLeft
たとえば、など)。foldLeft
シード値と操作を使用して、連続する計算を構成することを思い出してください。モノイドを合計する場合、シード値はIDI
であり、操作はmplus
です。asMA.sum
したがって、を呼び出すことができますFoldable[M : Monoid]
。asMA
名前が標準ライブラリのsum
メソッドと衝突するため、使用する必要がある場合があります。
いくつかの参考文献
- 野生でモノイドを使用する実際的な例を示す、私が行った講演のスライドとビデオ