Scala, currying and overloading

后端 未结 3 1905
Happy的楠姐
Happy的楠姐 2020-12-06 00:41

Say you have the following:

foo(x: String)(y: Int): Int
foo(x: String)(y: Double): Int

Scala does not allow such expression. As far as I ca

相关标签:
3条回答
  • 2020-12-06 00:52

    This isn't the first time this has been asked: it was asked back in 2009. Unfortunately Martin didn't explicitly state what the issues were, other than that it would require a fairly extensive spec change on how overloading works. I've looked at the spec and it's not clear to me where the core issues lie, but I'm not skilled enough in the spec to give a definitive answer either way.

    0 讨论(0)
  • 2020-12-06 01:13

    Overloading resolution in Scala takes only the first parameter list into account. That's why alternatives must differ already in this list. There's a good reason for this: We can then use the resolved function's type to infer the type of subsequent arguments. This enables idioms like:

    xs.corresponds(ys) { (x, y) => x < y }
    

    Note that here we need to know the type of corresponds in order to infer the types of x and y. It would be a shame to have this break down when corresponds is overloaded.

    0 讨论(0)
  • 2020-12-06 01:13

    A simple workaround is to use an anonymous object:

    def foo(x: String) = new {
      def apply(y: Int): Int
      def apply(y: Double): Int
    }
    
    0 讨论(0)
提交回复
热议问题