2016-11-10 6 views
0

SICPを使用してScalaを学習しようとしていますが、関数の型定義に苦労しており、SICPに固執しています。ここでは一般的な表現ではなく、多くの(固定小数点による検索やニュートン法)の平方根を見つけるために構築さ:関数を受け入れる関数のパラメータのタイプ

機能に基づいて
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) 

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) 

平方機能

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

私はScalaで次のように表現しようとしました:形で一般化することができる

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

transformは、Doubleを返し、Doubleを返します。 gは、Double => Doubleなので、gには適用できません。 g(x)x: Double)に適用できます。 fixed_point((x: Double) => transform(g(x)))(guess)

+0

私はそれを今、感謝していると思うので、私は 'transform:(Double => Double)=>(Double => Double)'を実行する必要があります。 – nzn

関連する問題