gpt4 book ai didi

Scala:F-Bounded Polymorphism Woes

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

假设存在以下类型和方法:

trait X[A <: X[A]]

case class C extends X[C]

def m(x: PartialFunction[X[_], Boolean])

我希望能够创建一个 PartialFunction 传递给 m .

第一次尝试是写

val f: PartialFunction[X[_], Boolean] = { 
case c: C => true
}

m(f)

这失败了 type arguments [_$1] do not conform to trait X's type parameter bounds [A <: X[A]] .所以,看来我们必须约束 X的类型参数。

第二次尝试:

val f: PartialFunction[{type A <: X[A]}, Boolean] = { 
case c: C => true
}

m(f)

这在申请 m 时失败了因为PartialFunction[AnyRef{type A <: X[this.A]},Boolean] <: PartialFunction[X[_],Boolean]是假的。

有没有什么方法不涉及强制转换,实际上在偏函数的定义和 m 的应用上都满足编译器的要求? ?

最佳答案

我不确定您到底想要什么,但由于您使用的是存在类型(伪装成 _ 语法),因此您可以这样做:

val f: PartialFunction[X[A] forSome {type A <: X[A]}, Boolean] = {
case c : C => true
}

_这里的语法不够好,因为您需要为存在类型提供正确的上限。只有使用更明确的 forSome 才有可能语法。

不过,令我惊讶的是,Scala 接受声明

def m(x: PartialFunction[X[_], Boolean])

首先。它甚至考虑 X[_] 似乎很奇怪一个结构良好的类型。这是 X[A] forSome {type A <: Any} 的缩写, 这不应该是 X 的有效应用, 因为它不符合参数范围。

关于Scala:F-Bounded Polymorphism Woes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20128481/

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