Назначьте функцию на список для каждого аргумента - PullRequest
0 голосов
/ 26 февраля 2011

Я ищу привлекательный синтаксис для Haskell для следующего

У меня есть функция, которая принимает 4 аргумента.

f a b c d = Что-то

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

По сути, вложенная функция карты.

Я упал, как будто должно быть элегантное решение. Но я не нашел ничего, что скомпилирует.

Ответы [ 2 ]

6 голосов
/ 26 февраля 2011

Ваш вопрос не очень понятен: хотите ли вы все возможные комбинации (взять любые a из первого списка, любые b из второго и т. Д.) Или обрабатывать списки параллельно aka zip (первый элемент каждогосписок, второй элемент и т. д.).

Оба могут быть хорошо решены с помощью аппликативных функторов:

Prelude> let f a b c d = (a,b,c,d)
Prelude Control.Applicative> :m +Control.Applicative 
Prelude Control.Applicative> f <$> [1,2] <*> [3,4] <*> [5,6] <*> [7,8]
[(1,3,5,7),(1,3,5,8),(1,3,6,7),(1,3,6,8),(1,4,5,7),(1,4,5,8),(1,4,6,7),(1,4,6,8),(2,3,5,7),(2,3,5,8),(2,3,6,7),(2,3,6,8),(2,4,5,7),(2,4,5,8),(2,4,6,7),(2,4,6,8)]
Prelude Control.Applicative> getZipList $ f <$> ZipList [1,2] <*> ZipList [3,4] <*> ZipList [5,6] <*> ZipList [7,8]
[(1,3,5,7),(2,4,6,8)]
0 голосов
/ 04 марта 2011

Я думаю, что я получаю то, что вы ищете:

4-й путь как bs cs ds = map (curry4 f) [(r, s, t, u) |r <- as, s <- bs, t <- cs, u <- ds] <br>, где curry4 f (a, b, c, d) = fabcd

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

...