2014-09-20 3 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] '. –

+0

Что побудило вас совершить такое? –

+0

@ som-snytt Я действительно делился, где был создан код, учебник по скалязу: http://eed3si9n.com/learning-scalaz/polymorphism.html –

ответ

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) 
Смежные вопросы