Scala:是广义类型约束"类型运算符"?

时间:2018-06-18 01:14:15

标签: scala type-constraints higher-kinded-types type-level-computation path-dependent-type

我在类型级别有以下Peano公式的自然数:gist

具有自然数字类型,具有以下界面:

sealed trait NaturalNumber {
  type MatchZero[T <: Up, F[_ <: NaturalNumber] <: Up, Up] <: Up
  type Compare[N <: NaturalNumber] <: Comparison
}

我在我的代码中以这种形式使用它:

def getResource(manifest: ResourceManifest)(maj: VersionNumber, min: VersionNumber)
          (implicit
           maj_check: (maj.Nat)#Compare[manifest.Major]#eq =:= True,
           min_check: (min.Nat)#Compare[manifest.Minor]#le =:= True
) = manifest.getResource

这不是很易读。我想为我的版本检查定义&#34;类型运算符&#34;:IsEqualIsLessEqual类似于=:=<:<,以便我可以:< / p>

def getResource(manifest: ResourceManifest)(maj: VersionNumber, min: VersionNumber)
          (implicit
           maj_check: maj.Nat IsEqual manifest.Major,
           min_check: min.Nat IsLessOrEqual manifest.Minor) = manifest.getResource
我能这样做吗?你能提供实施吗?

我发现=:=>:>的实现有点复杂,但它们看起来并不特别。事实上,我已经看到类似的不平等执法construct。我可以将它们视为类型运算符吗?如果是这样,我可以根据现有的类型运算符编写其他类型的运算符吗

1 个答案:

答案 0 :(得分:2)

您可以定义higher-kinded types

type IsEqual[N <: NaturalNumber, M <: NaturalNumber] = N#Compare[M]#eq =:= True
type IsLessOrEqual[N <: NaturalNumber, M <: NaturalNumber] = N#Compare[M]#eq =:= True

并使用它们

def getResource(manifest: ResourceManifest)(maj: VersionNumber, min: VersionNumber)
               (implicit
                maj_check: maj.Nat IsEqual manifest.Major,
                min_check: min.Nat IsLessOrEqual manifest.Minor) = manifest.getResource