这个问题可能有一个简单的答案,但我是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'
如果你需要任何澄清,请告诉我。
您可以使用显式递归:
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
的性能更好,但对于像这样的玩具程序,您不需要担心这一点。