Я пытаюсь понять способ программирования типов в Scala, и я обнаружил, что большая часть того, что нужно знать о программировании типов, имеет аналогичный аналог в программировании значений, как это отражено в страница викинга на уровне программирования. Тем не менее, я не нашел аналогию с ключевым словом this
или само-типами. Я подозреваю, может быть, нет смысла ожидать такого, но я думал, что попрошу.
Например, я могу написать следующее для представления Booleans как значений во время выполнения:
sealed trait BoolVal {
def not:BoolVal
def or(that:BoolVal):BoolVal
def and(that:BoolVal) =
(this.not or that.not).not
def imp(that:BoolVal) =
this.not or that
}
case object TrueVal extends BoolVal {
override val not = FalseVal
override def or(that:BoolVal) = TrueVal
}
case object FalseVal extends BoolVal {
override val not = TrueVal
override def or(that:BoolVal) = that
}
Здесь мои and
и imp
могут воспользоваться тем фактом, что не имеет значения, правильно ли я определяю ложный объект или истинный объект. Мои объекты TrueVal
и FalseVal
могут наследовать один и тот же код.
Я могу сделать аналогичные конструкторы программирования на уровне типа, но я не понимаю, как определить and
и imp
в моей базовой характеристике.
sealed trait BoolType {
type Not <: BoolType
type Or[That <: BoolType] <: BoolType
type And[That <: BoolType] = ???
type Imp[That <: BoolType] = ???
}
sealed trait TrueType extends BoolType {
override type Not = FalseType
override type Or[That <: BoolType] = TrueType
}
sealed trait FalseType extends BoolType {
override type Not = TrueType
override type Or[That <: BoolType] = That
}
Я вижу, где, возможно, не имеет смысла, что мои типы наследуют типы, но, конечно, наследуют абстрактные типы. Есть ли способ определить and
и Impl
в моем BoolType
, или мне нужно определить каждый из соответствующих признаков TrueType
и FalseType
?