gpt4 book ai didi

scala - 包含广义类型约束的类的模式匹配

转载 作者:行者123 更新时间:2023-12-02 22:16:52 25 4
gpt4 key购买 nike

我有一个由多个子类扩展的特征

trait Sup
case class Sub[A, B](a: A, f: B => B)(implicit val ev: A =:= B) extends Sup
case class Sub2[A, B](a: A, f: B => Unit)(implicit val ev: A =:= B) extends Sup

还有两个函数:

def foo[A, B](a: A, f: B => B)(implicit ev: A =:= B) = f(a)
def bar[A, B](a: A, f: B => Unit)(implicit ev: A =:= B) = f(a)

现在我可以进行某种形式的动态调度并调用 foo如果该对象是 Subbar如果该对象是 Sub2 .

def dispatch(obj: Sup) = {
obj match {
case Sub(a, f) => foo(a, f)
case Sub2(a, f) => bar(a, f) // type mismatch: found: Nothing => Unit. required: B => Unit
}
}

我也尝试过明确传递证据,但会导致相同的错误:

case o @ Sub2(a, f) => bar(a, f)(o.ev) // type mismatch

很奇怪的是f: B => B有效(我可以调用 foo ),但是 f: B => Unit不起作用(我无法调用 bar )。

最佳答案

不是答案,而是值得思考的事情:

case class Sub1[A, B](a: A, f: B => B)
case class Sub2[A, B](a: A, f: B => Unit)

def foo[A, B](a: A, f: B => B)(implicit ev: A =:= B) = f(a)
def bar[A, B](a: A, f: B => Unit)(implicit ev: A =:= B) = f(a)

def dispatch(obj: Any) = obj match {
case Sub1(a, f) => foo(a, f)
case Sub2(a, f) => bar(a, f) // type mismatch: found: Nothing => Unit. required: B => Unit
}

此代码与您的代码具有相同的问题,但 Sub1Sub2 案例类甚至没有隐式 block 。

案例类中的

隐式部分不会影响模式解析。本节只是调用 Sub1/2 上的 apply(a: A, f: B => B)(implicit val ev: A =:= B) 方法的语法糖> 的伴随对象。模式匹配使用 unapply 方法在运行时匹配模式,而这个 unapply 甚至不知道证据。

但我仍然想知道为什么第一个案例是在没有这些证据的情况下编译的。

编辑:添加来自 @AlexeyRomanov 的有用评论

More type inference than type erasure. But yes, the compiler infers type Any for a and Any => Any for f and then produces and uses evidence that Any =:= Any. In the second case it infers Nothing => Unit for f, because B => Unit is contravariant in B, and fails to find Any =:= Nothing.

关于scala - 包含广义类型约束的类的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55495358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com