如何解决这个类型类的例子吗?(How to fix this typeclass example?)

2019-10-22 11:56发布

这是一个后续行动,我以前的问题 :

假设我创建了以下测试converter.scala

trait ConverterTo[T] {
  def convert(s: String): Option[T]
}

object Converters {
  implicit val toInt: ConverterTo[Int] =
    new ConverterTo[Int] { 
      def convert(s: String) = scala.util.Try(s.toInt).toOption
    }
}

class A {
  import Converters._
  def foo[T](s: String)(implicit ct: ConverterTo[T]) = ct.convert(s)
}

现在,当我试着打电话给foo在REPL它不能编译:

scala> :load converter.scala
Loading converter.scala...
defined trait ConverterTo
defined module Converters
defined class A

scala> val a = new A()

scala> a.foo[Int]("0")
<console>:12: error: could not find implicit value for parameter ct: ConverterTo[Int]
          a.foo[Int]("0")
                    ^

Answer 1:

import Converters._class A不剪。 你可以将其删除,并在代码仍然编译。 编译器需要在实际隐含找到的那一刻是不是在class A ,其中foo是刚刚宣布。

编译器需要找到一个ConverterTo[Int]在调用时刻隐含范围a.foo[Int](..)是在REPL。 因此,这是进口必须这样做。

假如object Converterstrait ConverterTo被命名为相同的(所以会有一个同伴对象)将不再需要进口。



文章来源: How to fix this typeclass example?