误用 Scala 或 Eclipse 使用隐式错误

发布于 2024-10-13 05:55:45 字数 452 浏览 1 评论 0原文

我有一个类定义如下:

class NDArray[T](data: List[List[T]])(implicit num: Numeric[T])
 .....

我有一个创建并返回新 NDArray 的对象:

object Foo
{
   def apply() =
   {
      new NDArray(List(List())
   }
}

我收到以下错误: 构造函数 NDArray 的参数不足:(隐式 num:Numeric[A])com.numscal.matrix.NDArray[A]。未指定值参数 num。

我尝试在创建 NDArray 的对象中导入 Numeric,但这不起作用。我的 NDArray 单元测试不导入 Numeric,并且没有任何问题。

我对发生的事情感到困惑。有什么想法吗?

I have a Class defined below:

class NDArray[T](data: List[List[T]])(implicit num: Numeric[T])
 .....

I have an object that creates and returns a new NDArray:

object Foo
{
   def apply() =
   {
      new NDArray(List(List())
   }
}

I am getting the following error:
not enough arguments for constructor NDArray: (implicit num: Numeric[A])com.numscal.matrix.NDArray[A]. Unspecified value parameter num.

I've tried importing Numeric in the object that creates the NDArray, but that doesn't work. My unit tests for NDArray don't import Numeric and they don't have any issues.

I am confused as to what is going on. Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

〗斷ホ乔殘χμё〖 2024-10-20 05:55:45

dataT 类型的列表的列表。 NDArray 的构造函数需要一个 Numeric[T] 类型的对象。由于该参数被声明为隐式,这意味着当编译器可以在当前可见范围内找到一个也被定义为隐式的参数时,您无需显式指定该参数。 >。

现在,由于您创建了 NDArray 实例而未指定 T,编译器会推断 T。它找到列表的列表,并使用内部列表的元素类型作为T。但由于您没有指定该列表并且列表为空,因此默认为 List[Nothing],因此编译器得出结论 T 是类型 什么都没有

然后,它搜索 Numeric[Nothing]隐式实例,但该实例不存在。

您可以做几件事。要么:

new NDArray(List(List[Int]()))

要么:(

new NDArray[Int](List(List()))

虽然我不确定最后一个是否会起作用。我不知道编译器是否会正确推断内部列表的类型参数;你只需要尝试一下。

)默认情况下已导入 Numeric[Int] 的隐式 实例,因为它是 Predef 的一部分。您不需要显式导入它。所有原始数字类型也是如此。

我不知道你是否想使用整数列表、浮点数列表或其他什么。编译器也不知道,并且无法推断,因为您给出的列表是空的。

data is a list of lists of type T. The constructor of NDArray requires an object of type Numeric[T]. Because that parameter is declared implicit, that means that you don't need to specify one explicitly when the compiler can find one in the currently visible scope that also has been defined as implicit.

Now, since you create an instance of NDArray without specifying T, the compiler infers T. It finds the list of lists, and uses the element type of the inner list as T. But since you did not specify that one and the list is empty, this defaults to being a List[Nothing], therefore, the compiler concludes that T is the type Nothing.

Then it searches for an implicit instance of Numeric[Nothing], but that does not exist.

There are several things you can do. Either:

new NDArray(List(List[Int]()))

Or:

new NDArray[Int](List(List()))

(Although I'm not sure if that last one is gonna work. I don't know if the compiler will infer the type parameter of the inner list correctly; you just have to try it.)

The implicit instance of Numeric[Int] is already imported by default, since it is part of Predef. You don't need to import it explicitly. The same goes for all primitive numeric types.

I don't know if you want to use a list of lists of integers, or floats, or whatever. The compiler does not know either, and it can't infer because the list you have given is empty.

忆梦 2024-10-20 05:55:45
scala> List(List())
res19: List[List[Nothing]] = List(List())

Nothing 没有隐式数值,请使用 List.empty[List[TypeYouNeed]]

scala> List(List())
res19: List[List[Nothing]] = List(List())

There is no implicit Numeric for Nothing, use List.empty[List[TypeYouNeed]]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文