2014-12-19 4 views
1

Вот моя функция:Как выполнить пользовательскую функцию, которая принимает и возвращает другую?

def partial1[A, B, C](a: A, f: (A, B) => C): B => C = (b: B) => f(a, b)      
> partial1: [A, B, C](a: A, f: (A, B) => C)B => C 

Здесь я вызвать функцию partial1:

def fun(a: Int, b: Int) = a + b 
> fun: (a: Int, b: Int)Int 

val r = partial1(1, fun)      
> r : Int => Int = <function1> 

r(fun(1,3))          
> res0: Int = 5 

Так r есть функция, которая принимает функцию в качестве параметра и возвращает Function1 (функцию с 1 параметром). Должно ли Int => Int не быть Int, Int, так как два параметра Int s являются параметрами функции?

Почему я не могу реализовать Partial1 как partial1(1,(fun(1,3))), что вызывает ошибку компилятора: type mismatch; found : Int required: (?, ?) => ??

+0

В каком положении возникает несоответствие типа? –

+0

(Scala-компилятор обычно печатает проблемную строку кода и указывает на конкретное место в этой строке.) –

+0

@ Ошибка Borsch-ошибки возникает в строке «partial1 (1, fun (2,3))» –

ответ

6

Прежде всего, partial1 не является частичной функцией. Это функция, которая возвращает другую функцию, так что это функция более высокого порядка.

Ошибка компиляции вы получаете, потому что partial1 ожидает функцию (A, B) => C, но вы передаете fun(1,3), который оценивает к Int. И Int - это не то же самое, что и у (Int, Int) => Int.

0
class ex03 { 
    def partial1[A,B,C](a:A, f:(A,B) => C): B => C = f(a,_) 
} 

class ex03Test extends UnitSpec { 

    behavior of "partial1" 
    it should "return 6" in { 
    val e = new ex03 
    val multiplyByTwo = e.partial1(2, (a:Int, b:Int) => a * b) 
    multiplyByTwo(3) mustBe 6 
    }} 
+0

Добро пожаловать в переполнение стека. Кодовые ответы не считаются полезными, как код с пояснительным текстом. Если вопрос старый и уже имеет принятый ответ, он помогает понять, что ваш ответ добавляет к проблеме. В этом случае вы, кажется, пропустили точку вопроса. OP знает, как вызывать 'partial1' способом, подобным вашему примеру, но спрашивал о другой форме обращения, которая не работает. – jwvh

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