2016-08-18 5 views
0

я пришел из 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. 

Но он отказывается компилировать. Есть ли способ исправить это кратко?

+0

Вы смешиваясь частично оценены функции (что-то вроде 'F (1, _)') и частичные функции. 'sum' - это полная функция, а не частичная, это означает, что для каждого элемента домена функции есть один связанный элемент в его codomain. – pedrofurla

+0

@pedrofurla частично прикладной функция, правый. Я не могу их сочинить, не так ли? – user3663882

+1

Вторая строка просто не имеет смысла. Не уверен, что даже стоит попытаться объяснить, почему. – pedrofurla

ответ

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)).

+0

Thats, но почему '' printFoo не составляет сумму (1, _: Int, 3) 'work? – user3663882

+2

@ user3663882 Попробуйте явные круглые скобки вокруг 'sum' – Bergi

3

Есть несколько проблем с тем, что вы пытались сделать. Прежде всего, println является перегруженным методом, поэтому, когда вы пытаетесь ETA-расширить его функцию, как этот println _, Scala принимает самую короткую форму, которая является один с 0 аргументами:

scala> println _ 
res0:() => Unit = $$Lambda$1048/[email protected] 

Так вы должны быть более конкретными:

scala> println(_: Int) 
res1: Int => Unit = $$Lambda$1064/[email protected] 

Теперь, когда мы имеем правильную функцию есть еще одна вещь, которую нужно сделать: добавить 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 
+0

Хорошее объяснение, спасибо много – user3663882

Смежные вопросы