我正在开发棋盘游戏奥赛罗的 Haskell 实现,但仍处于流程的开始阶段。我目前正在尝试创建一个显示板的功能。此刻,我只是试图让函数输出每个单元格的坐标值。我的想法是我可以遍历每一行,然后遍历每个单元格并输出每个单元格的值。然后我在 main 中调用这个函数并将板输出为字符串。
但是,我在字符串连接方面遇到问题并遇到错误“预期类型:字符串,实际类型:[[Char]]。
我知道在 Haskell 中,String 本质上是 [Char] 的化名,但是当我使用“++”函数时,我不明白为什么会得到 [[Char]]。
showGameState :: GameState -> String
showGameState g =
let boardStart = (1,1)
in drawBoard boardStart (board g) (size $ board g)
//the standard board is size 8*8
//here im trying to recursively call the drawBoardRow function increasing the row each time
drawBoard :: (Int, Int) -> Board -> Int -> String
drawBoard pos b len =
let string = ""
in if len > 0
then string ++ (drawBoardRow pos (size b) : [drawBoard (fst pos, snd pos +1) (b) (len - 1)])
else return string
//callig the drawBoardCell function recursively increasing the column position each time
drawBoardRow :: (Int, Int) -> Int -> String
drawBoardRow pos len =
let string = ""
in if len > 0
then string ++ (drawBoardCell pos : [drawBoardRow(fst pos + 1, snd pos) (len - 1)]) ++ "\n"
else return string
//At this stage i simply want to add each the coordinate of the cell the string containing
//the row
drawBoardCell :: (Int, Int) -> String
drawBoardCell pos =
let string = ""
in return (string ++ " " ++ show(fst pos) ++ show(snd pos) ++ " ")
理想情况下,我希望这个函数输出这个:
11 21 31 41 51 61 71 81
12 22 32 42 52 62 72 82
13 23 33 43 53 63 73 83
14 24 34 44 54 64 74 84
15 25 35 45 55 65 75 85
16 26 36 46 56 66 76 86
17 27 37 47 57 67 77 78
18 28 38 48 58 68 78 88
抱歉,如果我的代码不是很易读或我的想法不清楚,我仍在努力学习 Haskell 的基础知识。提前感谢您的时间和帮助。