【发布时间】:2018-07-24 15:35:55
【问题描述】:
目前我有一个实现peano算术的程序:
sealed trait NaturalNumber
还有一个名为 getResource 的函数,它在其具有接口的参数中获取自然数类型值:
sealed trait VersionNumber {
type Nat <: NaturalNumber
}
并根据参考类型值版本号检查值:MAJ 和 MIN,在此接口中提供:
trait ResourceManifest {
def getResource: Int
type Major <: NaturalNumber
type Minor <: NaturalNumber
}
根据哪个函数编译或不编译。函数形式如下:
def getResource(manifest: ResourceManifest)(maj: VersionNumber, min: VersionNumber)
(implicit
maj_check: manifest.Major IsEqual maj.Nat,
min_check: manifest.Minor IsLessOrEqual min.Nat
) = manifest.getResource
这里是full code。 (如果你喜欢类型递归,这里是一个替代implementation。)
事实上,这是由普通 Scala 用户可能不太习惯的覆盖类型值提供支持的。此外,getResource 为主要版本和次要版本获取单独的参数。
理想情况下,我希望用户在包装类中提供值而不是类型:
case class VersionInfo(major: VersionNumber, minor: VersionNumber)
所以我的清单是这种形式:
trait ResourceManifestRefactored {
def getResource: Int
val versionInfo: VersionInfo
}
同样有:
def getResourceRefactored(manifest: ResourceManifestRefactored)(versionInfo: VersionInfo)
并通过从包装器版本值类中获取版本类型来执行我的类型级别约束:VersionInfo。但是,尽管我以多种不同的方式进行操作,但我仍在努力使其正常工作。例如,我尝试直接对依赖于路径的类型进行类型检查,但失败了。我还尝试根据VersionInfo 内部的类型定义MAJ 和MIN,但类型约束不再按预期方式工作。我知道我们可能面临aux-pattern 之类的类似问题,但我正在努力寻找类似的解决方案来解决我的问题。
本质上,我希望有预定义的对象包装类型,并且我想通过这些对象而不是直接类型来进行类型约束。
我不能有根本原因吗?如果没有,我该怎么办?
【问题讨论】:
标签: scala type-constraints type-level-computation