我正在开发棋盘游戏《奥赛罗》的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的基础知识。感谢您的时间和提前提供的帮助。
这是因为
(drawBoardCell pos : [drawBoardRow(fst pos + 1, snd pos) (len - 1)])
是[String]
,而不是String
,并且不能将String
附加到[String]
(drawBoardCell
和drawBoardRow
产生String
s,所以[drawBoardRow ...]
是[String]
,所以整个东西也是[String]
。(
你需要坚持++
。
看起来您正在使用let
和return
,就好像这是您已经知道的其他编程语言一样
如果你知道其他编程语言,现在是忘记你知道的好时机。
这里根本不需要return
,而且大多数let
都没有任何用途。
我自己的初级水平应该是这样的:
drawBoard :: (Int, Int) -> Board -> Int -> String
drawBoard _ _ 0 = ""
drawBoard pos@(x,y) b len =
drawBoardRow pos (size b) ++ drawBoard (x, y + 1) b (len - 1)
drawBoardRow :: (Int, Int) -> Int -> String
drawBoardRow _ 0 = ""
drawBoardRow pos@(x, y) len =
drawBoardCell pos ++ drawBoardRow(x + 1, y) (len - 1) ++ "n"
drawBoardCell :: (Int, Int) -> String
drawBoardCell (x, y) = " " ++ show x ++ show y ++ " "
这是因为您使用的return
就像这是Java之类的。去掉你在这里展示给我们的所有return
,然后再试一次,它应该会起作用。