Scalaz unboxed tagged type не распаковывается автоматически
Чтение http://eed3si9n.com/learning-scalaz/Tagged+type.html и пример кода:
import scalaz._; import Scalaz._
sealed trait KiloGram
def KiloGram[A](a: A): A @@ KiloGram = Tag[A, KiloGram](a)
val mass = KiloGram(20.0)
2 * mass
Согласно руководству, должен дать 40.0
, однако, на Scala 2.11.2 я получаю:
scala> 2 * mass
<console>:17: error: overloaded method value * with alternatives:
(x: Double)Double <and>
(x: Float)Float <and>
(x: Long)Long <and>
(x: Int)Int <and>
(x: Char)Int <and>
(x: Short)Int <and>
(x: Byte)Int
cannot be applied to (scalaz.@@[Double,KiloGram])
2 * mass
^
Тогда как
2 * mass.asInstanceOf[Double]
Работает просто отлично.
Это 2,10 против 2,11 или я что-то упустил? Какой смысл в распакованных маркированных типах, если я не могу использовать их так (больше) и вынужден прибегать к явным приведениям?
1 ответ:
ОК, оказывается, это было изменено в Scalaz 7.1 на https://github.com/scalaz/scalaz/pull/693 .
В основном старая реализация помеченных типов оказалась недостаточно безопасной, поэтому было сделано так, что явное разворачивание помеченного типа было бы необходимо, прежде чем содержимое "тега"могло быть использовано:
scala> trait Kg scala> val Kg = Tag.of[Kg] scala> val mass = Kg(15.0) scala> 3 * Kg.unwrap(mass) res0: Double = 45.0
Спасибо S11001001, ceedubs, tpolecat и adelbertC на #scalaz за указание на это.