Welcome to Scala version 2.10.2 (Java HotSpot 64-Bit Server VM, Java 1.7.0_15).
scala> :paste
// Entering paste mode (ctrl-D to finish)
trait Reduce { type X; def add(x:X) }
ここで、 から、またはFoo
から埋めることができるクラス を宣言します。Reducer
chain
class Foo[A](val a:A) {
def fill(r: Reduce { type X = A}) = {r.add(a)}
def chain[R >:A](r: Reduce { type X = R }) = { r.add(a); new Foo(r)}
}
いくつかの数値型のレデューサーであるクラスを作成しますY
class AsInt[Y: Numeric] extends Reduce {
type X = Y
var i = 0
override def add(y:Y) = {i = implicitly[Numeric[Y]].toInt(y)}
}
そして、私は終わった
// Exiting paste mode, now interpreting.
defined trait Reduce
defined class Foo
defined class AsInt
のインスタンスを作成して入力できるようになりましたFoo
。
scala> val fL = new Foo(123L)
fL: Foo[Long] = Foo@12979ef0
scala> fL.fill(new AsInt)
ここまでは順調ですね。今私は1つをチェーンします:
scala> fL.chain(new AsInt)
<console>:12: error: ambiguous implicit values:
both object BigIntIsIntegral in object Numeric of type scala.math.Numeric.BigIntIsIntegral.type
and object IntIsIntegral in object Numeric of type scala.math.Numeric.IntIsIntegral.type
match expected type Numeric[Y]
fL.chain(new AsInt)
^
今、私は立ち往生しています。typer は、スコープ内R >: Long
に暗黙的であるtype を探す必要があります。aまたは a のいずれかが法案にNumeric[R]
どのように適合する可能性がありますか?Numeric[Int]
Numeric[BigInt]
タイパーはそれを解決するのに問題はないようです:
scala> def foo[Z >: Long](implicit N: Numeric[Z]) = println(N)
foo: [Z >: Long](implicit N: Numeric[Z])Unit
scala> foo
scala.math.Numeric$LongIsIntegral$@67236f24
私は何が欠けていますか?