haskell 控制语句中的解析错误(可能是缩进不正确或括号不匹配)

haskell parse error (possibly incorrect indentation or mismatched brackets) in control statement

我正在尝试让一些东西工作,它是一个游戏。我遇到了无法跟踪的解析错误。

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]

我收到的错误消息是:

parse error (possibly incorrect indentation or mismatched brackets)

我在以 "flippable" 开头的行收到解析错误,所以我猜前一行有问题。

下面的呢?

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

您不能将 ==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'