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

尝试映射Scala中的列表时出错,scala,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_facto

我试图打印出列表中每个数字的所有因子

这是我的密码:

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

如何解决此问题?

您只能在函数中使用
\u
速记一次(某些特殊情况除外),即使如此,也不总是如此。 试着把它拼出来:

list_of_numbers.foreach { n =>
   (1 to n).filter { divisor => n % divisor == 0 }
}
这将编译

不过,您的代码还有其他问题。
foreach
返回一个
单位
,但您需要一个
Int

也许你想要一个
.map
而不是
.foreach
,但那仍然是一个
列表
,而不是
Int
你只能在函数中使用一次
\uuu
速记(某些特殊情况除外),即使如此也不总是如此。 试着把它拼出来:

list_of_numbers.foreach { n =>
   (1 to n).filter { divisor => n % divisor == 0 }
}
这将编译

不过,您的代码还有其他问题。
foreach
返回一个
单位
,但您需要一个
Int

也许,您想要的是
.map
而不是
.foreach
,但这仍然是一个
列表,而不是
Int
,这里有一些问题

首先,
foreach
将函数
a=>Unit
作为参数,这意味着它实际上只是用于引起副作用

其次,当函数使用每个参数一次时,您可以使用u

最后,您的预期输出似乎消除了重复项(1是所有3个输入的一个因子,但它只出现一次)

我会做你想做的事


flatMap从
a=>List[B]
中获取一个函数,并生成一个简单的
List[B]
作为输出,
List。distinct
消除了重复项。

这里有一些问题

首先,
foreach
将函数
a=>Unit
作为参数,这意味着它实际上只是用于引起副作用

其次,当函数使用每个参数一次时,您可以使用u

最后,您的预期输出似乎消除了重复项(1是所有3个输入的一个因子,但它只出现一次)

我会做你想做的事


flatMap从
a=>List[B]
中获取一个函数,并生成一个简单的
List[B]
作为输出,
List。distinct
消除重复项。

实际上,您的代码有几个问题

首先,foreach是一种生成单元的方法(就像Java中的void)。你想得到一些东西,所以你应该用a来理解

第二,在除数测试函数中,您指定了未命名参数(“\u1”)和命名参数(除数)

第三个问题是,您希望结果是Int(在代码中),但在描述中列出[Int]

以下代码将执行您想要的操作(尽管它将重复因子,因此您可能希望在使用结果之前将其传递给distinct):

def main(参数:数组[字符串]){ val list_of_编号=列表(1,4,6)
def get_factors(list_of_numbers:list[Int])=for(n实际上,您的代码有几个问题

首先,foreach是一个产生单元的方法(就像Java中的void),您想要产生一些东西,所以应该使用一个函数来理解

第二,在除数测试函数中,您指定了未命名参数(“\u1”)和命名参数(除数)

第三个问题是,您希望结果是Int(在代码中),但在描述中列出[Int]

以下代码将执行您想要的操作(尽管它将重复因子,因此您可能希望在使用结果之前将其传递给distinct):

def main(参数:数组[字符串]){ val list_of_编号=列表(1,4,6)

def get_factors(list_of_numbers:list[Int])=for(n还值得注意的是,此表达式返回的单位可能不是OP想要的单位是……刚刚意识到/添加了
map
将返回
list[Int]
您需要
flatMap
来取消对结果的测试。是的…
。flatMap
仍将返回一个
列表
,而函数结果需要一个
Int
。我不确定这里的目的是什么。还值得注意的是,此表达式返回的单位可能不是OP想要的。是的…刚刚意识到/添加了这一点
map
将返回一个
List[List[Int]
您需要
flatMap
来取消对结果的测试。是的…
。flatMap
仍将返回一个
列表
,而函数结果需要一个
Int
。我不确定这里的目的是什么。根据您的描述,方法的签名应该是
def get\u factors(List\u number:List[Int]):List[Int]
作为旁注,您不需要声明
return
,通常不鼓励使用它。根据您的描述,您的方法的签名应该是
def get\u factors(数字列表:list[Int]):list[Int]
作为旁注,您不需要声明
return
,通常不鼓励使用它。这似乎可行,但结果是(1,1,2,4,1,2,3,6),我需要删除重复项才能获得(1,2,3,4,6)@lalakers4life的确如此。如前所述,对结果应用distinct。感谢您的投票。非常感谢。另一个问题,有没有其他方法可以做到这一点,这样我们就不会创建像n或r这样的元素在代码中发生变异?我想尝试用纯函数式编程,其中数据是不可变的。好问题。如何解决这里没有什么是可变的。n和r只是代数意义上的变量。为理解而生成的n或r的每一个值都是不可变的,也就是说等价于
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))
}