2014-09-20 128 views
0

此代码编译:为什么不能在这种情况下使用隐式?

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

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

但是,如果我尝试使用:

def plus[A: Plus](a1: A, a2: A): A = implicit[Plus[A]].plus(a1, a2) 

然后我收到编译错误:在该行多个标记 - 缺少参数类型 - 标识预期,但“[”发现。

为什么我不能在这种情况下使用隐式?

该代码从http://eed3si9n.com/learning-scalaz/polymorphism.html

+2

我不认为'implicit'关键字需要一个类型参数,该'implicitly'方法做:'隐式地@inline def [T]'。 – 2014-09-20 20:51:46

+0

是什么鼓励你去尝试这样的事情? – 2014-09-20 21:11:55

+0

@ som-snytt我确实分享了源代码的起源,一个scalaz教程:http://eed3si9n.com/learning-scalaz/polymorphism.html – 2014-09-20 21:13:04

回答

3

implicit采取是不能像使用的关键字。您正在寻找implicitly,它驻留在Predef

def plus[A: Plus](a1: A, a2: A): A = implicitly[Plus[A]].plus(a1, a2) 

或者:

def plus[A](a1: A, a2: A)(implicit x: Plus[A]): A = x.plus(a1, a2) 
相关问题