如何更改Haskell中[String]中的元素?

时间:2015-10-31 16:56:05

标签: haskell

我正在开发一个程序,接收如下输入的棋盘游戏:

#####
#_ ##
#  ##
#   #
#  .#
#####
1 4 (player initial position, marked with '_')

收到输入后,程序将其转换为[String]。

这种情况,它将是: [“#####”,“#_ ##”,“###”,“##”,“#。#”,“#####”,“1 4”]

如何访问位置[1,4]并将'_'转换为'o'? 函数必须返回带有该转换的初始列表。

非常重要的注意事项:'_'永远不会显示在输入上,我只用它来清楚位置[1,4]的位置(因此,在输入时我们只看到一个空格,'')< / strong>

1 个答案:

答案 0 :(得分:1)

似乎是在线编码游戏可能需要解决的其中一项任务。正如其他人所指出的那样,列表并不适合处理这样的坐标。但是,如果你不能使用更好的库(比如在编码游戏中),你将不得不做更多的工作。

以下是我ghci会话的代码(转换为正确的程序留给读者练习......):

let input =  ["#####", "#_ ##", "#  ##", "#   #", "#  .#", "#####", "1 4"]
let reverseInput = reverse input
let position = head reverseInput
let board = tail reverseInput
let posX = read $ takeWhile (/=' ') position :: Int
let posY = read $ takeWhile (/=' ') $ reverse position :: Int
let (unchangedBoard, changedBoard) = splitAt posY board
let (unchangedRow, changedRow) = splitAt posX $ head changedBoard
let newRow = unchangedRow ++ "o" ++ tail changedRow
let newBoard = unchangedBoard ++ [newRow] ++ tail changedBoard
let finalOutput = reverse newBoard
mapM_ putStrLn finalOutput

另请注意,此代码非常脆弱,因为它在整个地方使用部分函数(tailheadread)。您可以尝试使用模式匹配来使代码更加健壮。