2014-08-16 2 views
1

Наблюдая за SICP курс https://www.youtube.com/watch?v=erHp3r6PbJk&index=3&list=PLB63C06FAF154F047 Я преобразовал некоторые из LISP кода Scala:Как вызвать функцию, которая принимает параметры функции?

def sumInt(a: Int, b: Int): Int = {  //> sumInt: (a: Int, b: Int)Int 
    if(a > b) 0 
    else a + sumInt(1 + a, b) 
}            

sumInt(3, 5)       //> res0: Int = 12 

def sumSquares(a: Int, b: Int): Int = { //> sumSquares: (a: Int, b: Int)Int 
    if(a > b) 0 
    else (a * a) + sumSquares(1 + a, b) 
}            

sumSquares(2, 3)      //> res1: Int = 13 

Чтобы сделать более общую функцию, которая принимает функции в качестве параметров для вычисления квадратов вместо кодирования их в пределах функции I» ve добавлено:

def sum(term: Int => Int, a: Int, next: Int => Int, b: Int): Int = { 
    if(a > b) 0 
    else { 
    val toAdd1 = term(a) 
    val toAdd2 = toAdd1 + sum(term, next(a), next, b) 
    toAdd1 + toAdd2 
    } 
} 

Но я не уверен, как вызвать эту функцию? Может ли это быть более общим, так что параметры a & b не обязательно должны быть типа Int?

+1

Я полагаю, что строка 'val toAdd2 = toAdd1 + ...' должна быть 'val toAdd2 = ...'. – marc

ответ

2

Заклятие так просто, как делают:

println(sum({x=>x},1,{x=>x+1},4)) 

Для более общий почему писать эту функцию, вы можете использовать Scala Числовой:

def sumG[A](term: A => A, a: A, next: A => A, b: A)(implicit n: Numeric[A]): A = { 
    if(n.compare(a,b)>0) 
     n.zero 
    else 
    n.plus(term(a),sumG(term, next(a), next, b)) 
} 

это называют это так:

println(sumG[Int]({x=>x},1,{x=>x+1},4)) 
Смежные вопросы