列表理解中的数据类型转换(Haskell)

时间:2015-11-16 02:40:32

标签: haskell types custom-data-type

我正在制作一个简单的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

1 个答案:

答案 0 :(得分:1)

错误Non-exhaustive patterns in function表示您尝试使用带有未定义参数的函数。在这种情况下,您尝试在showX上使用O,而您只为AI定义了它。< / p>

你可以通过添加:

来解决这个问题
show X = "X"
show O = "O"

但是,由于你的show函数根本没有做任何特殊的事情,你最好只使用deriving Show,让Haskell为你创建函数。