【问题标题】:Unexpected implicit resolution in scalascala中意外的隐式解析
【发布时间】:2015-02-07 17:07:07
【问题描述】:

我试图在 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

谁能解释原因?

【问题讨论】:

    标签: scala types implicit type-level-computation


    【解决方案1】:

    隐式不会神奇地通过函数——每个函数都会创建自己的作用域,并且隐式解析发生在那里:

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

    在这个范围内编译器尝试解析=:=[A, True],但找不到,所以这个函数总是返回False

    尝试通过这个函数传递证据:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 2015-08-15
      • 2013-12-27
      • 2012-01-27
      • 2020-12-04
      • 2020-11-24
      • 1970-01-01
      相关资源
      最近更新 更多