我正在尝试让一些东西工作,它是为了一个游戏。我遇到了一个无法追踪的解析错误。
getLineDir :: (Int, Int) -> Piece -> Board -> [Piece]
getLineDir (x,y) (Piece (x',y') player) board
| pieceAt(x'+ x, y'+ y) board == Nothing = []
| if pieceAt(x'+ x, y'+ y) board == Just (Piece _ player') && isPlayer player (Piece _ player') == True then (Piece (x',y') player):[] else (Piece _ player'): getLineDir (x,y) (Piece (x'+x, y'+y) player) board
flippable :: [Piece] -> [Piece]
我收到的错误消息是:
解析错误(可能是不正确的缩进或不匹配的括号)
我在以"可翻转"开头的行处收到解析错误,所以我猜测前一行有问题。
您不能将==
与 Just (Piece _ player')
这样的模式一起使用。您需要像case
一样进行适当的模式匹配。
getLineDir :: (Int, Int) -> Piece -> Board -> [Piece]
getLineDir (x,y) (Piece (x',y') player) board =
case pieceAt (x'+ x, y'+ y) board of
Nothing -> []
Just piece@(Piece _ player')
| isPlayer player piece -> [Piece (x',y') player]
| otherwise -> piece : getLineDir (x,y) (Piece (x'+x, y'+y) player) board
也许,Just piece@(Piece _ player')
可以简单地替换为 Just piece
,因为在那之后你永远不需要player'
。
下面呢?
getLineDir :: (Int, Int) -> Piece -> Board -> [Piece]
getLineDir (x, y) (Piece (x', y') player) board
| pieceAt(x'+ x, y'+ y) board == Nothing = []
| pieceAt(x'+ x, y'+ y) board == Just (Piece _ player') && isPlayer player (Piece _ player') == True = (Piece (x', y') player) : []
| otherwise = (Piece _ player') : getLineDir (x,y) (Piece (x'+ x, y'+ y) player) board