What is the concept of “weak conformance” in Scala?

后端 未结 3 1459
伪装坚强ぢ
伪装坚强ぢ 2020-12-24 12:49

I just recently encountered the term \"Weak Conformance\" (in Stack Overflow user retronym\'s answer to How to set up implicit conversion to allow arithmetic between num

3条回答
  •  囚心锁ツ
    2020-12-24 13:09

    To complete Sandor's answer, that new feature in 2.8 is still being baked (and fixed).

    In this thread, Esser uncovers a nasty side-effect:

    scala> val a= 10 
    a: Int = 10 
    
    scala> val b= 3 
    b: Int = 3 
    
    scala> if (b!=0) a/b else Double.NaN 
    res0: Double = 3.0 
    
    scala> def div1(a: Int, b: Int) = if (b!=0) a/b else Double.NaN 
    div1: (a: Int,b: Int)Double 
    
    scala> def div2(a: Int, b: Int): Double = if (b!=0) a/b else Double.NaN 
    div2: (a: Int,b: Int)Double 
    
    scala> div1(10,3) 
    res1: Double = 3.0 
    
    scala> div2(10,3) 
    res2: Double = 3.3333333333333335 
    

    Seems interesting, because the implicitly found result type is Double and the result is 3.0.
    If Double is explicitly given, the result is 3.33...

    In this thread, Martin Odersky adds (June 21st):

    you have uncovered a serious unintended side-effect of the weak conformance rules in overloading resolution.
    The problem was that arguments of overloaded methods are required to conform weakly, whereas the result type was required to conform strongly.

    This favored the Float => Float addition method on an Int over the Int => Int method if the result type was Float.
    I was trying to be conservative in my change to weak conformance in that I required weak conformance only where it looked absolutely necessary.
    But it seems now that being conservative caused the problem we are looking at!

    And yet another Scala RC release ;)


    Confirmed in this thread by Martin Odersky (June 22d):

    So there will be a RC7 with so far three changes from RC6:

    1. val x: Double = 10/3 will give 3.0, not 3.3333333 - that was the regression I was mentioning
    2. [...]
    3. [...]

    That's it. Our priorities now are to roll out 2.8 as quickly as we can, and at the same time avoid really bad regressions such as (1) above.

    Timeline:

    • We will wait one more week to get feedback on RC6.
    • We will push out RC7 early next week.
      If no further problems show up RC7 would then turn into 2.8 final 10-14 days after it is released.

    (so around July 12th, I believe, but this guess is mine alone ;) )

提交回复
热议问题