@@ -59,10 +59,20 @@ parseIdentifierAndValue = (,) <$> (C.indented *> C.identifier <* C.indented <* C
59parseAbs :: P.Parsec String ParseState Value
59parseAbs :: P.Parsec String ParseState Value
60parseAbs = do
60parseAbs = do
61 C.lexeme $ P.char '\\'
61 C.lexeme $ P.char '\\'
62+ uncurriedAbs <|> curriedAbs
64+ uncurriedAbs :: P.Parsec String ParseState Value
62− args <- (C.indented *> C.parseIdent) `P.sepBy` (C.indented *> C.comma)
66+ args <- C.indented *> C.parens ((C.indented *> C.parseIdent) `P.sepBy` (C.indented *> C.comma))
67+ C.lexeme $ C.indented *> P.string "->"
69+ return $ Abs args value
70+ curriedAbs :: P.Parsec String ParseState Value
72+ args <- P.many1 (C.indented *> C.parseIdent)
63− C.lexeme $ C.indented *> P.string "->"
73+ C.lexeme $ C.indented *> P.string "->"
64− value <- parseValue
74+ value <- parseValue
65− return $ Abs args value
75+ return $ foldl (\ret arg -> Abs [arg] ret) value args
67parseApp :: P.Parsec String ParseState Value
77parseApp :: P.Parsec String ParseState Value
68parseApp = App <$> parseValue
78parseApp = App <$> parseValue