Scala 中是否存在不是集合的数字范围?也就是说,不是为了迭代,而是为了诸如“数字是否在这个范围内?”之类的事情。或“这些范围是否重叠?” 我只能想出下面的例子,但显然它非常慢:
(1.0f to 999999.0f by 0.01f).view.contains(123123.12f)
Run Code Online (Sandbox Code Playgroud)
当然可以为此创建我自己的类,但这似乎很常见,我觉得 Scala 中已经有了一些东西。
Spire有一种Interval类型可以做你想做的事情。
附录
\n\n关于您关于创建 实例的更简洁语法的问题Interval。有几个选择。一种是简单地使用 import 来使创建变得不那么冗长:
import Interval.{closed => ci}\n\nval ci1 = ci(1.0, 2.0)\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\xa6 但这并不是太大的改进。
\n\n另一种选择可能是使用隐式转换,Tuple2[Double, Doublle]例如Interval[Double]:
implicit def t2toI(pair: Tuple2[Doube, Double]): Interval[Double] =\n Interval.closed(pair._1, pair._2)\n\nval ci2: Interval[Double] = (1.0, 2.0)\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,必须给出 val 的类型使得这是另一种几乎没有增益的情况。然而,如果您正在调用一个以 为Interval[Double]参数的方法,则该方法的形参的类型注释足以触发隐式转换。
我实际上对 Spire 不太了解,但如果只有一个Interval内部状态反映开放端点和封闭端点之间的差异,那么您就会遇到一个问题,即只有一个从 到 的隐式转换Tupel2[Double, Double]可以Interval[Double]在范围内,所以您有失去了对创建开放端点和封闭端点的其他三种组合中任何一个的控制。其实,现在我想起来了,Spire 如何表示区间并不重要,除非隐式转换的输入带有要创建什么样的区间的信息,否则问题就成立。我想,您可以向元组添加更多槽以进行端点开放/封闭区别。同样,你会失去一些简洁性,而且它永远不会像数学文本中使用的符号那样优雅。
因为括号和方括号都“属于”语言规范,所以传统的数学符号永远无法用于经典的内部 DSL。
\n\n最后,可能是最好的解决方案,您可以创建一个字符串插值器,使您能够编写如下内容:
\n\nval i1 = i"[1.0, $end)"\nval i2 = i"($begin, 4.0]\'\nRun Code Online (Sandbox Code Playgroud)\n\n等等,我还没有任何直接经验,但我相信用于创建新插值器的 API 非常简单。
\n