【问题标题】:Types of parameters in functions that accept functions接受函数的函数中的参数类型
【发布时间】:2016-11-10 14:49:30
【问题描述】:

我正在尝试使用 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 =&gt; 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)

【问题讨论】:

    标签: scala types


    【解决方案1】:

    transform 接受 Double 并返回 Double。您不能将其应用于g,因为g 是一个函数Double =&gt; Double。您可以将其应用于g(x),其中x: Double。我想这就是你想要的:fixed_point((x: Double) =&gt; transform(g(x)))(guess)

    【讨论】:

    • 我想我现在明白了,谢谢,所以我应该改用transform: (Double =&gt; Double) =&gt; (Double =&gt; Double)
    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2015-03-21
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多