Ваш вопрос не очень понятен: хотите ли вы все возможные комбинации (взять любые 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)]