Scala中的Ad hoc多态性

时间:2014-12-15 12:33:40

标签: scala

我无法理解如何创建以下代码的实现:

Ad-hoc polymorphism
The third approach in Scala is to provide an implicit conversion or implicit
parameters for the trait.

scala> trait Plus[A] {
def plus(a1: A, a2: A): A
}
defined trait Plus

scala> def plus[A: Plus](a1: A, a2: A): A = implicitly[Plus[A]].plus(a1, a2)
plus: [A](a1: A, a2: A)(implicit evidence$1: Plus[A])A

如何创建具体的实现,例如添加字符串或整数?

3 个答案:

答案 0 :(得分:1)

喜欢这个吗?

scala> implicit object StringPlus extends Plus[String] {
     | def plus(a1: String, a2: String) = a1+a2
     | }
defined module StringPlus

scala> plus("asd", "zxc")
res1: String = asdzxc

答案 1 :(得分:1)

对于Plus[Int]的示例实现,类似于:

scala> implicit val intPlus = new Plus[Int] { def plus(a1: Int, a2: Int):Int = a1 + a2 }
intPlus: Plus[Int] = $anon$1@42674853

...然后你使用它:

scala> plus(1, 2)
res1: Int = 3

答案 2 :(得分:0)

如果您允许我稍微更改语法,并更改您的运算符(因为+已定义,例如String):

trait Default[A] {

    def default(a: A): A

}

implicit def stringToDefault(s: String) = new Default[String] {

    def default(other: String) = ""

}

val s = "Hello"
val other = "Goodbye"

val res = s.default(other) // res = ""

这是你在找什么?现在我们已经成功地向类String添加了一个新方法而没有对其进行修改,如果您将类型更改为复杂数字的自定义实现,则可以使用Plus特征。