[英]Can I use guards within guards in Haskell
我在嘗試在Haskell的警衛中使用警衛時遇到問題,我試圖找出是否甚至不可能,但我在互聯網上找不到任何答案,我希望你們可能知道答案。 這是我嘗試編譯代碼時遇到的錯誤: Assignment2.hs:134:75: parse error on input '|'
我的代碼:
verticals :: Board -> (Row, Row, Row)
verticals ((a,b,c),(d,e,f),(g,h,i)) = ((a,d,g),(b,e,h),(c,f,i))
symbolToPlayer :: Field -> Player
symbolToPlayer X = P1
symbolToPlayer O = P2
showTime :: Board -> Maybe Player
showTime ((a,b,c),(d,e,f),(g,h,i))
| a==b && a==c = Just (symbolToPlayer a)
| d==e && d==f = Just (symbolToPlayer d)
| g==h && g==i = Just (symbolToPlayer i)
| otherwise = False
hasWinner :: Board -> Maybe Player
hasWinner b@((a,b,c),(d,e,f),(g,h,i))
| showTime b -> spot of error
| showTime (verticals b)
| a==e && a==i = Just (symbolToPlayer a)
| c==e && c==g = Just (symbolToPlayer c)
| otherwise = Nothing
該代碼適用於井字游戲,該部分代碼旨在找出哪個玩家贏了; 類型Board是自定義的,輸入示例:hasWinner((X,O,X),(X,O,O),(X,X,O))(輸出應為:Just P1)。
謝謝您的幫助!
您的程序中至少有2個嚴重的語法錯誤和1個類型錯誤。
語法錯誤:
| showTime b -> spot of error
| showTime (verticals b)
這里右邊不見了。 一般形式是
| guard = expression
沒有表情就無法逃脫。 編譯器等待“ =”,但找到“ |” 下一個后衛,所以它知道它的故障。
類型錯誤在這里:
| g==h && g==i = Just (symbolToPlayer i)
| otherwise = False
您必須確定該函數是否應返回Bool
或Maybe Player
。
這個怎么樣?
import Control.Monad (msum)
import Control.Applicative ((<*>), pure)
data Player = P1 | P2 | None deriving (Eq, Show)
data Field = X | O | B deriving (Eq, Show)
type Board = ((Field, Field, Field)
,(Field, Field, Field)
,(Field, Field, Field))
symbolToPlayer :: Field -> Player
symbolToPlayer X = P1
symbolToPlayer O = P2
symbolToPlayer B = None
checkThree :: (Field,Field,Field) -> Maybe Player
checkThree (a,b,c)
| a == b && a == c = Just $ symbolToPlayer a
| otherwise = Nothing
winHorizontal :: Board -> Maybe Player
winHorizontal (r1, r2, r3) = msum $ map checkThree [r1, r2, r3]
winVertical :: Board -> Maybe Player
winVertical ((a,b,c), (d,e,f), (g,h,i)) =
msum $ map checkThree [(a,d,g), (b,e,h), (c,f,i)]
winDiagonal :: Board -> Maybe Player
winDiagonal ((a,_,c), (_,e,_), (g,_,i)) =
msum $ map checkThree [(a,e,i), (c,e,g)]
hasWinner :: Board -> Maybe Player
hasWinner b = msum $ [winHorizontal, winVertical, winHorizontal] <*> pure b
Monad和Applicative是您的朋友!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.