簡體   English   中英

見證抽象類型實現了類型類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM