结合部分功能

时间:2016-08-18 16:44:12

标签: scala function partial-functions

我来自Java,想要结合两个部分功能:

def sum(a: Int, b: Int, c: Int) : Int = a + b + c

我想写这样的东西:

val l = List(1, 2, 3)
l.foreach(println _  sum (1, _ : Int, 3) ) // It's supposed to apply
                                  // the partial sum(1, _: Int, 3) 
                                  // and println computed value.

但它拒绝编译。有没有办法简洁地修复它?

2 个答案:

答案 0 :(得分:3)

您尝试做的事情几乎没有问题。首先,println是一个重载方法,所以当你试图将它扩展为像println _这样的函数时,Scala采用最短的形式,即带有0个参数的形式:

scala> println _
res0: () => Unit = $$Lambda$1048/48841776@58ec44ec

所以你需要更加具体:

scala> println(_: Int)
res1: Int => Unit = $$Lambda$1064/1621799037@1e8bddc4

既然我们有正确的功能,还有一件事要做:添加compose和正确的括号(附加括号包装匿名函数):

scala> l.foreach((println(_: Int)) compose  (sum (1, _: Int, 3)))
5
6
7

或在另一个方向:

scala> l.foreach((sum (1, _: Int, 3)) andThen (println(_: Int)))
5
6
7

答案 1 :(得分:2)

假设我正确地阅读了您想要的内容(甚至是代码,这是一个很大的假设),这里有一个可能实现它的代码片段:

scala> def sum(a: Int, b: Int, c: Int) : Int = a + b + c
sum: (a: Int, b: Int, c: Int)Int

scala> val sum13 = sum(1, _ : Int, 3)
sum13: Int => Int = <function1>

scala> val printInt = println( _ : Int )
printInt: Int => Unit = <function1>

scala> List(1,2,4) foreach { printInt compose sum13 }
5
6
8

注意compose。另一种方法是明确撰写x => printInt(sum13(x))