Вопрос

Это домашнее задание, поэтому мне не нужен ответ.Мне нужен только толчок в правильном направлении.Мне нужно сопоставить несколько функций в список.Например:

(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)

Я могу сопоставить первую функцию с элементами списка, однако после этого я очень теряюсь.Также, поскольку это вводное, я ограничиваюсь вводными функциями(const, append, car, cdr, member, и т. д.)

(define (map-multi f l)  
    (cond  
        ((null? l)  
            l)  
        (else (cons ((car f) (car l))  
            (map-multi f (cdr l))))))  
Это было полезно?

Решение

Вам нужно сочинять функции, которые вы получаете в f параметр.Для простоты предположим, что в списке всего две функции — тогда вам нужно применить первую функцию к текущему элементу в списке чисел, а затем применить вторую функцию к результату.Если вы можете использовать compose продолжайте процедуру и измените эту строку в своем коде:

((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?

...с этим:

((compose (cadr f) (car f)) (car l))       ; now we're applying both functions

Если вы не можете использовать compose, затем замените ту же строку на эту:

((cadr f) ((car f) (car l)))               ; now we're applying both functions

Теперь, если проблема более общая и вам необходимо сопоставить список функций с помощью более двух элементы, затем еще раз замените ту же строку в своем коде на следующую:

((compose-multi f) (car l))

И реализовать вспомогательную функцию, которая компонует и возвращает все функции в списке путем последовательных вызовов compose.Это оставлено для вас в качестве упражнения, поскольку это домашнее задание, но если вы понимаете, как приведенный выше код работает всего для двух функций, вам будет достаточно легко расширить результат на список из нескольких функций:

(define (compose-multi flist)      ; procedure for composing a list of functions
  (if (null? flist)                ; if the list is empty then
      <???>                        ; return the identity function
      (<???> (compose-multi <???>) ; else compose the result of recursive call
             <???>)))              ; with the current element in the list

Обратите внимание, что функция идентификации необходима для обработки случая, когда в списке функций нет элементов;его очень просто определить, он просто возвращает то же значение, которое было передано в качестве параметра.

Также имейте в виду, что compose-multi возвращает функция, результат составления всех функций в списке - compose делает это за вас, но если вам не разрешено его использовать, просто помните, что это:

(compose x y)

...эквивалентно этому:

(lambda (n) (x (y n)))

Другие советы

Может быть легче написать это как две функции.Один из них принимает список функций и один вход, и применяет все функции в списке последовательно.Выход из одной функции приложения будет входным для следующего;Как только у вас закончится функции, вы закончили.

Другая функция просто будет отображать эту функцию Helper в списке входов.

Вот альтернативный способ определить генеракодицетагкод, вместо композиции использует операцию, называемую multi-map.Поскольку вам разрешено использовать только вводные функции, это на самом деле не является ответом на ваше задание.Но это будет, если вы пишете свое собственное определение fold (оно не очень длинное!)

(define (multi-map operations input)
  (fold map input operations))

> (multi-map (list 1+ square)
             '(4 10 8))
$2 = (25 121 81)

> (multi-map (list 1+ square 1+) 
             '(4 10 8))
$3 = (26 122 82)
.

Чтобы согреться, начните с более простой задачи.Затем обобщите решение.

Как бы вы написали эту функцию?

(define (map-single fs x)
  ...)

> (map-single (list double add1) 3)
7

Для этого нужен список, fs, значений функции в качестве аргумента и числа, x, и вычислил ценность применения (композиции) функций в fs к x?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top