2014-09-20 131 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) 
相關問題