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))
^
でコンパイルされません。それは奇妙です。なぜel
はAny
と仮定されますか?
私は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])
}
}
ありがとう!私は型変数バインディングを見逃しました。 – Zernike