Scala:是广义类型约束 "type operators" 吗?
Scala: are generalised type constraints "type operators"?
我在类型级别有以下自然数的 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
这不是很可读。我想为我的版本检查定义类似于 =:=
和 <:<
的 "type operators": IsEqual
和 IsLessEqual
以便我可以:
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。我可以将它们视为类型运算符吗?如果是这样,我可以在现有类型运算符的基础上编写其他类型运算符吗?
您可以定义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
我在类型级别有以下自然数的 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
这不是很可读。我想为我的版本检查定义类似于 =:=
和 <:<
的 "type operators": IsEqual
和 IsLessEqual
以便我可以:
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。我可以将它们视为类型运算符吗?如果是这样,我可以在现有类型运算符的基础上编写其他类型运算符吗?
您可以定义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