2013-07-17 6 views
7

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

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

В этом списке будет один элемент меньше.

Функция отображения должна принимать по два аргумента за раз.

EDIT

Пример

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

если у меня есть список: [3 8 11 14 19 20 88].

Можно мне два написать функцию, которая отображает мою average функции, которая для (average 3 8) даст 5.5

для (average 8 11) дадут 9.5

и (average 11 14) дадут 12.5

и так далее. ..

при применении среднего значения к двум последовательным значениям списка при at ime должен дать мне.

[5.5 9.5 12.5 16.5 19.5 54.0] 

как результат.

map применяет единственную функцию аргумента к целому списку и создает новый список с таким же количеством элементов.

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

+0

Вы можете добавить простой пример? –

+0

Вы имеете в виду сокращение (http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/reduce)? –

ответ

11

Вы можете сделать это с картой:

(map f coll (rest coll)) 
+0

Это работает! Почему карта принимает более двух аргументов? Как работает отображение в этом случае? поэтому он выбирает один аргумент из каждого списка? пока один из них не закончится? –

+0

'поэтому он выбирает один аргумент из каждого списка? пока один из них не закончится? '- Да, точно. Переданный fn должен принимать столько аргументов, сколько секунд передается 'map'. – Alex

+0

@AmoghTalpallikar вы можете узнать больше о 'map' и других функциях в [Clojure docs] (http: // clojuredocs.орг/clojure_core/clojure.core/карта). –

7
(fn [f coll] (map #(apply f %1) (partition 2 1 coll)) 

Идите прямо к 4clojure прямо сейчас!

+5

Отлично! btw '# (применить f% 1)' можно изменить на '(partial apply f)' – mishadoff

+0

4clojure! Вау! это, кажется, отличное место. –

+0

Или просто '# (уменьшить f%)' – film42

Смежные вопросы