タイトルを持つYouTube動画を視聴した後、Scala Type Members vs Type Parameters。私は以下を書いた。純粋なタイプのパラメータとメンバーとの混合タイプのパラメータ
純粋型パラメータバージョンは細かい
trait Joiner[Elem,R] { def join(xs: Seq[Elem]): R } object Program { def doJoin[T,R] (xs: T *) (implicit j: Joiner[T,R]): R = j.join (xs) def main(args: Array[String]): Unit = { implicit val charToStringJoiner = new Joiner[Char,String] { override def join(xs: Seq[Char]): String = xs.mkString("+") } implicit val charToInt = new Joiner[Char,Int] { override def join(xs: Seq[Char]): Int = xs.mkString.toInt } val s:String = doJoin[Char,String]('1','2') println(s) val n :Int = doJoin[Char,Int]('1','2') println(n) } }
混合型のメンバ&パラメータバージョン働く -
trait Joiner[Elem] { type R def join(xs: Seq[Elem]): R } object Program { def doJoin[T] (xs: T *) (implicit j: Joiner[T]): j.R = j.join (xs) def main(args: Array[String]): Unit = { implicit val charToStringJoiner = new Joiner[Char] { override type R = String override def join(xs: Seq[Char]): String = xs.mkString("+") } implicit val charToInt = new Joiner[Char] { override type R = Int override def join(xs: Seq[Char]): Int = xs.mkString.toInt } val s:String = doJoin('1','2') //doesn't work println(s) val n :Int = doJoin('1','2') //doesn't work println(n) } }
バージョン1をただし、バージョン2で結構ですコンパイルされません。どのようにスコープ内に暗黙のうちにこれを修正することができますか?具体的にどのように私はコンパイラが正しい暗黙的に解決するのに役立つ戻り値の型を指定することができます
私はそれができるとは思わない。ほとんどの状況下では、コンパイラは最初のパラメータリストでしか曖昧さを解消できません。 – jwvh