2016-06-22 3 views
1

В настоящее время я изучаю функции более высокого порядка и пытаюсь их реализовать.Передача функций как параметров

def bigger(n: Integer, m: Integer):Integer={ 
    if(n>m) return n 
    else return m 
} 

def bigT(t: Tuple3[Int, Int,(Int,Int)=>Int]): Integer={ 
    return t._3(t._1,t._2) 
} 

val tup=(5,2,bigger) 

Вторая функция получает кортеж, содержащий два целых числа и функцию, которая будет выполнена с ними.

Когда я пытаюсь запустить этот код (с помощью ideone.com) появляется следующее сообщение об ошибке:

«недостающие аргументы для метода большего в объекте Main; следовать этот метод с` _», если вы хотите, чтобы относиться к нему как частично прикладная функция валь тупы = (5,2, большая)»

Я хочу передать кортеж по имени тупа к функции bigT после

+1

было бы более разумным, чтобы определить 'bigT' с 3-мя параметрами вместо этого? –

ответ

0

Вы путаете Integer и Int.

Попробуйте использовать Int везде:

def bigger(n: Int, m: Int) = if(n > m) n else m 
def bigT(t: (Int, Int, (Int, Int) => Int)): Int = t._3(t._1, t._2) 

val res = bigT((5, 2, bigger)) // 5 
+0

спасибо! просто еще один вопрос, поскольку я новичок в scala: правильно ли было объявление параметра? Могу ли я написать 't: Tuple3 [Int, Int, (Int, Int) => Int]' или это неправильно (я, вероятно, буду опускать типы везде, где только могу, чтобы избежать ошибок в любом случае, но я думаю, что это хорошо, если я знаю) – user6454491

+0

Это правильно и эквивалентно, но вы обычно никогда явно не пишете '' TupleX'' и всегда используете '' (a, b, ...) '' нотацию, которая лучше –

+0

В этом примере я бы предложите 'def bigT (a: Int, b: Int, cmp: (Int, Int) => Int): Int = cmp (a, b)'. Мое мнение состоит в том, что в этом случае методы позиции '._1',' ._2' являются шумными и ухудшают читаемость. –

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