Scala:如何将列表与值相乘
现在学习Scala并使用列表列表。要将数组乘以一个元素(例如,1) 但是,我得到以下错误: 需要标识符,但找到整数常量 当前代码:Scala:如何将列表与值相乘,scala,list,multiplication,Scala,List,Multiplication,现在学习Scala并使用列表列表。要将数组乘以一个元素(例如,1) 但是,我得到以下错误: 需要标识符,但找到整数常量 当前代码: 您的代码存在一些问题: 通常,不能对无约束泛型类型执行算术运算;不知何故,您必须传达任何受支持的算术运算 乘以1通常不会产生任何效果 如前所述,您不会使用方括号声明List实例(它们用于声明泛型类型参数) 传递给multiply的参数是两个单独的列表(使用无效分号分隔符而不是逗号),而不是列表列表 在if子句中,返回值为Nil,它与List[List[A]]的声明返
您的代码存在一些问题:
List
实例(它们用于声明泛型类型参数)multiply
的参数是两个单独的列表(使用无效分号分隔符而不是逗号),而不是列表列表if
子句中,返回值为Nil
,它与List[List[A]]
的声明返回类型相匹配。但是,else
子句正在尝试执行一个计算,该计算将List
实例(而不是列表的内容)乘以一个Int。即使这有意义,结果类型显然不是List[List[a]
。(这也让我很难准确地理解您想要实现的目标。)List(List(15, 20, 25, 30), List(20, 25, 30, 35, 40))
2419200
但是,您可能只是试图将列表中的所有值相乘。这实际上有点简单(注意不同的返回类型):
这将产生以下输出:
List(List(15, 20, 25, 30), List(20, 25, 30, 35, 40))
2419200
我建议你读一本关于Scala的好书。在这些例子中有很多非常复杂的东西,在这里解释这些东西需要很长时间。一个好的开始是用Scala编程,Odersky,Spoon&Venners的第三版。这将涵盖
列出[A]
操作,如映射
、展平
和产品
,以及隐式
函数参数和隐式val
声明。您的代码有一些问题:
List
实例(它们用于声明泛型类型参数)multiply
的参数是两个单独的列表(使用无效分号分隔符而不是逗号),而不是列表列表if
子句中,返回值为Nil
,它与List[List[A]]
的声明返回类型相匹配。但是,else
子句正在尝试执行一个计算,该计算将List
实例(而不是列表的内容)乘以一个Int。即使这有意义,结果类型显然不是List[List[a]
。(这也让我很难准确地理解您想要实现的目标。)List(List(15, 20, 25, 30), List(20, 25, 30, 35, 40))
2419200
但是,您可能只是试图将列表中的所有值相乘。这实际上有点简单(注意不同的返回类型):
这将产生以下输出:
List(List(15, 20, 25, 30), List(20, 25, 30, 35, 40))
2419200
我建议你读一本关于Scala的好书。在这些例子中有很多非常复杂的东西,在这里解释这些东西需要很长时间。一个好的开始是用Scala编程,Odersky,Spoon&Venners的第三版。这将涵盖
列出[A]
操作,如映射
、展平
和产品
,以及隐式
函数参数和隐式val
声明。使数值操作可用于A
类型,您可以使用context-bound
将A
与之关联,后者提供了times
和fromInt
等方法,以便在此用例中执行必要的乘法:
def multiply[A: Numeric](listOfLists: List[List[A]]): List[List[A]] = {
val num = implicitly[Numeric[A]]
import num._
if (listOfLists == Nil) Nil else
listOfLists.head.map(times(_, fromInt(-1))) :: multiply(listOfLists.tail)
}
multiply( List(List(3, 4, 5, 6), List(4, 5, 6, 7, 8)) )
// res1: List[List[Int]] = List(List(-3, -4, -5, -6), List(-4, -5, -6, -7, -8))
multiply( List(List(3.0, 4.0), List(5.0, 6.0, 7.0)) )
// res2: List[List[Double]] = List(List(-3.0, -4.0), List(-5.0, -6.0, -7.0))
有关
上下文绑定
的更多详细信息,请参阅相关的。以使数值操作可用于键入a
,您可以使用context-bound
将A
与之关联,后者提供了times
和fromInt
等方法,以便在此用例中执行必要的乘法:
def multiply[A: Numeric](listOfLists: List[List[A]]): List[List[A]] = {
val num = implicitly[Numeric[A]]
import num._
if (listOfLists == Nil) Nil else
listOfLists.head.map(times(_, fromInt(-1))) :: multiply(listOfLists.tail)
}
multiply( List(List(3, 4, 5, 6), List(4, 5, 6, 7, 8)) )
// res1: List[List[Int]] = List(List(-3, -4, -5, -6), List(-4, -5, -6, -7, -8))
multiply( List(List(3.0, 4.0), List(5.0, 6.0, 7.0)) )
// res2: List[List[Double]] = List(List(-3.0, -4.0), List(-5.0, -6.0, -7.0))
有关
上下文绑定的更多详细信息,请参阅相关的。您需要理顺语法。在Scala中,必须传递方括号中的类型。您试图用错误的语法传递值。您可能需要执行类似于乘法(List(List(3,4,5,6),List(4,5,6,7,8))
。在Scala中,你通常不需要分号。你的问题很不清楚。您能否提供您希望发生的事情的精确说明,包括任何和所有规则、这些规则的例外情况、拐角情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出,以演示在正常情况下,以及在所有异常情况下、角落情况下、特殊情况下、边界情况下和边缘情况下预期会发生的情况?您需要理顺语法。在Scala中,必须传递方括号中的类型。您试图用错误的语法传递值。您可能需要执行类似于乘法(List(List(3,4,5,6),List(4,5,6,7,8))
。在Scala中,通常不需要分号