2015-11-16 66 views
0

我正在製作一個簡單的井字遊戲來學習Haskell。在板的每個單元具有任一玩家值(X或O)或位置值,如果正方形是空的(字母AI,使得:列表理解中的數據類型轉換(Haskell)

A|B|C 
D|E|F 
G|H|I 

首先,我已經創建一個簡單的功能需要一塊空板(看起來像上面那個)和一個字符串(一個字母「A」到「I」),並返回一個輸入字母被替換爲「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 
+9

您正試圖在X或O上使用show,這是您尚未定義的內容。是否有一個原因,你不只是使用'派生Show'爲你的廣場? – JHobern

+0

這樣做的竅門,謝謝!我沒有意識到X被顯示。 –

+0

啓用警告會在編譯時發現此錯誤。 – chi

回答

1

錯誤Non-exhaustive patterns in function意味着你已經嘗試使用功能,用自變量,它沒有defin編輯。在這種情況下,您試圖在XO上使用show,而您只將其定義爲AI

您可以通過添加解決這個問題:

show X = "X" 
show O = "O" 

然而,由於你的show功能沒有做什麼特別可言,你會更好只使用deriving Show,並讓哈斯克爾創建函數你。