【问题标题】:haskell parse error (possibly incorrect indentation or mismatched brackets) in control statement控制语句中的haskell解析错误(可能是不正确的缩进或不匹配的括号)
【发布时间】:2016-09-28 00:06:52
【问题描述】:

我正在尝试让某些东西发挥作用,它是为了游戏。我遇到了一个无法追踪的解析错误。

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]

我得到的错误信息是:

解析错误(可能是不正确的缩进或不匹配的括号)

我在以“flippable”开头的行出现解析错误,所以我猜测上一行有问题。

【问题讨论】:

  • 您可以将错误消息添加到您的问题中吗?
  • 谢谢你的建议,已经搞定了。

标签: parsing haskell indentation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    接下来呢?

    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
    

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 2015-01-26
      • 2018-01-21
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 2022-09-28
      • 2017-06-06
      • 2021-07-02
      相关资源
      最近更新 更多