Я хотел бы иметь функциюПодъемное функция `→ б → c` в` [а] → [б] → [[с]] `
foo :: (a → b → c) → [a] → [b] → [[c]]
, которая принимает функцию f :: a → b → c
и два списка xs
и ys
и возвращает сетку (то есть список списков), содержащий значения f
, применяемые к каждой комбинации значений от xs
и ys
.
Пример: foo [1..3] [4..6]
должен возвращать
[[f 1 4,f 1 5,f 1 6],
[f 2 4,f 2 5,f 2 6],
[f 3 4,f 3 5,f 3 6]]
Мой текущий подход
foo = traverse . flip . traverse . flip
Это работает, но мне интересно, если есть какой-то другой подход или предопределенный комбинатор, с которой это может быть (или, возможно, даже композиционно, чтобы его можно было легко расширить до трех или n-арных функций)
Например: если бы я не был t сетка результатов, но только список результатов, я мог бы написать f <$> xs <*> ys
, что кратким образом, использует заранее определенные комбинаторы и обобщает на n-арные функции очевидным образом. Есть ли аналогичный лаконичный способ написания моего комбинатора?
luv it, perfect: D – Netwave
Это работает, конечно , но это довольно немного подробней, чем то, что я имел в виду. Как я уже сказал, я надеялся на что-то простое в форме, подобной 'f <$> xs <*> ys'. Кроме того, это решение не обобщает на произвольные пересечения, не так ли? –
ИМО - идеальная читаемость ** огромный плюс ** для обобщения/точечного в этом случае – Carsten