Haskell: выполнение функции для каждого элемента в параметре списка функций - PullRequest
1 голос
/ 19 марта 2020

Возможно, есть простой ответ на этот вопрос, но я новичок в Haskell. Я пытаюсь перебрать параметр функции и использовать каждый элемент списка для вызова другой функции. У меня есть функция, которая выполняет ход с учетом игрового поля, хода и номера игрока и возвращает новое игровое поле. Его заголовок функции выглядит следующим образом:

play :: [[Char]] -> Char -> Char -> [[Char]]
play gameBoard moveDirection playerSymbol = ...

Я пытаюсь вызвать его из функции драйвера, которая имеет параметры начальной игровой доски и список ходов, которые необходимо выполнить на игровой доске. Есть ли способ вызвать функцию play для каждого элемента в списке ходов, чтобы нижеприведенная функция gameExample возвращала игровое поле после каждого хода?

moveDirections = "udlrudlr"
gameExample :: [[Char]] -> [Char] -> [[Char]]
gameExample gameBoard (moveDirection : moveDirections) = 
    play gameBoard moveDirection 'p'

Пожалуйста, дайте мне знать если вам нужны какие-либо разъяснения.

1 Ответ

2 голосов
/ 19 марта 2020

Вы можете сделать это с явной рекурсией:

gameExample gameBoard [] = gameBoard
gameExample gameBoard (moveDirection : moveDirections) =
    gameExample (play gameBoard moveDirection 'p') moveDirections

Или вы можете использовать функцию foldl, чтобы сделать это для вас:

gameExample = foldl (\gameBoard moveDirection -> play gameBoard moveDirection 'p')

Там также Data.Foldable.foldl', что обычно лучше для производительности, чем foldl, но вам не нужно беспокоиться об этом для игрушечной программы, подобной этой.

...