Scala-为范围内的数字定义类型

Scala-为范围内的数字定义类型,scala,validation,types,compile-time,Scala,Validation,Types,Compile Time,我想知道是否可以在Scala中定义一个类型,将数字封装在一个范围内,并在编译时断言它的有效性。例如:范围[0,1]中的所有数字,因此我可以定义一个类型介于nzero和one之间的函数。我知道我可以定义一个case类来保存/包装一个数字,然后在运行时检查该数字是否在范围内,我还可以使用隐式转换Int=>BetweenZeroAndOne,Double=>BetweenZeroAndOne,BetweenZeroAndOne=>Int。。。但是有可能定义0到1之间的数字类型吗 谢谢,使用: scal

我想知道是否可以在Scala中定义一个类型,将数字封装在一个范围内,并在编译时断言它的有效性。例如:范围[0,1]中的所有数字,因此我可以定义一个类型介于nzero和one之间的函数。我知道我可以定义一个case类来保存/包装一个数字,然后在运行时检查该数字是否在范围内,我还可以使用隐式转换Int=>BetweenZeroAndOne,Double=>BetweenZeroAndOne,BetweenZeroAndOne=>Int。。。但是有可能定义0到1之间的数字类型吗

谢谢,

使用:

scala>typezerotoone=Not[Less[W.`0.0`.T]]和Not[Greater[W.`1.0`.T]]
定义的类型别名ZeroToOne
scala>refineMV[ZeroToOne](1.8)
:40:错误:(!(1.8<0.0)和(!(1.8>1.0))的右谓词失败:
谓词(1.8>1.0)没有失败。

以下是可能的解决方案,希望我正确理解您的问题: 纯粹使用内置scala功能:

object MyInt extends Enumeration {
  type MyInt = Value
  // this is most "fragile" part of this solution
  val Zero, One, Two, Three = Value
}

object MyIntToIntConverter{
  import MyInt._
  implicit def MyIntToInt(x: MyInt) : Int = x.id
  implicit def IntToMyInt(x: Int) : MyInt = MyInt.apply(x)
}

import MyInt._
import MyIntToIntConverter._

val x : Int  = MyInt.Three

val t : MyInt = 3

如果你谈论的是:data Bool=False | True(在Haskel中)。那么我想你不能这么做。@Pavel我对haskell不太了解,但你的定义类似于OO中的层次结构,比如真扩展Bool,假扩展Bool。我要求的是连续值。顺便问一下,你的范围有多大???@Pavel从0到1。无限数。刚刚发布了使用scala枚举的可能方法,这可能是一个很好的解决方法。这个解决方案只适用于离散范围,不是吗?
object MyInt extends Enumeration {
  type MyInt = Value
  // this is most "fragile" part of this solution
  val Zero, One, Two, Three = Value
}

object MyIntToIntConverter{
  import MyInt._
  implicit def MyIntToInt(x: MyInt) : Int = x.id
  implicit def IntToMyInt(x: Int) : MyInt = MyInt.apply(x)
}

import MyInt._
import MyIntToIntConverter._

val x : Int  = MyInt.Three

val t : MyInt = 3