схема, список функций в качестве параметра - PullRequest
1 голос
/ 13 апреля 2011

Я пытаюсь решить эту проблему.Мне было интересно, если кто-то поможет начать работу или даст мне несколько советов.

функция с именем 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 ]

2 голосов
/ 13 апреля 2011

Капитан Педантик говорит: вы взглянули на «Как разрабатывать программы» (http://www.htdp.org)?

) Вам нужно начать с написания примеров - более простых, чем у вас. Также напишитеприведите к форме, в которой он действительно оценивается правильно (например, в вашем примере, если вы оцениваете (2 16 64), вы получите ошибку.

Далее, если у вас нет опытаРазрабатывая функции над списками, вы действительно должны читать первые десять разделов HtDP, это гораздо лучше, чем ответ с переполнением стека.

Надеюсь, это поможет!

1 голос
/ 13 апреля 2011

В ответ на вашу попытку я предоставлю вам несколько советов, которые помогут вам. : -)

  • Вам не нужно использовать apply в вашем случае. apply делает не то, что вы думаете, несмотря на то, что ваше назначение хочет, чтобы вы сделали функцию с именем apply-all.
  • cons принимает два аргумента.
  • '(positive?) - это список, содержащий символ с именем positive?, а не функцию positive?. Ваше назначение использовало (list ...) по уважительной причине. Если вы хотите что-то более компактное, чем list, используйте кавычку: `(,positive?).
  • Вы должны рассмотреть возможность использования map, как предполагает комментарий Марцина.
  • Если вы не можете использовать map, помните, что когда вы используете шаблон «итерация с аккумулятором», ваши результаты получаются в обратном порядке. Вы должны либо изменить список ввода, либо результат.

Вот мое справочное решение, которое заняло у меня полминуты, чтобы написать. :-) Я надеюсь, что вы можете использовать его для точной настройки существующей версии. (Мне удобно размещать его, потому что я уверен, что ваши маркеры не позволят вам использовать cut, и если вы сможете решить, как сделать мою версию приемлемой для ваших маркеров, то вы уже выиграли.)

(define (apply-all fns . args)
  (map (cut apply <> args) fns))
0 голосов
/ 27 марта 2012

С учетом подписи:

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

Подумайте, что должно быть применено для всех:

  • когда список пуст: пустой список (функции не применяются)
  • когда список не пустой: используйте первую функцию для числа, объедините результат с естественной рекурсией так, чтобы это имело смысл для списков (список должен сжиматься в рекурсии).
...