Объединение частичных функций

Я пришел из 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 ответа

Решение

Предполагая, что я правильно читаю то, что вы хотите (и даже код, это огромное предположение), вот фрагмент, который может этого достичь:

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 = $$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
Другие вопросы по тегам