[英]Witness that an abstract type implements a typeclass
我相信我對此的理解是正確的,但我想檢查一下。 創建類型類時,讓它們采用單個類型參數感覺更簡潔,例如TypeClass[A]
。 如果類型類需要通過其他方式參數化,可以使用抽象類型,這里有兩種方式的比較: 抽象類型與類型參數
據我所知,鏈接中沒有提到的一件事是,如果使用類型參數,您可以看到該參數實現了(不同的)類型類,如下所示:
trait IsValidForTC[A]
abstract class TCWithTypeParam[A, B] (implicit ev: IsValidForTC[B]) {}
如果我使用抽象類型,我不能確定它實現了IsValidForTC
:
abstract class TCWithAbstractType[A] (implicit ev: IsValidForTC[B]) {
type B
} //not found: Type B
如果是這樣,那么這是有道理的,但是上面的鏈接中沒有提到這種差異,所以我想檢查一下。
謝謝!
您可以選擇是否在類級別或方法級別設置隱式約束。 這會影響隱式解析的時間。
在具有隱式參數的類型參數類型類中,您不限制類型類的類型(適用於類型參數),即即使沒有隱式IsValidForTC[B]
也可以使用類型TCWithTypeParam[A, B]
范圍。 你所做的約束是類型類的構造函數。 您可以通過以下方式為類型成員類型類模擬此行為。 將構造函數設為私有並在具有所需隱式約束的伴隨對象中定義apply
方法(或有時稱為instance
)
abstract class TCWithAbstractType[A] private {
type B
}
object TCWithAbstractType {
def apply[A, _B: IsValidForTC]: TCWithAbstractType[A] { type B = _B } =
new TCWithAbstractType[A] { type B = _B }
}
您可以添加見證,但它需要在類范圍內,以便它可以訪問B
:
abstract class TCWithAbstractType[A] {
type B
implicit val ev: IsValidForTC[B]
}
但在實踐中,這通常不如類型參數方便,因為它必須顯式實現,例如
new TCWithAbstractType[A] {
type B = ...
implicit val ev: IsValidForTC[B] = ...
}
而構造函數參數只是從外部范圍獲取隱式值。
注意:這是我對您的后續問題的回答的部分重復,但留在這里以防有人首先偶然發現這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.