【问题标题】:simple higher order functions in scheme方案中的简单高阶函数
【发布时间】:2012-10-13 18:53:58
【问题描述】:

我正在尝试了解如何在方案中将函数作为参数传递,但我在理解教程时遇到了很多麻烦。 这是我正在尝试做的事情:

(define (addone n)
(+ n 1))
(define (for-n start stop fn)
(if (< start stop)
    (list)
    (cons (fn start) (for-n (+ start 1) stop fn))))

基本上我只想要一个函数,它返回 fn 的值,用于列表中的 start、start+1、... start+stop。

因此 (for-n 1 5 (addone 0)) 的预期输出将是 (1 2 3 4 5)。 我认为我在这里真的错过了一些非常基本的概念,因为我似乎甚至没有正确调用解释器中的函数,而且我没有掌握如何告诉方案将 fn 解释为一个函数而不仅仅是一个常规参数.

我想通了(尽管通过反复试验),我不确定我做了什么,但至少它有效!

 (define (function x)
    x)
(define (for-n start stop fn)
  (if (> start stop)
    (list)
    (cons (fn start) (for-n (+ start 1) stop fn)))))

【问题讨论】:

  • 您是否有问题只是提出问题而没有讨论......受访者花费了宝贵的时间来回答您的问题并让他们这样,没有讨论或不接受...... . 有道理吗?

标签: function scheme


【解决方案1】:

函数调用(addone 0) 等于值1。如果你想传递函数addone 本身(而不是1),根本不要将它用括号括起来。 (for-n 1 5 addone) 将 addone 函数传递给 for-n。如果你用括号括起来,Scheme 将调用addone 并传递结果。

【讨论】:

    【解决方案2】:

    一些反馈,让您知道您的第一个版本有什么问题:

    • 构建列表的递归的基本情况通常返回'() 而不是(list)
    • 正如您已经发现的那样,基本情况的条件是错误的:递归在 (&gt; start stop) 时结束,而不是在 (&lt; start stop) 时结束
    • 没有必要定义addone 过程,至少在某些Scheme 解释器中已经存在一个称为add1 的过程
    • 最后,当调用接收另一个过程的过程时,只需传递函数,无需先应用它 - 这将返回一个 值 而不是预期的函数。我的意思是这是错误的:(for-n 1 5 (addone 0)),这是正确的:(for-n 1 5 addone)。当您编写(addone 0) 时,该函数被应用并返回值1,而您打算传递的是addone,即过程本身。

    有了以上所有建议,正确的程序应该是这样的:

    (define (for-n start stop fn)
      (if (> start stop)
          '()
          (cons (fn start) (for-n (add1 start) stop fn))))
    

    这样称呼它:

    (for-n 1 5 add1)
    > '(2 3 4 5 6)
    

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多