Использование карты с функцией, которая имеет несколько аргументов - PullRequest
0 голосов
/ 28 июня 2018

Можно ли использовать карту с функцией с несколькими аргументами? Потому что я не могу это сделать.

Я хочу использовать второй аргумент карты несколько раз в качестве аргументов функции. Как

mapF x y z = map (f y z) [1, 2, 3]

Таким образом, он будет оценивать f с теми же y и z, но с x = 1, x = 2, x = 3 и т. Д.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

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

map helper [1, 2, 3] where
  helper x = f x y z

В Haskell есть два синтаксиса для функций, поэтому давайте используем лямбда-синтаксис для определения нашей вспомогательной функции:

map helper [1, 2, 3] where
  helper = \x -> f x y z

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

map (\x -> f x y z) [1, 2, 3]

Так что теперь вы можете сказать

mapF y z = map (\x -> f x y z) [1,2,3]

Но, вероятно, вы не хотите, чтобы x были 1, 2 и 3, вы хотите, чтобы это был список Вы передаете в качестве аргумента mapF. Так что вам нужно дать это другое имя:

mapF xs y z = map (\x -> f x y z) xs

По соглашению Haskell s используется в качестве суффикса для переменных, которые содержат списки или другие контейнеры. Таким образом, если одно значение равно x, то их список равен xs

0 голосов
/ 28 июня 2018

Гарантированно есть лучшие способы сделать это (все еще учатся), но вы можете:

f' = map f [1,2,3]

f' теперь список частично примененных f

g y z= map (\h -> h y z) f'

возьмет каждую из этих функций и запустит ее с аргументами y z.

Вы можете взломать все это в одной строке.

...