Попытка применить map к «внутренним» аргументам функций в Haskell - PullRequest
3 голосов
/ 02 декабря 2010

Давайте определим произвольную функцию

someFunc a b = ...

если мне это когда-нибудь понадобится, я знаю, что могу сделать что-то вроде

map (someFunc a) [b0, b1, b2, ..., bn]

и я получу в результате

[(someFunc a b0), (someFunc a b1), ..., (someFunc a bn)]

Здесь нет ничего нового. Но что если вместо использования второго аргумента карты для изменения b, я хотел бы изменить a («внутренний» аргумент)?

map (someFunc ? b) [?0, ?1, ?2, ..., ?n]

Есть ли способ сделать это в Хаскеле? Если нет, что бы обойти это?

Я знаю, что я, вероятно, не очень понимал, о чем я пишу. При необходимости я могу попытаться переформулировать свой вопрос: (

Ответы [ 2 ]

11 голосов
/ 02 декабря 2010

Вы можете использовать лямбду

map (\a -> someFunc a b) ...

или функция более высокого порядка flip, которая возвращает данную функцию с аргументами, перевернутыми вокруг:

map (flip someFunc b) ...
4 голосов
/ 02 декабря 2010

Вы можете использовать

flip :: (a -> b -> c) -> b -> a -> c

Так вы бы сказали

map (flip someFunc b) [a1...]

Для более сложных случаев с большим количеством аргументов вам придется использовать лямбду. Теоретически Вы всегда можете сделать это с правильной комбинацией сальто и аргументов, но лямбда-версия, вероятно, будет более читабельной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...