2014-02-21 44 views
3

我有聲明空集的問題 - 因爲它會產生一個亞型,我不能使用Nil ...如何設計可與用戶定義集合一起使用的函數?

def partiallyReduceString[S <: SeqLike[String, S]](reduction: String, seq: S): (String, S) = 
    if (seq.nonEmpty) 
    ... 
    else 
    (reduction, Nil) 

我也試過CanBuildFrom,但我只是得到編譯時錯誤...

def partiallyReduceString ... (implicit bf: CanBuildFrom[S, String, S]): (String, S) = 
    if (seq.nonEmpty) 
    ... 
    else 
    (reduction, bf().result()) 

不能構造型S的集合基於類型的集合S.

String類型 的元件

回答

2

問題是,元組的第二個元素應該是S類型的,它可以被看作SeqLike集合,但不是相反的。所以即使在這種情況下bf也無濟於事。另一點是,無論你在結果中輸入什麼,S都可以是ListArray類型,但是這不能在編譯時查看。您可能想要通過指定一種獨立創建類型S的空集合的方式來定義另一個約束。

import scala.collection.SeqLike 
implicit val emptyList =() => List() 
implicit val emptyArray[T] =() => Array[T]() 
def partiallyReduceString[S <: SeqLike[String, S]](reduction: String, seq: S)(implicit empty:() => S): (String, S) = { 
    if (seq.nonEmpty) 
    ??? 
    else 
    (reduction, empty()) 
    } 
+0

非常好的一點。假設我把它從一個視圖綁定到標準約束 - 這個問題肯定會消失 - 但我仍然有CanBuildFrom的編譯時問題 –

+0

我已經從示例中移除了視圖,將焦點移到主要問題:) –

+0

'S可以是List或Set'類型 - 不知道我明白:Set不是SeqLike的子類型,是嗎?確實是 –

相關問題