Вчера я начал с 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 для частичного применения функций, когда парциально применяемые параметры не крайние слева?