结合部分功能
Combining 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.
但是它拒绝编译。有没有办法简洁地修复它?
假设我正确阅读了您想要的内容(甚至是代码,这是一个巨大的假设),这里有一个可能实现它的片段:
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))
.
您尝试做的事情几乎没有问题。首先,println
是一个重载方法,因此当您尝试将其扩展为这样的函数时 println _
,Scala 采用最短的形式,即具有 0 个参数的形式:
scala> println _
res0: () => Unit = $$Lambda48/48841776@58ec44ec
所以你需要更具体一点:
scala> println(_: Int)
res1: Int => Unit = $$Lambda64/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
我来自 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.
但是它拒绝编译。有没有办法简洁地修复它?
假设我正确阅读了您想要的内容(甚至是代码,这是一个巨大的假设),这里有一个可能实现它的片段:
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))
.
您尝试做的事情几乎没有问题。首先,println
是一个重载方法,因此当您尝试将其扩展为这样的函数时 println _
,Scala 采用最短的形式,即具有 0 个参数的形式:
scala> println _
res0: () => Unit = $$Lambda48/48841776@58ec44ec
所以你需要更具体一点:
scala> println(_: Int)
res1: Int => Unit = $$Lambda64/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