我正在制作一个简单的Tic-Tac-Toe游戏来学习Haskell。如果方块为空,则棋盘中的每个单元格都有一个玩家值(X或O)或位置值(字母A-I,这样:
A|B|C
D|E|F
G|H|I
)
首先,我创建了一个简单的函数,它采用一个空板(看起来像上面的那个)和一个字符串(一个字母" A"通过" I&#34 ;),并返回一个板,其中输入的字母被替换为" X"。所以如果我打电话给newBoard blankBoard "C"
,我希望这会回来:
A|B|X
D|E|F
G|H|I
如果我想保持Square
数据类型不变,我怎样才能使这段代码有效:
data Square = A | B | C | D | E | F | G | H | I | X | O deriving (Read)
instance Show Square where
show A = "A"
show B = "B"
show C = "C"
show D = "D"
show E = "E"
show F = "F"
show G = "G"
show H = "H"
show I = "I"
type Board = [[Square]]
blankBoard :: Board
blankBoard = [[A,B,C],[D,E,F],[G,H,I]]
newBoard :: Board -> String -> Board
newBoard board letter = [[ if show sq == letter then X else sq | sq <- row ]| row <- board]
我收到此错误,并不确定原因:
[[*** Exception: myfunctions.hs:(386,3)-(394,14): Non-exhaustive patterns in function show
答案 0 :(得分:1)
错误Non-exhaustive patterns in function
表示您尝试使用带有未定义参数的函数。在这种情况下,您尝试在show
或X
上使用O
,而您只为A
到I
定义了它。< / p>
你可以通过添加:
来解决这个问题show X = "X"
show O = "O"
但是,由于你的show
函数根本没有做任何特殊的事情,你最好只使用deriving Show
,让Haskell为你创建函数。