私の知る限り、コレクションライブラリには、map
メソッドを定義する共有トレイトはありません(おそらく、のシグネチャが異なるためですmap
)。
変更イベントがある監視可能な値(UIシステムのプロパティを考えてください)があります。map
観測可能な値は、メソッドを使用してマッピングできます。
ただし、すでにメソッドを持っているタイプで作業している場合はmap
、の組み込みメソッドを使用できるはずですmap
。
したがって、代わりに:
prop map { x =>
x map { actualX =>
//do something
}
}
私はそれをこのように使いたい:
prop map { actualX =>
//do something
}
簡略化されたテストケースがあります。まず、私が使用しているさまざまなパーツ:
// leaving out the observable part
trait ObservableValue[T] {
def value: T
}
trait LowerPriorityImplicits {
// default implementation that adds a regular map method
implicit class RichObservableValue1[A](o: ObservableValue[A]) {
def map[B](f: A => B): ObservableValue[B] = new ObservableValue[B] {
def value = f(o.value)
}
}
}
object ObservableValue extends LowerPriorityImplicits {
// describe a type that has a map method
type HasMapMethod[A, Container[X]] = {
def map[B](f: A => B): Container[B]
}
// complex implementation that uses the builtin map if present
implicit class RichObservableValue2[A, Container[Z] <: HasMapMethod[Z, Container]](
o: ObservableValue[Container[A]]) {
def map[B](f: A => B): ObservableValue[Container[B]] =
new ObservableValue[Container[B]] {
def value = o.value.map(f)
}
}
}
上記のコードに何か(または多分)問題がある場合は、私に知らせてください。私はそれをこのように使いたい:
class TestCase extends ObservableValue[Option[Int]] {
def value = None
}
val x = new TestCase
x map { value =>
// this fails because the compiler finds the lower priority implicit
(value: Int).toString
}
// the method itself works fine
ObservableValue.RichObservableValue2(x) map { value =>
(value: Int).toString
}
私がそれに変更Container[B]
すると、暗黙の変換Any
が見つかります。RichObservableValue2
タイプを使用して暗黙を選択する方法についての私の知識は限られています。
私は次の場所で答えを見つけようとしましたが、主題は少し圧倒的です:
- Scalaはどこで暗黙を探しますか?
- Scalaで暗黙を連鎖させるにはどうすればよいですか?
- Scala:暗黙的なパラメーター解決の優先順位
- http://eed3si9n.com/revisiting-implicits-without-import-tax
- ScalaReference.pdfのセクション6.26.3「オーバーロードの解決」
この課題を解決する方法はありますか?
編集
FilterMonadic
コレクションの特徴について知っています。クラスmap
で定義されているメソッドを認識するソリューションを探しています。Option
編集2
FilterMonadic
バリアントも機能していないようです。オブジェクトに追加RichObservableValue3
しました。RichObservableValue
implicit class RichObservableValue3[A, C[Z] <: FilterMonadic[Z, C[Z]]](o: ObservableValue[C[A]]) {
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[C[A], B, That]): ObservableValue[That] = new ObservableValue[That] {
def value = o.value.map(f)
val change = o.change map (_ map f)
}
}
List[Int]
また、aは有効な引数ですが、その暗黙の変換は選択されません。暗黙を選択するときに使用されるいくつかのルールが欠落している必要があります。