繁体   English   中英

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] ,找不到一个,因此此函数始终返回False

尝试通过此函数传递证据:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM