scala中出现意外的隐式解析

时间:2015-02-07 17:07:08

标签: scala types implicit type-level-computation

我试图在Scala 2.11中编写一些类型级编程的简单示例。这是一个告诉类型相等的函数:

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

任何人都可以解释原因吗?

1 个答案:

答案 0 :(得分:3)

暗示不要神奇地传递函数 - 每个函数都会创建自己的作用域,隐式解析会在那里发生:

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

在此范围中,编译器尝试解析=:=[A, True],无法找到一个,因此此函数始终返回False

尝试通过此功能传递证据:

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