scheme,作为参数的函数列表

时间:2011-04-13 07:17:38

标签: functional-programming scheme tail-recursion

我正试图解决这个问题。我想知道是否有人会帮忙开始或者给我一些提示。

函数apply-all,当给定函数列表和数字时,将在应用于数字时生成函数值的列表。

例如, (apply-all (list sqrt square cube) 4) => (2 16 64)

由于

行。这就是我到目前为止所做的,

(define (apply-all lst num)
  (apply-allaux lst num '()))

;; aux function
(define (apply-allaux lst num acc)
  (if (null? lst)
      acc
      (apply-allaux (cdr lst) num (cons (apply (car lst) num))))) 

但是当我运行这个

(apply-all '(positive?) 2)

它给了我这个错误

mcar: expects argument of type <mutable-pair>; given 2

有人能帮我找到问题吗?

3 个答案:

答案 0 :(得分:2)

Pedantic上尉说:你看过如何设计程序(http://www.htdp.org)吗?

您需要先写下示例 - 比您拥有的示例更简单。另外,将结果写入实际正确评估的形式。 (例如,在您的示例中,如果您评估(2 16 64),您将收到错误。

接下来,如果您没有在列表上开发函数的经验,那么您真的应该阅读HtDP的前十个部分;它比Stack Overflow的答案要好得多。

希望这有帮助!

答案 1 :(得分:1)

为了回应您的尝试,我会向您提供一些提示,以帮助您完成。 : - )

  • 在您的情况下,您不需要使用apply。尽管您的作业要求您创建名为apply的函数,但apply-all并没有按照您的想法执行。
  • cons有两个参数。
  • '(positive?)是一个包含名为positive?符号的列表,而不是positive?函数。您的作业使用(list ...)是有充分理由的。如果您想要比list更紧凑的内容,请使用quasiquotation:`(,positive?)
  • 您应该考虑使用map,就像Marcin的评论所暗示的那样。
  • 如果您无法使用map,请记住,当您使用“使用累加器迭代”模式时,结果会反过来。您必须反转输入列表或结果。

这是我的参考解决方案,花了我半分钟写。 :-)我希望你能用它来微调你现有的版本。 (我很乐意发布它,因为我确定你的标记不会让你使用cut,如果你能弄清楚如何使我的版本可以接受你的标记,那么你已经赢了。 )

(define (apply-all fns . args)
  (map (cut apply <> args) fns))

答案 2 :(得分:0)

鉴于签名:

; apply-all : (listof (number -> number)), number -> (listof number)

考虑应用什么 - 所有应该返回:

  • 当列表为空时:空列表(没有要应用的功能)
  • 当列表不为空时:使用数字上的第一个函数,以对列表有意义的方式将结果与自然递归相结合(列表应该在递归中缩小)。