“弱一致性"是什么概念?在斯卡拉? [英] What is the concept of "weak conformance" in Scala?
问题描述
我最近刚遇到弱一致性"这个词(在 Stack Overflow 用户 retronym 对 的回答中如何设置隐式转换以允许数字类型之间的算术运算?).
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 numeric types?).
这是什么?
推荐答案
3.5.3 弱一致性 在某些情况下,Scala 使用更通用的一致性关系.A型弱符合类型 T ,写作 S <:w T, 如果 S <: T 或 S 和 T 都是原始数字类型和 S 在前面T按以下顺序排列.
3.5.3 Weak Conformance In some situations Scala uses a more general conformance relation. A type S weakly conforms to a type T , written S <:w T , if S <: T or both S and T are primitive number types and S precedes T in the following ordering.
- 字节 <:w 短
- 字节 <:w 字符
- 短 <:w Int
- Int <:w Long
- 长 <:w 浮动
- Float <:w 双精度
- Byte <:w Short
- Byte <:w Character
- Short <:w Int
- Int <:w Long
- Long <:w Float
- Float <:w Double
弱最小上限是弱的最小上限一致性.
A weak least upper bound is a least upper bound with respect to weak conformance.
这个用在什么地方?一方面,它决定了 if
表达式的类型:
Where is this used? For one thing, it determines the type of if
expressions:
条件表达式的类型是 e2 和 e3 类型的弱最小上限(第 3.5.3 节)
The type of the conditional expression is the weak least upper bound (§3.5.3) of the types of e2 and e3
在 Scala 2.7.x 中,这将是 AnyVal
类型,Int
和 Double
的最小上限.在 2.8.x 中,它的类型为 Double
.
In Scala 2.7.x, this would by of type AnyVal
, the least uppper bound of Int
and Double
. In 2.8.x, it types as Double
.
scala> if (true) 1 else 1d
res0: Double = 1.0
同样:
scala> try { 1 } catch { case _ => 1.0 }
res2: Double = 1.0
scala> (new {}: Any) match { case 1 => 1; case _ => 1.0 }
res6: Double = 1.0
scala> def pf[R](pf: PartialFunction[Any, R]): PartialFunction[Any, R] = pf
pf: [R](pf: PartialFunction[Any,R])PartialFunction[Any,R]
scala> pf { case 1 => 1; case _ => 1d }
res4: PartialFunction[Any,Double] = <function1>
它的另一个用处是类型推断:
Another place it is used is in type inference:
scala> def foo[A](a1: A, a2: A): A = a1
foo: [A](a1: A,a2: A)A
scala> foo(1, 1d)
res8: Double = 1.0
scala> def foos[A](as: A*): A = as.head
foos: [A](as: A*)A
scala> foos(1, 1d)
res9: Double = 1.0
也用于简单的数字加宽:
And also for simple numeric widening:
数字加宽.如果 e 有一个原语弱符合的数字类型(第 3.5.3 节)到预期的类型,它是使用一个扩展到预期类型的6.26 隐式转换 97 种数字转换方法 toShort、toChar、toInt, toLong, toFloat, toDouble在 §12.2.1 中定义.预期类型是原始数字类型 Byte、Short 或Char,表达式 e 是一个在范围内拟合的整数文字那种类型,它被转换为该类型中的相同文字.
Numeric Widening. If e has a primitive number type which weakly conforms (§3.5.3) to the expected type, it is widened to the expected type using one of the 6.26 Implicit Conversions 97 numeric conversion methods toShort, toChar, toInt, toLong, toFloat, toDouble defined in §12.2.1. expected type is a primitive numeric type Byte, Short or Char, and the expression e is an integer literal fitting in the range of that type, it is converted to the same literal in that type.
scala> 1: Double
res10: Double = 1.0
更新
正如 Daniel 所指出的,规范关于哪些类型具有弱一致性是错误的.让我们问问编译器本身:
As pointed out by Daniel, the spec is wrong about which types have weak conformance. Let's ask the compiler itself:
scala> :power
** Power User mode enabled - BEEP BOOP **
** scala.tools.nsc._ has been imported **
** New vals! Try repl, global, power **
** New cmds! :help to discover them **
** New defs! Type power.<tab> to reveal **
scala> settings.maxPrintString = 10000
scala> import global.definitions._
import global.definitions._
scala> (for{c1 <- ScalaValueClasses;
c2 <- ScalaValueClasses
isNSC = isNumericSubClass(c1, c2)
if isNSC
} yield ("isNumericSubClass (%s, %s) = %b" format (c1, c2, isNSC))).mkString("\n")
res5: String =
isNumericSubClass (class Byte, class Byte) = true
isNumericSubClass (class Byte, class Short) = true
isNumericSubClass (class Byte, class Int) = true
isNumericSubClass (class Byte, class Long) = true
isNumericSubClass (class Byte, class Float) = true
isNumericSubClass (class Byte, class Double) = true
isNumericSubClass (class Short, class Short) = true
isNumericSubClass (class Short, class Int) = true
isNumericSubClass (class Short, class Long) = true
isNumericSubClass (class Short, class Float) = true
isNumericSubClass (class Short, class Double) = true
isNumericSubClass (class Int, class Int) = true
isNumericSubClass (class Int, class Long) = true
isNumericSubClass (class Int, class Float) = true
isNumericSubClass (class Int, class Double) = true
isNumericSubClass (class Long, class Long) = true
isNumericSubClass (class Long, class Float) = true
isNumericSubClass (class Long, class Double) = true
isNumericSubClass (class Char, class Int) = true
isNumericSubClass (class Char, class Long) = true
isNumericSubClass (class Char, class Char) = true
isNumericSubClass (class Char, class Float) = true
isNumericSubClass (class Char, class Double) = true
isNumericSubClass (class Float, class Float) = true
isNumericSubClass (class Float, class Double) = true
isNumericSubClass (class Double, class Double) = true
这篇关于“弱一致性"是什么概念?在斯卡拉?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!