我试图在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
任何人都可以解释原因吗?
答案 0 :(得分:3)
暗示不要神奇地传递函数 - 每个函数都会创建自己的作用域,隐式解析会在那里发生:
def bool2boolean[A <: Bool] = type_==[A, True]
在此范围中,编译器尝试解析=:=[A, True]
,无法找到一个,因此此函数始终返回False
。
尝试通过此功能传递证据:
def bool2boolean[A <: Bool](implicit ev: A =:= True = null) =
type_==[A, True]