【问题标题】:Partially applied functions in ScalaScala 中的部分应用函数
【发布时间】:2012-11-22 19:01:36
【问题描述】:

想知道您是否可以评论为什么以下两种情况的行为不同:

以下作品:

var la= List(12, 13 , 14 ,15);
var func = (x:Int) => println(x)
la.foreach(func)                   // 1
la.foreach(func(_))                // 2

但以下不是:

var la= List(12, 13 , 14 ,15);
var func1 = (x:Int) => {
    for (i <- 0 to x) yield i*2
 } mkString
la.foreach(println(func1))         // similar to 1 above
la.foreach(println(func1(_)))      // similar to 2 above

错误:类型不匹配; 发现:单位 必需: Int => ? la.foreach(println(func1(_)))

【问题讨论】:

标签: scala functional-programming partial-application


【解决方案1】:

此案例已脱糖

la.foreach(println(func1(_))) 

la.foreach(println(x => func1(x)))

所以你将函数传递给println,打印返回类型是Unit,foreach需要一些Int =&gt; ?函数。

相比之下,在这两种情况下,第一个样本都将foreachInt =&gt; Unit 一起喂食,而在两种情况下的第二个样本中,您将foreachUnit 一起喂食。

【讨论】:

  • 我知道通过明确指定参数 (x) 我们可以使其工作.. 但是为什么它不适用于部分提供的参数.?在您的两个代码位中,println 仍然返回 Unit.. 那么它如何改变 foreach 的行为
  • 它没有,它只是不输入检查。看看func1 的脱糖与func 有何不同
【解决方案2】:

在第二个代码 sn-p 中,您正在调用 println,并将函数作为其参数,然后尝试将该调用的结果作为参数传递给 foreach。由于println 不返回函数,但foreach 想要一个函数,所以这是行不通的。

【讨论】:

  • 谢谢!我们如何解决这个问题,但仍然使用部分提供的参数?
  • @Shalab 据我所知,你不能。您必须使用带有显式参数的 lambda。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2011-08-05
  • 2012-03-14
相关资源
最近更新 更多