Scala 中意外的隐式解析
Unexpected implicit resolution in scala
我试图在 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
谁能解释一下原因?
隐式不会神奇地通过函数传递 - 每个函数都会创建自己的作用域,并且隐式解析会在那里发生:
def bool2boolean[A <: Bool] = type_==[A, True]
在此范围内编译器尝试解析一个=:=[A, True]
,找不到,所以这个函数总是returnsFalse
.
尝试通过此函数传递证据:
def bool2boolean[A <: Bool](implicit ev: A =:= True = null) =
type_==[A, True]
我试图在 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
谁能解释一下原因?
隐式不会神奇地通过函数传递 - 每个函数都会创建自己的作用域,并且隐式解析会在那里发生:
def bool2boolean[A <: Bool] = type_==[A, True]
在此范围内编译器尝试解析一个=:=[A, True]
,找不到,所以这个函数总是returnsFalse
.
尝试通过此函数传递证据:
def bool2boolean[A <: Bool](implicit ev: A =:= True = null) =
type_==[A, True]