たちは、コレクションに等しいミニマリズムのすべての要素を返すminBy
ような関数を作りたいと言います私たちの最初のList
の代わりに。一般的な方法では、元のコレクション型を返す
だから、私はC
バックではなくTraversable[A]
得る可能性があります期待して
def multiMinBy[A, B: Ordering, C <: Traversable[A]](xs: C)(f: A => B)
に署名を変更してみました。しかし、私は何も戻って得ることはありません:
scala> multiMinBy(List("zza","zzza","zzb","zzzb"))(_.last)
<console>:9: error: inferred type arguments [Nothing,Nothing,List[java.lang.String]]
do not conform to method multiMinBy's type parameter bounds [A,B,C <: Traversable[A]]
私たちはA
が推察された前の引数に現れるC
を持っているので、これがあると思いますか?だから私は、引数の順序を反転して、キャストを追加しました:
def multiMinBy[A, B: Ordering, C <: Traversable[A]](f: A => B)(xs: C) = {
val minVal = f(xs minBy f)
(xs filter (f(_) == minVal)).asInstanceOf[C]
}
働く、私たちはこのようにそれを呼び出す必要があり除い:
multiMinBy((x: String) => x.last)(List("zza","zzza","zzb","zzzb"))
を元の構文を保持する方法はあります、適切なコレクションタイプを取得していますか?
はい、私は同意します、これは私より良い解決策です。 –