我正在尝试打印列表中每个数字的所有因素。
这是我的代码:
def main(args: Array[String])
{
val list_of_numbers = List(1,4,6)
def get_factors(list_of_numbers:List[Int]) : Int =
{
return list_of_numbers.foreach{(1 to _).filter {divisor => _ % divisor == 0}}
}
println(get_factors(list_of_numbers));
}
我希望最终结果包含一个列表,该列表将包含列表中任何数字因子的所有数字。所以最终的结果应该是(1,2,3,4,6)。现在,我收到以下错误:
error: missing parameter type for expanded function ((x$1) => 1.to(x$1))
return list_of_numbers.foreach{(1 to _).filter {divisor => _ % divisor == 0}}
我该如何解决这个问题?
答案 0 :(得分:2)
你只能在一个函数中使用_
一次速记(某些特殊情况除外),即便不是这样。
尝试拼写出来:
list_of_numbers.foreach { n =>
(1 to n).filter { divisor => n % divisor == 0 }
}
这将编译。
您的代码还有其他问题。
foreach
会返回Unit
,但您需要Int
。
也许,您想要一个.map
而不是.foreach
,但这仍然是List
,而不是Int
。
答案 1 :(得分:1)
这里有一些问题。
首先,foreach
将函数A => Unit
作为参数,这意味着它只是导致副作用。
第二次使用_
时,可以在函数使用每个参数一次时使用_。
最后,您的预期输出似乎正在消除重复(1是所有3个输入的因素,但它只出现一次)。
list_of_numbers flatMap { i => (1 to i) filter {i % _ == 0 }} distinct
会做你想要的。
flatMap从A => List[B]
获取一个函数并生成一个简单的List[B]
作为输出,list.distinct
删除重复项。
答案 2 :(得分:1)
实际上,您的代码存在一些问题。
首先, foreach 是一种产生 Unit 的方法(如Java中的 void )。你想要产生一些东西,所以你应该使用来理解。
其次,在你的除数测试函数中,你已经指定了未命名参数(“_”)和命名参数(除数)。
第三个问题是你希望结果是 Int (在代码中),但你的描述中是 List [Int] 。
以下代码将执行您想要的操作(尽管它会重复因素,因此您可能希望在使用结果之前通过 distinct 传递它):
def main(args: Array[String]) {
val list_of_numbers = List(1, 4, 6)
def get_factors(list_of_numbers: List[Int]) = for (n <- list_of_numbers; r = 1 to n; f <- r.filter(n%_ == 0)) yield f
println(get_factors(list_of_numbers))
}
请注意,中需要两个生成器(“&lt; - ”)才能理解,以便最终只使用 List 。如果您在yield表达式中实现了过滤器部分,则会得到 List [List [Int]] 。