小编sia*_*hei的帖子

Scala 类型约束来检查参数值

我正在尝试在 Scala 中实现康威的超现实数字。超现实数是递归定义的——作为一对超现实数的集合,称为左和右,这样右集中的任何元素都不小于或等于左集中的任何元素。这里超现实数之间的关系“小于或等于”也是递归定义的:我们说x ? Ÿ如果

  • x的左集中没有元素a使得y ? ,和
  • y的右集中没有元素b使得b ? ×

我们首先将零定义为一对空集,然后使用零来定义 1 和 -1,依此类推。

我无法弄清楚如何在编译时强制执行超现实数字的定义。这就是我现在所拥有的:

case class SurrealNumber(left: Set[SurrealNumber], right: Set[SurrealNumber]) {
  if ((for { a <- left; b <- right; if b <= a } yield (a, b)).nonEmpty)
    throw new Exception
  def <=(other: SurrealNumber): Boolean =
    !this.left.exists(other <= _) && !other.right.exists(_ <= this)
}

val zero = SurrealNumber(Set.empty, Set.empty)
val one = …
Run Code Online (Sandbox Code Playgroud)

types scala type-level-computation shapeless scala-macros

10
推荐指数
1
解决办法
212
查看次数