Нет необходимости использовать фигурные скобки (хотя, конечно, вы могли бы) . Но вы должны быть осторожны с отступами. Это не так сложно, как может показаться на первый взгляд.
При этом верно, что вы не можете использовать where
внутри охраняемого выражения. Вы должны использовать let
в таком случае, например так:
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 == "+" = let (e,ss') = parseExpr ss
(e',ss'') = parseExpr ss'
in (Sum e e',ss'')
| s == "*" = let (e,ss') = parseExpr ss
(e',ss'') = parseExpr ss'
in (Mult e e',ss'')
Однако в вашем случае защитные выражения настолько просты, что их можно заменить на совпадения с образцом. (И желательно использовать эту возможность. Сопоставление с образцом - ваш лучший друг в Haskell.) В этом случае вы используете where
.
parseExpr :: [String] -> (Ast,[String])
parseExpr [] = error "Incorrect"
parseExpr (s:ss) | all isDigit s = (Tall (read s),ss)
parseExpr ("-":ss) = (Min e,ss') where (e,ss') = parseExpr ss
parseExpr ("+":ss) = (Sum e e',ss'') where (e, ss' ) = parseExpr ss
(e',ss'') = parseExpr ss'
parseExpr ("*":ss) = (Mult e e',ss'') where (e, ss' ) = parseExpr ss
(e',ss'') = parseExpr ss'