2015-02-07 3 views
2

Я пытался выработать несколько простых примеров программирования уровня на Scala 2.11. Вот функция сказать типа равенства:Неожиданное неявное разрешение в scala

def type_==[A, B](implicit ev: A =:= B = null) = ev != null 

Здесь =:= определяется в прелюдии, но для нашей цели, даже простое определение, такие как

class =:=[A, B] 
implicit def equalTypeInstance[A] = new =:=[A, A] 

будет делать. Конечно, можно сделать

type_==[Int, String] // false 
type_==[Int, Int] // true 

Далее закодировать булевы как типы - сделать простые вещи, я избегаю, чтобы определить какой-либо операции

sealed trait Bool 
trait True extends Bool 
trait False extends Bool 

Я могу снова проверить, что

type_==[True, True] // true 

Итак, я думал, что смогу преобразовать Bool в Boolean, выполнив

def bool2boolean[A <: Bool] = type_==[A, True] 

Вот улов:

bool2boolean[True] // false 

Может кто-нибудь объяснить причину, почему?

ответ

3

Implicits не волшебно проходит через функцию - каждая функция создает свою собственную сферу, и неявное разрешение там происходит:

def bool2boolean[A <: Bool] = type_==[A, True] 

В этой области попытки компилятора разрешить =:=[A, True], не может найти его, и поэтому эта функция всегда возвращает False.

Попробуйте передавая доказательства через эту функцию:

def bool2boolean[A <: Bool](implicit ev: A =:= True = null) = 
    type_==[A, True]