找不到参数的隐式值
Could not find implicit value for parameter
我最近开始学习 Scala 的隐式 "magic",但我在使用隐式 Scala 对象时遇到了麻烦。我已经尝试了所有可能的变体,但似乎没有任何效果。
让我们假设我有一个像这样的 class 和一些 solve()
函数。如果输入 a, b 是 Float,它应该 return 2 Float 值。否则它应该 return 另一种类型值:
class Solver[T](val a: T, val b: T) {
def solve[A](implicit num: customNumeric[T]): Option[(T, T)] = {
Option(
num.f(num.g(a)),
num.f(num.g(b)))
}
}
让我们假设 another-type-value 是 class 的对象,如下所示:
class MyClass[T] (x: T, y: T)(implicit num: customNumeric[T]) {
val field : T = num.f(x)
}
并且假设我在基本 Scala Numeric 中没有我需要的函数,所以我应该制作自己的自定义数字。
这是我所做的:
我用我的方法 f() 和 g() 为我自己的 customNumeric 创建了一个抽象 class 和几个隐式对象,这些对象为某些值类型(例如 Int、Float)扩展了我的 customNumeric并在其中实施方法:
abstract class customNumeric[T] {
def f(x: T): T
def g(x: T): T
}
object customNumeric {
implicit object IntIsCustomNumeric extends customNumeric[MyClass[Int]] {
def f(x: MyClass[Int]) = new MyClass[Int](x.field + 5)
def g(x: MyClass[Int]) = new MyClass[Int](x.field - 5)
}
implicit object FloatIsCustomNumeric extends customNumeric[Float] {
def f(x: Float): Float = x + 3
def g(x: Float): Float = x - 3
}
}
在我看来,Solver 的 solve() 应该使用隐式 customNumeric 对象来根据 Solver 输入值的类型获取 solver() 中引用的方法的实现。
但这并不像编译器所说的那样工作:
could not find implicit value for parameter num: customNumeric[Int]
def f...
它还抱怨因为同一行的构造函数 MyClass
的参数不足。
我已经尝试制作伴生对象以将 Int
转换为 MyClass
:
object Fraction {
implicit def int2MyClass(x: Int): MyClass[Int] = new MyClass[Int](x, 1)
}
但这似乎也行不通。我试图创建另一个隐式对象来实现我在 customNumeric[MyClass[Int]].
中使用的方法
你有什么想法吗?提前致谢!
问题是您试图用 类 定义隐式对象,而它们本身需要相同的隐式对象。
意思是:
class MyClass[T] (x: T, y: T)(implicit num: CustomNumeric[T])
需要存在隐式 CustomNumeric[T]
。您不能使用该类型定义 IntIsCustomNumeric
:
implicit object IntIsCustomNumeric extends customNumeric[MyClass[Int]]
当您实现 IntIsCustomNumeric
时,您需要为类型 Int
实现它,而不是为类型 MyClass[Int]
实现。当你这样做时,即:
object CustomNumeric {
implicit object IntIsCustomNumeric extends CustomNumeric[Int] {
override def f(x: Int): Int = x
override def g(x: Int): Int = x
}
}
现在,您可以创建一个 Solver[Int]
,它采用隐式 CustomNumeric[Int]
:
def main(args: Array[String]): Unit = {
import CustomNumeric._
val solver = new Solver[Int](1, 2)
println(solver.solve)
}
现在,创建从 Int
类型到创建 MyClass[Int]
类型的隐式转换也更容易:
implicit object MyClassIsCustomNumeric extends CustomNumeric[MyClass[Int]] {
override def f(x: MyClass[Int]): MyClass[Int] = new MyClass[Int](x.field + 5)
override def g(x: MyClass[Int]): MyClass[Int] = new MyClass[Int](x.field + 3)
}
implicit def intToMyClass(i: Int) = new MyClass[Int](i)
你怎么看这个
object customNumeric {
implicit object IntIsCustomNumeric extends customNumeric[Int] {
def f(x: Int): Int = x + 3
def g(x: Int): Int = x - 3
}
implicit object FloatIsCustomNumeric extends customNumeric[Float] {
def f(x: Float): Float = x + 3
def g(x: Float): Float = x - 3
}
implicit def int2MyClass(x: Int): MyClass[Int] = new MyClass[Int](x, 1)
implicit object cn extends customNumeric[MyClass[Int]] {
def f(x: MyClass[Int]) = x.field + 5
def g(x: MyClass[Int]) = x.field - 5
}
}
我最近开始学习 Scala 的隐式 "magic",但我在使用隐式 Scala 对象时遇到了麻烦。我已经尝试了所有可能的变体,但似乎没有任何效果。
让我们假设我有一个像这样的 class 和一些 solve()
函数。如果输入 a, b 是 Float,它应该 return 2 Float 值。否则它应该 return 另一种类型值:
class Solver[T](val a: T, val b: T) {
def solve[A](implicit num: customNumeric[T]): Option[(T, T)] = {
Option(
num.f(num.g(a)),
num.f(num.g(b)))
}
}
让我们假设 another-type-value 是 class 的对象,如下所示:
class MyClass[T] (x: T, y: T)(implicit num: customNumeric[T]) {
val field : T = num.f(x)
}
并且假设我在基本 Scala Numeric 中没有我需要的函数,所以我应该制作自己的自定义数字。
这是我所做的:
我用我的方法 f() 和 g() 为我自己的 customNumeric 创建了一个抽象 class 和几个隐式对象,这些对象为某些值类型(例如 Int、Float)扩展了我的 customNumeric并在其中实施方法:
abstract class customNumeric[T] {
def f(x: T): T
def g(x: T): T
}
object customNumeric {
implicit object IntIsCustomNumeric extends customNumeric[MyClass[Int]] {
def f(x: MyClass[Int]) = new MyClass[Int](x.field + 5)
def g(x: MyClass[Int]) = new MyClass[Int](x.field - 5)
}
implicit object FloatIsCustomNumeric extends customNumeric[Float] {
def f(x: Float): Float = x + 3
def g(x: Float): Float = x - 3
}
}
在我看来,Solver 的 solve() 应该使用隐式 customNumeric 对象来根据 Solver 输入值的类型获取 solver() 中引用的方法的实现。
但这并不像编译器所说的那样工作:
could not find implicit value for parameter num: customNumeric[Int]
def f...
它还抱怨因为同一行的构造函数 MyClass
的参数不足。
我已经尝试制作伴生对象以将 Int
转换为 MyClass
:
object Fraction {
implicit def int2MyClass(x: Int): MyClass[Int] = new MyClass[Int](x, 1)
}
但这似乎也行不通。我试图创建另一个隐式对象来实现我在 customNumeric[MyClass[Int]].
中使用的方法你有什么想法吗?提前致谢!
问题是您试图用 类 定义隐式对象,而它们本身需要相同的隐式对象。
意思是:
class MyClass[T] (x: T, y: T)(implicit num: CustomNumeric[T])
需要存在隐式 CustomNumeric[T]
。您不能使用该类型定义 IntIsCustomNumeric
:
implicit object IntIsCustomNumeric extends customNumeric[MyClass[Int]]
当您实现 IntIsCustomNumeric
时,您需要为类型 Int
实现它,而不是为类型 MyClass[Int]
实现。当你这样做时,即:
object CustomNumeric {
implicit object IntIsCustomNumeric extends CustomNumeric[Int] {
override def f(x: Int): Int = x
override def g(x: Int): Int = x
}
}
现在,您可以创建一个 Solver[Int]
,它采用隐式 CustomNumeric[Int]
:
def main(args: Array[String]): Unit = {
import CustomNumeric._
val solver = new Solver[Int](1, 2)
println(solver.solve)
}
现在,创建从 Int
类型到创建 MyClass[Int]
类型的隐式转换也更容易:
implicit object MyClassIsCustomNumeric extends CustomNumeric[MyClass[Int]] {
override def f(x: MyClass[Int]): MyClass[Int] = new MyClass[Int](x.field + 5)
override def g(x: MyClass[Int]): MyClass[Int] = new MyClass[Int](x.field + 3)
}
implicit def intToMyClass(i: Int) = new MyClass[Int](i)
你怎么看这个
object customNumeric {
implicit object IntIsCustomNumeric extends customNumeric[Int] {
def f(x: Int): Int = x + 3
def g(x: Int): Int = x - 3
}
implicit object FloatIsCustomNumeric extends customNumeric[Float] {
def f(x: Float): Float = x + 3
def g(x: Float): Float = x - 3
}
implicit def int2MyClass(x: Int): MyClass[Int] = new MyClass[Int](x, 1)
implicit object cn extends customNumeric[MyClass[Int]] {
def f(x: MyClass[Int]) = x.field + 5
def g(x: MyClass[Int]) = x.field - 5
}
}