Сопоставьте список функций со списком

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

(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))))))  

person user1405177    schedule 19.05.2012    source источник
comment
Похоже, вы хотите применить композицию функций в своем списке (должен ли ваш пример иметь square, а не double, чтобы получить показанный результат?). Вы можете найти ответы на этот вопрос полезными: > stackoverflow.com/questions/9919732/ .   -  person    schedule 19.05.2012
comment
Извините, да, он должен быть квадратным.   -  person user1405177    schedule 19.05.2012
comment
Сколько функций можно передать в списке функций? всегда два? меньше двух? более, чем два?   -  person Óscar López    schedule 19.05.2012


Ответы (4)


Вам нужно компоновать функции, которые вы получаете в параметре 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)))
person Óscar López    schedule 19.05.2012
comment
Я бы предположил, что размер списка функций на самом деле не фиксирован и равен 2. Если бы это было так, зачем использовать список вместо двух аргументов? - person sepp2k; 19.05.2012
comment
@ sepp2k Что ж, давайте спросим у ОП. И зачем использовать список? потому что это то, что учитель ОП попросил за домашнее задание :). Если вы правы и в списке может быть больше двух функций, то проблема немного интереснее, но я сомневаюсь, что это то, что попросили сделать ОП - это похоже на раннее задание для какого-то курса программирования. - person Óscar López; 19.05.2012
comment
Конечно, так сказал им учитель, но это не отменяет моей точки зрения. Зачем учителю говорить им использовать список вместо двух аргументов, если всегда будет только два аргумента? У учителей обычно тоже есть причина для того, что они говорят делать людям. - person sepp2k; 19.05.2012
comment
second и first не являются стандартными функциями схемы. - person sepp2k; 19.05.2012
comment
Размер списка функций не фиксирован на уровне двух. Он может быть любого размера. Кроме того, да, это вводный курс. - person user1405177; 19.05.2012
comment
(определить первый автомобиль) (определить второй кадр) - person soegaard; 20.05.2012

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

Другая функция просто сопоставит эту вспомогательную функцию со списком входных данных.

person Community    schedule 19.05.2012
comment
Мне пришлось бы написать профессору по электронной почте, чтобы узнать, законно ли это или это должно быть реализовано как отдельная функция. Способ, который вы описали, был бы намного проще. - person user1405177; 19.05.2012
comment
Вспомогательная функция также может быть внутренней функцией с использованием define или letrec, если вы рассмотрели их в курсе. - person ; 19.05.2012

Вот альтернативный способ определения multi-map, который вместо композиции использует операцию fold. Поскольку вам разрешено использовать только вводные функции, это не совсем ответ на ваше задание. Но будет, если вы напишете свое определение 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)
person gcbenison    schedule 23.05.2012

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

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

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

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

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

person soegaard    schedule 19.05.2012