2016-08-10 5 views
2

ソート済みマージ機能をリストに追加するtypeclassを作成しようとしています。typeclassを定義できません

私は

error: List[Int] takes no type parameters, expected: one 
    val IntSortedMerge = new SortedMerge[Int, List[Int]] { 
              ^

は、私がここで間違って何をしているのですか?、次のエラーを取得しています

trait SortedMerge[A, B[A] <: List[A]] { 
    def sortedMerge(l1: B[A], l2: B[A]): B[A] 
} 

implicit val IntSortedMerge = new SortedMerge[Int, List[Int]] { 
    override def sortedMerge(l1: List[Int], l2: List[Int]): List[Int] = { 
    @tailrec 
    def merge(l1: List[Int], l2: List[Int], l: List[Int]): List[Int] = { 
     (l1, l2) match { 
     case (Nil, Nil) => l 
     case (Nil, _) => l ++ l2 
     case (_, Nil) => l ++ l1 
     case (h1 :: t1, h2 :: t2) if (h1 < h2) => merge(t1, l2, l :+ h1) 
     case (h1 :: t1, h2 :: t2) => merge(l1, t2, l :+ h2) 
     } 
    } 

    merge(l1, l2, List[Int]()) 
    } 
} 


def sortedMerge[A, List[A]](l1: List[A], l2: List[A]) 
    (implicit merger: SortedMerge[A, List[A]]) = merger.sortedMerge(l1, l2) 

答えて

2

このエラーが発生する理由は、このバインドが[A, B[A] <: List[A]]であるためです。第2の型のパラメータは、より高級な型でなければならない。 (?)だからあなたのコードは、このように書き換えることがコールド

import scala.language.higherKinds 

val IntSortedMerge = new SortedMerge[Int, List] { 
    // stuff 
} 

def sortedMerge[A](l1: List[A], l2: List[A]) 
    (implicit merger: SortedMerge[A, List]) = merger.sortedMerge(l1, l2) 

EDITあなたが期待しているので、あなたが実際に第二種のパラメータをドロップすることができ、あなたの場合は

のみリスト:

trait SortedMerge[A] { 
    def sortedMerge(l1: List[A], l2: List[A]): List[A] 
} 

val IntSortedMerge = new SortedMerge[Int] { 
    // stuff 
} 

def sortedMerge[A](l1: List[A], l2: List[A]) 
    (implicit merger: SortedMerge[A]) = merger.sortedMerge(l1, l2) 

しかし、[A, B[A] <: Seq[A]]のようなものにバインドすると、SeqサブクラスのSortedMergeを構築できます。

+0

は実際に私がジェネリック型クラスを記述しようとしていますが、私はそれを制限しましたリストにはこの例でのみリストします。 –

+0

@SarveshKumarSinghオクラホマ、参照してください。だから最初の解決策はあなたの必要性を足元で今のところは – vsminkov

1

これは罰金コンパイル:

trait SortedMerge[A, B <: List[A]] { 
    def sortedMerge(l1: B, l2: B): B 
} 

implicit val IntSortedMerge = new SortedMerge[Int, List[Int]] { 
    // ... omitted 
} 

def sortedMerge[A, B <: List[A]](l1: B, l2: B) 
    (implicit merger: SortedMerge[A, B]) = merger.sortedMerge(l1, l2)  

使用法:

println(sortedMerge[Int, List[Int]](List(2, 4), List(1, 3))) 

プリント:

List(1, 2, 3, 4) 
+0

ですが、省略された部分を追加すると 'sortedMerge'の現在の署名で解決できなくなります。 –

+0

@SarveshKumarSingh:どうしてですか? IntSortedMerge.sortedMerge(List [Int](1,3)、List [Int](2,4)) 'を省略すると、リスト(1,2,3,4)を返す。部。 – charlie

+0

@SarveshKumarSingh: 'IntSortedMerge'が' implicit'になると、 'sortedMerge [Int、List [Int]](List [Int](1,3)、List [Int](2) 、4)) '(つまり、私の前のコメントのように' IntSortedMerge'で明示的に定義されたものではありません)。 – charlie

関連する問題