Scala: являются ли операторы типов с ограничениями обобщенного типа?

У меня есть следующая формулировка натуральных чисел Пеано на уровне типа: 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

что не очень читается. Я хотел бы определить «операторы типов»: 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

могу ли я сделать это? не могли бы вы предоставить реализацию?

Я считаю реализацию =:= и >:> немного сложной, но они не выглядят как что-то особенное. Фактически, я видел аналогичную конструкцию, обеспечивающую соблюдение неравенства типов. Могу ли я думать о них как о операторах типа? если да, могу ли я написать другие операторы типов на основе существующих операторов типов?




Ответы (1)


Вы можете определить типы более высокого порядка

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
person Dmytro Mitin    schedule 18.06.2018