2016-11-10 6 views
0

SICP를 사용하여 스칼라를 배우려고하지만 함수의 유형 정의에 어려움을 겪고 있고 SICP에 걸렸습니다.함수를 받아들이는 함수의 매개 변수 유형

def square(x: Double) = x * x   
def average(x: Double, y: Double) = (x + y)/2            
def abs(x: Double) = if (x < 0) -x else x 

val tolerance = 0.00001     
def fixed_point(f: Double => Double)(first_guess: Double) = { 
    def close_enough(v1: Double, v2: Double): Boolean = abs(v1 - v2) < tolerance 
    def attempt(guess: Double): Double = { 
    val next = f(guess) 
    if (close_enough(guess, next)) next else attempt(next) 
    } 
    attempt(first_guess) 
} 

def average_damp(f: Double => Double): Double => Double = 
    x => average(x, f(x)) 

val dx = 0.00001         
def deriv(g: Double => Double): Double => Double = 
    x => (g(x + dx) - g(x))/dx 

def newton_transform(g: Double => Double): Double => Double = 
    x => x - g(x)/deriv(g)(x)    

def newton_method(g: Double => Double)(guess: Double): Double = 
    fixed_point(newton_transform(g))(guess) 

사각 기능 : 기능을 바탕으로

def sqrt_damp(x: Double) = 
    fixed_point(average_damp(y => x/y))(1) 

def sqrt_newton(x: Double) = 
    fixed_point(newton_method(y => square(y) - x))(1) 

: 여기에 일반화 된 표현은 어디 대신 (고정 소수점 검색이나 뉴턴의 방법을 통해) 숫자의 제곱근을 찾기 위해 구축이다

(define (fixed-point-of-transform g transform guess) 
    (fixed-point (transform g) guess)) 

내가 스칼라에서 다음과 같이 표현하는 시도 : 형태로 일반화 될 수

def fixed_point_of_transform(g: Double => Double, transform: Double => Double)(guess: Double): Double = 
    fixed_point(transform(g))(guess) 

그러나 위의 컴파일 오류

에게 type mismatch; found : Double => Double required: Double

편집, 다음 작품 생성하지 않습니다

def fixed_point_of_transform(g: Double => Double, transform: (Double => Double) => (Double => Double))(guess: Double): Double = 
    fixed_point(transform(g))(guess) 

이제 이전 기능으로 정의 할 수 있습니다 :

def sqrt_damp(x: Double) = 
    fixed_point_of_transform(y => x/y, average_damp)(1) 

def sqrt_newton(x: Double) = 
    fixed_point_of_transform(y => square(y) - x, newton_method)(1) 

답변

1

transformDouble이고 Double을 반환합니다. gDouble => Double이기 때문에 g에는 적용 할 수 없습니다. g(x) (x: Double)에 적용 할 수 있습니다. 나는 이것이 당신이 원하는 것이라고 생각한다 : fixed_point((x: Double) => transform(g(x)))(guess)

+0

나는 이제 그것을 얻었다 고 생각한다. 그래서 나는 transform : (Double => Double) => (Double => Double)'을해야한다. – nzn

관련 문제