如何用scala implicits解决方法委托
How to solve method delegation with scala implicits
我该如何解决这个简单的问题。 Class 转换有一个类型化方法 from,它接受两个类型参数 A 和 B 和 returns 一个 B 来自 A。我在伴随对象中定义了一些隐式以提供默认行为。
我的问题是,当我尝试将调用转发到另一个具有相同签名的类型化方法中的转换 class 时,它不起作用。在我的示例中,我尝试将调用从函数 myFun 转发到我的 Conversion class。
我收到以下错误
- 方法参数不足:(隐式 f: A => B)
我想知道为什么这会造成任何问题。有人可以向我解释为什么以及如何解决这个问题吗?
这是代码
object MyConversions {
implicit val IntToStr = (f:Int) => f.toString()
implicit val DoubleToStr = (f:Double) => f.toString()
implicit val BooleanToStr = (f:Boolean) => f.toString()
}
class Conversions{
def from[A,B](a:A)(implicit f:(A) => B) = {
f(a)
}
}
import MyConversions._;
def myFun[A,B](a:A){
// Error
new Conversions().from[A, B](a)
}
// Working
println( new Conversions().from[Int, String](3) )
问题是 Scala 编译器无法在 myFun
的范围内找到参数 f: (A) => B
的隐式值。你要做的是告诉编译器只有在有这样一个值可用时才能调用myFun
。
下面的代码应该可以解决问题
object App {
trait Convertible[A, B] {
def convert(a: A): B
}
object Convertible {
implicit val int2String = new Convertible[Int, String] {
override def convert(a: Int): String = a.toString
}
implicit val float2String = new Convertible[Float, String] {
override def convert(a: Float): String = a.toString
}
}
def myFun[A ,B](a:A)(implicit converter: Convertible[A, B]): B = {
converter.convert(a)
}
def main(args: Array[String]): Unit = {
println(myFun(3))
}
}
我该如何解决这个简单的问题。 Class 转换有一个类型化方法 from,它接受两个类型参数 A 和 B 和 returns 一个 B 来自 A。我在伴随对象中定义了一些隐式以提供默认行为。
我的问题是,当我尝试将调用转发到另一个具有相同签名的类型化方法中的转换 class 时,它不起作用。在我的示例中,我尝试将调用从函数 myFun 转发到我的 Conversion class。
我收到以下错误
- 方法参数不足:(隐式 f: A => B)
我想知道为什么这会造成任何问题。有人可以向我解释为什么以及如何解决这个问题吗?
这是代码
object MyConversions {
implicit val IntToStr = (f:Int) => f.toString()
implicit val DoubleToStr = (f:Double) => f.toString()
implicit val BooleanToStr = (f:Boolean) => f.toString()
}
class Conversions{
def from[A,B](a:A)(implicit f:(A) => B) = {
f(a)
}
}
import MyConversions._;
def myFun[A,B](a:A){
// Error
new Conversions().from[A, B](a)
}
// Working
println( new Conversions().from[Int, String](3) )
问题是 Scala 编译器无法在 myFun
的范围内找到参数 f: (A) => B
的隐式值。你要做的是告诉编译器只有在有这样一个值可用时才能调用myFun
。
下面的代码应该可以解决问题
object App {
trait Convertible[A, B] {
def convert(a: A): B
}
object Convertible {
implicit val int2String = new Convertible[Int, String] {
override def convert(a: Int): String = a.toString
}
implicit val float2String = new Convertible[Float, String] {
override def convert(a: Float): String = a.toString
}
}
def myFun[A ,B](a:A)(implicit converter: Convertible[A, B]): B = {
converter.convert(a)
}
def main(args: Array[String]): Unit = {
println(myFun(3))
}
}