方案,功能列表作为参数

问题描述

| 我正在尝试解决这个问题。我想知道是否有人会帮助上手或给我一些提示。 称为“ 0”的函数,当给定一个函数列表和一个数字时,将在应用于该数字时产生一个函数值列表。 例如,
(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
谁能帮我找到问题吗?     

解决方法

Pedantic上尉说:您是否看过“如何设计程序”(http://www.htdp.org)? 您需要首先编写示例-比您拥有的示例简单一些。另外,将结果以可以正确评估的形式编写。 (例如,在您的示例中,如果您求值(2 16 64),则会得到一个错误。 接下来,如果您没有在列表上开发功能的经验,那么您真的应该阅读HtDP的前十部分。它比Stack Overflow的答案要好得多。 希望这可以帮助!     ,为响应您的尝试,我将为您提供一些提示以帮助您度过难关。 :-) 在这种情况下,您无需使用ѭ5。尽管您的作业希望您创建一个名为
apply-all
的函数,但
apply
并不会像您想的那样工作。
cons
有两个论点。
\'(positive?)
是一个包含名为
positive?
的符号的列表,而不是
positive?
函数。您的作业有充分的理由使用了
(list ...)
。如果您想要比
list
更紧凑的东西,请使用半引号:
`(,positive?)
。 您应该考虑使用
map
,就像Marcin的注释所建议的那样。 如果您不能使用
map
,请记住,当您使用“用累加器累加”模式时,结果反转。您必须反转输入列表或结果。 这是我的参考解决方案,花了我半分钟的时间写。 :-)我希望您可以使用它来微调您的现有版本。 (我很乐意发布它,因为我敢肯定您的标记不会让您使用
cut
,并且如果您能确定如何使我的版本可以被标记接受,那么您已经赢了。 )
(define (apply-all fns . args)
  (map (cut apply <> args) fns))
    ,给定签名:
; apply-all : (listof (number -> number)),number -> (listof number)
考虑一下应用所有应返回的内容: 当列表为空时:一个空列表(没有适用的功能) 当列表不为空时:使用数字上的第一个函数,以对列表有意义的方式将结果与自然递归组合(列表应在递归中收缩)。