@@ -59,20 +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
62+ args <- P.many (C.indented *> (P.try singleArg <|> manyArgs))
63+ C.lexeme $ C.indented *> P.string "->"
65+ return $ toFunction args value
64− uncurriedAbs :: P.Parsec String ParseState Value
67+ manyArgs :: P.Parsec String ParseState (Value -> Value)
65− uncurriedAbs = do
68+ manyArgs = do
66− args <- C.indented *> C.parens ((C.indented *> C.parseIdent) `P.sepBy` (C.indented *> C.comma))
69+ args <- 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+ return $ Abs args
70− curriedAbs :: P.Parsec String ParseState Value
71+ singleArg :: P.Parsec String ParseState (Value -> Value)
71− curriedAbs = do
72+ singleArg = Abs . return <$> C.parseIdent
72− args <- P.many1 (C.indented *> C.parseIdent)
73+ toFunction :: [Value -> Value] -> Value -> Value
73− C.lexeme $ C.indented *> P.string "->"
74+ toFunction [] value = Abs [] value
74− value <- parseValue
75+ toFunction args value = foldr (($)) value args
75− return $ foldl (\ret arg -> Abs [arg] ret) value args
77parseApp :: P.Parsec String ParseState Value
77parseApp :: P.Parsec String ParseState Value
78parseApp = App <$> parseValue
78parseApp = App <$> parseValue