我正试图解决这个问题。我想知道是否有人会帮忙开始或者给我一些提示。
函数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
有人能帮我找到问题吗?
答案 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)
考虑应用什么 - 所有应该返回: