3

次のコードでは:

   def sum[A: Monoid](xs: List[A]): A = {
     val m = implicitly[Monoid[A]]
     xs.foldLeft(m.mzero)(m.mappend)
   }

スコープ内に が既にある場合、別の動作をする明示的に関数を呼び出すことはできMonoid[Int]ますか? または、唯一の解決策は、2 番目の引数でより冗長な構文を使用することですか?mappend = _ + _Monoid[Int]implicit monoid: Monoid[Int]


コード例は、この Scalaz チュートリアルからのものです: http://eed3si9n.com/learning-scalaz/sum+function.html

最後に、著者はモノイドを明示的に提供する例を示しますが、コンテキスト境界は使用しませんでした:

scala> val multiMonoid: Monoid[Int] = new Monoid[Int] {
         def mappend(a: Int, b: Int): Int = a * b
         def mzero: Int = 1
       }
multiMonoid: Monoid[Int] = $anon$1@48655fb6

scala> sum(List(1, 2, 3, 4))(multiMonoid)
res14: Int = 24
4

1 に答える 1

3

コンテキスト境界は、構文糖衣にすぎません。以下:

def sum[A: Monoid](xs: List[A])

以下とまったく同じです:

def sum[A](xs: List[A])(implicit evidence: Monoid[A])

これは、メソッドを定義しsumた方法 (コンテキスト バインドまたは暗黙パラメーターのいずれか) に関係なく、次のように暗黙パラメーターを明示的に渡すことができることを意味します。sum(List(1, 2, 3, 4))(multiMonoid)

于 2013-05-18T12:50:49.707 に答える