2017-07-12 7 views
2

AからBに汎用コレクションM[A]と関数を取り込み、マップメソッドを使用してコレクションM[B]を返すメソッドを作成するにはどうすればよいですか?Scalaメソッドを汎用コレクションに変換する

ような何か:上記の方法はとコンパイルに失敗し def convert[A, M[X] <: Traversable[X], B](in: M[A], f: A => B): M[B] = in.map(f)

type mismatch; found : Traversable[B] required: M[B]Traversable[A].map(f: A => B)の静的タイプはOleg Pyzhcov

が指すようにTraversable[B]です。注:このメソッドの目的は、単にコレクションをマッピングすることではなく、単なる単純化です。

+1

問題の投稿方法は何ですか? – talex

+0

このメソッドはコンパイルに失敗します。 型の不一致。 が見つかりました:トラバーサブル[B] が必要です:M [B] – dreigada

+0

あなたの質問に含めてください。これは、将来の検索を簡素化します。 – talex

答えて

4

mapの完全な署名はあなたが呼び出しサイトからそのCanBuildFromを提供し、ReprLikeに終了していコレクションの特性を使用して、具体的なタイプM[A]に推測されていることを確認する必要があり

def map[B, That](f: (A) ⇒ B)(implicit bf: CanBuildFrom[Repr, B, That]): That 

です2つのタイプのパラメータ

import scala.collection.generic.CanBuildFrom 
import scala.collection.TraversableLike 
import scala.language.higherKinds 

def convert[M[x] <: TraversableLike[x, M[x]], A, B](
    in: M[A], 
    f: A => B 
)(implicit 
    cbf: CanBuildFrom[M[A], B, M[B]] 
): M[B] = in.map(f)(cbf) 
+0

私は上記の@talexと同じコメントを持っています: 'M [X]'が 'Traversable [X]'を拡張するなら 'TraversableLike'から継承した' map'をすでにサポートしています。それではなぜ「in.map(f)」ではないのですか? –

+0

@AlexanderArendar静的タイプのTraversable [A] .map(f:A => B)は、Traversable [B]であり、著者が望むM [B]ではありません。 –

+0

明確で、説明のためにありがとう –

関連する問題