Существует ли типичное название функции, любят 'карту', которая воздействует на список списков аргументов вместо нескольких списков аргументов?

(Я наконец отправил и принял ответ на эффект "нет, нет, и вопрос не является на самом деле настолько общим".)

Рассмотрите функцию языка Common LISP 'mapcar'. Это берет функцию и некоторые списки как аргументы, и вызывает функцию с аргументами, которые вытягивают от того же положения в каждом списке.

Стандартные библиотеки обычно имеют подобную функцию, которая берет единственный список, где каждый элемент списка является списком аргументов в пользу функции? Что такое функция как этот, обычно звонил или "стандарт" или нет? (Это не предназначено, чтобы быть вопросом о Lisp, но это - единственный функциональный language+library, который я на полпути знаю.)

Я предполагаю, что спрашиваю если операция как (в псевдо-Lisp):

(mapcar (curry #'apply function-to-map) list-of-arg-lists)

уже имеет название, которое общо через несколько языков или библиотек (таким же образом, что 'карта' и 'уменьшает', названия общих операций, не только определенные библиотечные функции).

Спасибо.

7
задан jtolle 5 February 2010 в 21:09
поделиться

3 ответа

Наш семантические конструкции Clone - это инструмент, который обнаруживает блоки кода копирования-вставки-редактирования, для многих языков: C, C ++, Java, C ++, Cobol, Ecmascript, PHP, VB6, VB.NET, ...

Он делает использование точных парсеров языка для создания абстрактных синтаксических деревьев, соответствующих точным программным структурам, которые затем сравниваются на сходство. Это означает, что он никоим образом не путают пробелы, формируют, комментарии или даже разные «орфографии» литералов (например, 3,14159, такие же, как .00314150E3).

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

-121--3653723-

Там не совсем типичное название «функционального программирования» для этой конкретной операции. Фактически, то, как я сформулировал вопрос, предполагает язык, который работает как Lisp, где функции применяются к спискам аргументов. Это также предполагает, что «отображение» в первом месте означает, что делает что-то вроде «MapCar» Lisp.

Не каждый язык работает таким образом. Например, функции Haskell принимают только один напечатанный аргумент (см. Другие ответы и комментарии, а http://www.haskell.org/tutorial/index.html ). Отображение функции, которая принимает тип кортежа в списке этого типа, концептуально аналогична операции, о которой я спрашивал, и в этом случае соответствующая функция ... «карта».

Что касается LISP, это просто так, как работает версия «MapCar», работающая на аргументах - она ​​включает в себя списки, которые требуется в качестве входных данных и применяет функцию для отображения в результате списков аргумента. Вместо этого некоторая другая функция может так же легко принимать списки аргументов на молнии и все еще называться некоторыми вариантами «карты».

Моя благодарность всем, кто внес вклад в то, что было, для меня, довольно образовательный.

1
ответ дан 7 December 2019 в 12:20
поделиться

Я назначаю Apply Apply или, возможно, Mapply Если вы хотите просто использовать его самостоятельно или в небольшой группе.

(defun map-apply (fn arg-lists)
    (mapcar (lambda (arg-list) (apply fn arg-list))
            arg-lists))

(map-apply #'+ '((1 2) (3 4 5)))
  =>
(3 12)

Редактировать Конечно, ваш не просто псевдо-лайск, если у вас есть Curry :

(defun curry (f &rest values)
    (lambda (&rest more-values)
        (apply f (append values more-values))))
3
ответ дан 7 December 2019 в 12:20
поделиться

Рассмотрим общую функцию Lisp «MapCar». Он принимает функцию и несколько списков в качестве аргументов, и вызывает функцию с аргументами, вытянутыми из той же позиции в каждом списке.

Уверенные библиотеки обычно имеют аналогичную функцию, которая принимает один список, где каждый элемент списка представляет собой список аргументов для функции?

Ну, Haskell определяет серию Zipwithn - Функции, которые имеют подобные эффекты на Mapcar для постоянного договора аргумента.

zipWith (\a b -> a + b) [1, 2, 3] [1, 2, 3]                   => [2, 4, 6]
zipWith3 (\a b c -> a + b + c) [1, 2, 3] [1, 2, 3] [4, 5, 6]  => [6, 9, 12]

Обобщая эту концепцию для списка списков приведет к этой (наивно реализованной) функции Zipwithmany

zipWithMany :: ([a] -> b) -> [[a]] -> [b]
zipWithMany f lists 
    | any null lists = []
    | otherwise      = (f $ map head lists) : zipWithMany f (map tail lists)

Пример:

zipWithMany sum [[1, 2, 3], [1, 2, 3], [1, 2]] => [3, 6]
1
ответ дан 7 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: