2

私は、Scalaテキストの演習で関数型プログラミングに取り組み続けています。

次の関数 はproductMonoid、2 つのモノイドを構成します。

//@author - pchiusano
def productMonoid[A, B](A: Monoid[A], B: Monoid[B]): Monoid[(A, B)] = {
    new Monoid[(A, B)] {
        def op(x: (A,B), y: (A,B) ) = (A.op(x._1, y._1) , B.op(x._2, y._2))
        val zero = (A.zero, B.zero)
    }
}

次に、整数乗算モノイド。

val intMultiplication = new Monoid[Int] {
    def op(a1: Int, a2: Int) = a1 * a2
    val zero = 1
}

最後に、このモノイドは単純に 2 つの文字列を連結します。

val concatenate = new Monoid[String] {
    def op(a1: String, a2: String) = a1 + a2
    val zero = ""
}

最後に、テスト コードを呼び出してproductMonoidの機能を確認します。

def main(args: Array[String]) = {
    val x = (100, "hello")
    val y = (200, "world")

    val result: (Int, String) = productMonoid(intMultiplication, concatenate).op(x,y)
    println("result: " + result)
    assert(result._1 == 20000)
    assert(result._2 == "helloworld")
}

私の呼び出しはproductMonoid(...)慣用句ですか?おそらく、このコードを書くためのよりクリーンな方法はありますか?

4

1 に答える 1