Частичное приложение слева направо

Я начал с haskell вчера и все еще полностью потерялся на берегу этого дивного нового мира. Теперь я столкнулся со следующей проблемой:

Предположим, у меня есть какая-то функция, которая волшебным образом воздействует на целое число и другую переменную:

makeTuple :: Int -> a -> (Int, a)
makeTuple n x = (n, x)

Теперь я хочу применить эту функцию ко всем элементам списка. Пока нет проблем, поскольку отображение - это ваш хлеб насущный в питоне (откуда я).

makeTupleList :: Int -> [a] -> [ (Int, a) ]
makeTupleList n x = map (makeTuple n) x

Насколько я понимаю, двоичная функция makeTuple применяется частично с целым числом n и, следовательно, становится унарной функцией который может быть отображен на каждый элемент x. Пока все хорошо.

Но что мне делать, если функция makeTuple имеет другую сигнатуру, например:

makeTuple2 :: a -> Int -> (Int, a)
makeTuple2 x n = (n, x)

Многие пути ведут в Рим: эффект тот же, но другой путь. Теперь очевидно, что отображение больше не работает: функция ожидает Int и получает a.

makeTupleList2 :: Int -> [a] -> [ (Int, a) ]
makeTupleList2 n x = map (makeTuple2 n) x -- boolshit

Этого следовало ожидать. Мое - возможно, слишком питоническое - обходное решение использует другую функцию для передачи параметров, куда они должны идти:

makeTupleList2 :: Int -> [a] -> [ (Int, a) ]
makeTupleList2 n x = map (\x -> makeTuple2 x n) x

Вопрос: Каков предпочтительный функциональный способ частичного применения функций в стиле haskell, когда частично применяемые параметры не крайние левые?

13
задан duplode 5 November 2016 в 22:14
поделиться