gpt4 book ai didi

scala - 在 Scala 中强制使用别名类型

转载 作者:行者123 更新时间:2023-12-01 00:51:35 25 4
gpt4 key购买 nike

是否可以在 Scala 中创建类似类型别名的东西,用于强制执行某些条件?是的,我知道,这听起来有些奇怪,但让我说明一下我的意思。

假设我们只想拥有 正整数 类型 java.lang.Integer .这个类当然也允许负整数,所以在只允许正整数的情况下使用这种类型是不够的。我模糊的想法是有一个类似“强制类型别名”的东西。

// vague idea
object PositiveInteger {
import java.lang.{Integer, Math}
type PositiveInteger = Integer // something like this, but enforced
def apply(value: Int) = new PositiveInteger(Math.abs(value))
}

然后我希望能够定义 PositiveInteger 类型的参数和值并依赖于他们是积极的这一事实:
def calculate(value: PositiveInteger) = ...

我想避免将类包装在另一个(值)类中,因为我需要重复所有方法或始终从外部访问包含包装对象的字段。

据我所知,这在 Scala 中是不可能的,但也许您知道实现这一目标的方法。你?

最佳答案

您可以使用 scalaz 的这种技术,在类型上添加标签
( http://eed3si9n.com/learning-scalaz/Tagged+type.html )

// Entering paste mode (ctrl-D to finish)

type Tagged[U] = {type Tag = U }
type @@[T, U] = T with Tagged[U]

object Tag {
@inline def apply[T, U](t : T) : T @@ U = t.asInstanceOf[T @@ U]
}

sealed trait PositiveInt
object PositiveInt {
def apply(i : Int) : Int @@ PositiveInt = Tag(Math.abs(i))
def unapply(p : Int @@ PositiveInt) : Option[Int] = Some(p)
}

// Exiting paste mode, now interpreting.

结果是:
defined type alias Tagged
defined type alias $at$at
defined object Tag
defined trait PositiveInt
defined object PositiveInt

scala> PositiveInt(4)
res0: @@[Int,PositiveInt] = 4

scala> PositiveInt(-4)
res1: @@[Int,PositiveInt] = 4

scala> res0 + res1
res2: Int = 8

但是这个解决方案并不完美。
scala> PositiveInt(5) - PositiveInt(6)
res4: Int = -1


scala> PositiveInt(PositiveInt(5) - PositiveInt(6))
res5: @@[Int,PositiveInt] = 1

要获得完整的解决方案,您可能必须获得一个具有完整方法定义的真实类

关于scala - 在 Scala 中强制使用别名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30995964/

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