簡體   English   中英

為什么在帶有隱式參數的另一個方法上定義包裝方法不起作用?

[英]Why defining a wrapping method over another method with an implicit argument doesn't work?

編寫此失敗的類型檢查:

val list = List(1,3,5,2,4)

list sortBy (i => -i) //this is ok

def wrappedSort[A,B](a: List[A])(by: A => B): List[A] = {
     a sortBy by
} // this fails type check

wrappedSort(list)(i => -i) //So this won't work either

我們知道編譯錯誤是: No implicit Ordering defined for B.

為了使其工作,我必須使Wrapper方法具有與包裝方法相同的隱式參數,即:

import math.Ordering

def wrappedSort[A,B](a: List[A])(by: A => B)(implicit ord: Ordering[B]): List[A] = {
     a sortBy by
}

但這很煩人。 在嘗試抽象或擴展某些庫代碼時,遇到了一些復雜的上下文邊界,必須手動重新實現。 有沒有一種解決方法,我不必在自己的摘要中指定隱式參數?

在這種情況下, PreDef (除非您在編譯器中專門禁用它,否則它會處在范圍內)有一個Ordering[Int]實例可用。 因此,編譯器不會失敗,因為它在范圍內,並且知道必須搜索以找到的確切隱式。 當您向抽象B提供該函數簽名時,您實際上告訴編譯器,將不會為B提供所有BOrdering (實際上是已知Universe中的每個單一類型),並且要求B具有所指示的Ordering List上的sortBy函數執行的操作立即失敗。

確實沒有一種方法可以避免這種情況,也根本不需要避免這種情況。 這是設計使然,並且是編譯器的安全功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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