当scalac重载“ andThen”时,为什么scalac会使我的SAM类型不实现Function感到困惑?

都灵

经过2.13的测试,但我想从2.12开始就是这样,而我之前从未遇到过此类问题:

trait Extractor[-X, +Y] {
    def optional :X => Option[Y] = apply

    def apply(x :X) :Option[Y]

    def andThen[Z](extractor :Extractor[Y, Z]) :Extractor[X, Z] = {
        val first = optional; val second = extractor.optional
        Extractor { x :X => first(x).flatMap(second) }
    }

    def andThen[Z](req :Y => Z) :Extractor[X, Z] = {
        val first = optional
        Extractor { x :X => first(x).map(req) }
   }

   def compose[W](extractor :Extractor[W, X]) :Extractor[W, Y] = extractor andThen this

   def compose[W](req :W => X) :Extractor[W, Y] = Extractor(req andThen optional)

}

Scalac对第一个实施方案有一个神秘的抱怨compose

Error:(44, 31) type mismatch;
found   : net.noresttherein.oldsql.morsels.Extractor[X,Y]
required: W => ?
def compose[W](extractor :Extractor[W, X]) :Extractor[W, Y] = extractor andThen this

注释掉andThen带有函数变量可以解决此问题。更改代码也是如此extractor.andThen[Y](this)(此处明确类型参数是关键)。我的猜测是我的SAM类型以某种方式提升为函数,但是我无法猜测为什么它会优先于方法。正如我在这里提供的两个“解决方案”一样,我不是很想办法,而是要了解正在发生的事情。这是多年来我第一次不知道发生了什么,并希望将来消除类似的问题。

被骗

可能您会违反重载解析的新规则,该规则旨在帮助类型推断。

问题是arg中的arg的“期望类型”是什么extractor.andThen(this)

“高阶函数参数类型推断的直觉是,所有参数都必须是类似函数的类型。”

因此,删除apply方法会破坏该条件,并让键入继续进行。

该规范补充说:“目的不是操纵超载分辨率。”

它应显示为:“目的是不破坏重载分辨率。”

我想,好主意铺平了道路

编辑:它可以在2.12中使用,而无需修改规则。在旧系统下,如果方法重载,则没有预期的类型。

值得补充的是,它可能符合回归标准。例如,他们可以根据之前的规则进行后备类型检查。

这是一张

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何正确使用scalac -Xlint

来自分类Dev

为什么scalac会推断“ Foo with Bar”而不只是“ Foo”作为匹配/大小写返回类型?

来自分类Dev

scalac:错误:intelliJ 14中的对象CharRef

来自分类Dev

scalac中使用的中间语言?

来自分类Dev

错误:scalac:错误选项:-P(IntelliJ IDEA)

来自分类Dev

scalac中使用的中间语言?

来自分类Dev

scalac for Call-by-Name使用参考

来自分类Dev

为什么scalac不能在简单的“ for”构造中优化开销?

来自分类Dev

我对在C ++中对'<<'使用运算符重载感到困惑

来自分类Dev

对R中函数的重载解析感到困惑?

来自分类Dev

scalac编译产生“对象apache不是包org的成员”

来自分类Dev

scalac在ScalaTest测试中发现错误的forAll方法

来自分类Dev

如何使IntelliJ IDEA对Java使用Javac,对Scala使用scalac?

来自分类Dev

Scala代码运行时无需使用scalac进行编译?

来自分类Dev

Scala代码运行时无需使用scalac进行编译?

来自分类Dev

实现Spark DStream时返回类型重载

来自分类Dev

Scalac无法编译通过TraversableOnce [_]和元素类型参数化的函数

来自分类Dev

为什么我的函数重载而不是模板化的重载?

来自分类Dev

关于方法重载的困惑

来自分类Dev

重载重载方法我在重载父或子类中的方法

来自分类Dev

重载时返回operator + =的类型

来自分类Dev

为什么要重载方法?

来自分类Dev

为什么需要重载方法?

来自分类Dev

“积分”类型的函数重载

来自分类Dev

重载中的数字类型

来自分类Dev

指针类型的特殊重载

来自分类Dev

使用枚举类型重载

来自分类Dev

对带有操作符重载的移动语义感到困惑

来自分类Dev

对R中函数的重载解析感到困惑吗?

Related 相关文章

热门标签

归档