2017-06-12 19 views
1

トラバース可能なオブジェクトで動作する関数を実装しようとしています。Traversable foldLeftの関数引数が型不一致になる

def f[V, M[_] <: Traversable[_]](ei: M[V])(builder: GenericCompanion[M]): M[V] = 
    ei.foldLeft(builder.empty[V])((accum: M[V], el: V) => builder(el)) 

このコードは、理由のScala 2.11.8と2.12.1で再現

Error:(22, 57) type mismatch; 
found : el.type (with underlying type Any) 
required: V 
    ei.foldLeft(builder.empty[V])((accum, el) => builder(el)) 
                ^

でコンパイルされません。それは奇妙です。なぜelAnyと仮定されますか?


私はcatsライブラリで解決できました。だから質問は「それをする方法」ではない。なぜ純粋なスカラコードが間違っているのですか?

def f[V, M[_] : Foldable : Alternative](ei: M[V]): M[V] = { 
    val monoidK = implicitly[MonoidK[M]] 

    ei.foldLeft(monoidK.empty[V]) { 
    (accum, el) => monoidK.algebra[V].combine(accum, el.pure[M]) 
    } 
} 

答えて

1

それがコンパイル手紙Xでそれを交換した後、型境界で_での問題のように見えます。

def f[V, M[X] <: Traversable[X]](ei: M[V])(builder: GenericCompanion[M]): M[V] = 
    ei.foldLeft(builder.empty[V])((accum: M[V], el: V) => builder(el)) 

いくつかの直感については、this answerをご覧ください。私が理解しているように

M[_] <: Traversable[_]Traversable[Any]であり、いくつかのタイプの穴があります。つまり、Traversableの型穴にAnyを入力してから、Mに新しい型穴を作成します(これは必要ありません)。

M[X] <: Traversable[X]は、タイプホールをMTraversableに同期させます。どんなタイプでもMに入れます。Traversable

+0

ありがとう!私は型変数バインディングを見逃しました。 – Zernike

関連する問題