我試圖用我的方式理解Scala中的類型編程,並且我發現大多數關於類型編程需要知道的東西在編程中有一個類似的對應部分,如the type-level programming wiki page中所反映的。但是,我還沒有找到關鍵字或自我類型的類比。我懷疑也許期望這樣的事情沒有意義,但我想我會問。什麼是`this`關鍵字的Scala類型編程類比?
舉例來說,我可以寫出如下表示布爾值作爲運行時間值:
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
}
我可以看到它可能沒有意義,我的類型繼承類型,但肯定繼承抽象類型。有沒有在我的BoolType
中定義And
和Impl
的方法,還是我必須在各自的TrueType
和FalseType
特徵中定義每個?
DeMorgan's正是我所拍攝的像我的'BoolVal'特性。但是......我嘗試了你的建議,但它卻沒有編譯。特別是'And'和'Imp'的定義沒有編譯:'type And [That <:BoolType] = This.Not.Or [That.Not] .Not' and'type Imp [That <:BoolType ] = This.Not.Or [That]' – joescii
不要使用'This.Not'我會嘗試使用This#Not'。你現在在類型層面工作。 – wheaties
#FacePalm #MidnightPilotError #BeerThirty – joescii