次のコードがあります。
parseExpr :: [String] -> (Ast,[String])
parseExpr [] = error "Incorrect"
parseExpr (s:ss) | all isDigit s = (Tall (read s),ss)
| s == "-" = let (e,ss') = parseExpr ss in (Min e,ss')
| s == "+" = (Sum e e',ss'') where
(e,ss') = parseExpr ss
(e',ss'') = parseExpr ss'
| s == "*" = (Mult e e',ss'') where
(e,ss') = parseExpr ss
(e',ss'') = parseExpr ss'
実行しようとすると、「入力 '|' の解析エラー」というエラーが表示されます。それが話している行は次のとおりです。
...
(e',ss'') = parseExpr ss'
-> | s == "*" = (Mult e e',ss'') where
(e,ss') = parseExpr ss
...
理由はわかると思います。ガードによってシールドされていない上に 2 つの線があり、下に別のガードが突然現れると、Haskell が混乱するためだと思います。しかし、これらのケースの後にガードを追加するにはどうすればよいでしょうか?
新しい行を区切るためにセミコロンを使用しようとしましたが、Haskell を初めて使用するため、その構文についてあまり知りません。