Scala,currying和超载

Hen*_*son 15 types scala currying

说你有以下内容:

foo(x: String)(y: Int): Int
foo(x: String)(y: Double): Int
Run Code Online (Sandbox Code Playgroud)

Scala不允许这样的表达.据我所知,其原因是foo("asdf")没有明确定义的类型(它是Int => Int或Double => Int).

是否有理由不允许这种"多型"功能?

Mar*_*sky 21

在Scala中重载分辨率仅考虑第一个参数列表.这就是为什么替代品必须在此列表中有所不同.这有一个很好的理由:我们可以使用已解析函数的类型来推断后续参数的类型.这使得成语如下:

xs.corresponds(ys) { (x, y) => x < y }
Run Code Online (Sandbox Code Playgroud)

注意,这里我们需要知道的类型,corresponds以此来推断的类型xy.在corresponds超载时将其分解将是一种耻辱.

  • 任何考虑可能类型列表的方法都有可能导致类型检查时间呈指数级增长.这就是为什么Scala通常不会在其类型推理算法中这样做. (2认同)