gpt4 book ai didi

Scala 为编译时文字和运行时变量优化了整数

转载 作者:行者123 更新时间:2023-12-01 13:37:46 25 4
gpt4 key购买 nike

我希望将变量限制为 bool 整数表示形式(0 或 1),作为定义的输入。到目前为止,这可以通过两种方式实现,一种在运行时,一种在编译时,仅用于文字。

是否有可能以某种方式将两者结合起来,这样我就可以创建一个类型,在编译时拒绝超出范围的文字值,但也允许在运行时检查非文字输入?

运行时守卫

类似于这篇博文: http://erikerlandson.github.io/blog/2015/08/18/lightweight-non-negative-numerics-for-better-scala-type-signatures/

/////////////////////////////
//Runtime guard for boolean
/////////////////////////////
object zero_or_one {
import scala.language.implicitConversions

class ZeroOrOneRuntime private (val value: Int) extends AnyVal

object ZeroOrOneRuntime {
def apply(v: Int) = {
require(v == 0 || v == 1, "0 or 1 accepted only")
new ZeroOrOneRuntime(v)
}

implicit def toZeroOrOneRuntime(v: Int) = ZeroOrOneRuntime(v)
}

implicit def toInt(nn: ZeroOrOneRuntime) = nn.value
}

import zero_or_one._

var a : ZeroOrOneRuntime = 0
val a_bad :ZeroOrOneRuntime = 2 //java.lang.IllegalArgumentException: requirement failed: 0 or 1 accepted only

for (i <- 0 to 10)
a = i //java.lang.IllegalArgumentException: requirement failed: 0 or 1 accepted only

编译时保护(仅文字)

通过使用 scala 精化库 https://github.com/fthomas/refined

//////////////////////////////////
//Compile-time guard for boolean
//////////////////////////////////
import eu.timepit.refined._
import eu.timepit.refined.api.Refined
import eu.timepit.refined.auto._
import eu.timepit.refined.numeric._

type ZeroOrOneLiteral = Int Refined Interval.Closed[W.`0`.T, W.`1`.T]

var b : ZeroOrOneLiteral = 1
val b_bad : ZeroOrOneLiteral = 2 //Right predicate of (!(2 < 0) && !(2 > 1)) failed: Predicate (2 > 1) did not fail.

for (i <- 0 to 10)
b = i //error: compile-time refinement only works with literals

更新

在与 scala refined 的创建者交换电子邮件后,这可能会在库本身中得到解决。我在 GitHub 上打开了一个功能请求问题 here .如果以及何时使用此功能更新库,我将更新此问题。

最佳答案

如果还有人关注,我有一个答案。是的,这是可能的。我最近为 singleton-ops library 做出了贡献并创建了正是这样做的 TwoFaceChecked 类型。

TwoFace.XXX[T],其中XXX可以是IntString等,是具有类型 T 和运行时值的值类。如果在编译时类型已知,则 T 将拥有文字类型并可用于编译时操作和检查。如果该值不是编译时文字,则 T 将回退到其扩展类型(例如,scala.Int),以及该类的运行时值将被使用。

关于Scala 为编译时文字和运行时变量优化了整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38285442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com