尝试在Scala中映射列表时出错

时间:2016-11-23 21:03:11

标签: scala

我正在尝试打印列表中每个数字的所有因素。

这是我的代码:

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}}

我该如何解决这个问题?

3 个答案:

答案 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]]