Рассмотрим функцию Common 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]