@@ -76,7 +76,7 @@ parseTypeDeclaration =
7676
7777parseTypeSynonymDeclaration :: TokenParser Declaration
7878parseTypeSynonymDeclaration =
79− TypeSynonymDeclaration <$> (P.try (reserved "type") *> indented *> properName)
79+ TypeSynonymDeclaration <$> (reserved "type" *> indented *> properName)
8080 <*> many (indented *> kindedIdent)
8181 <*> (indented *> equals *> noWildcards parsePolyType)
8282
@@ -102,8 +102,8 @@ parseValueDeclaration = do
102102 return $ maybe value (`Let` value) whereClause
103103
104104parseExternDeclaration :: TokenParser Declaration
105−parseExternDeclaration = P.try (reserved "foreign") *> indented *> reserved "import" *> indented *>
106− (ExternDataDeclaration <$> (P.try (reserved "data") *> indented *> properName)
105+parseExternDeclaration = reserved "foreign" *> indented *> reserved "import" *> indented *>
106+ (ExternDataDeclaration <$> (reserved "data" *> indented *> properName)
107107 <*> (indented *> doubleColon *> parseKind)
108108 <|> (do ident <- parseIdent
109109 ty <- indented *> doubleColon *> noWildcards parsePolyType
@@ -111,9 +111,9 @@ parseExternDeclaration = P.try (reserved "foreign") *> indented *> reserved "imp
111111
112112parseAssociativity :: TokenParser Associativity
113113parseAssociativity =
114− (P.try (reserved "infixl") >> return Infixl) <|>
115− (P.try (reserved "infixr") >> return Infixr) <|>
116− (P.try (reserved "infix") >> return Infix)
114+ (reserved "infixl" *> return Infixl) <|>
115+ (reserved "infixr" *> return Infixr) <|>
116+ (reserved "infix" *> return Infix)
117117
118118parseFixity :: TokenParser Fixity
119119parseFixity = Fixity <$> parseAssociativity <*> (indented *> natural)
@@ -156,7 +156,6 @@ parseImportDeclaration' = do
156156 <|> (const (Implicit True) <$> (indented *> parens (symbol' "..")))
157157 return $ fromMaybe (Implicit False) declType
158158
159−
160159parseDeclarationRef :: TokenParser DeclarationRef
161160parseDeclarationRef =
162161 withSourceSpan PositionedDeclarationRef
@@ -173,9 +172,9 @@ parseDeclarationRef =
173172parseTypeClassDeclaration :: TokenParser Declaration
174173parseTypeClassDeclaration = do
175174 reserved "class"
176− implies <- P.option [] $ P.try $ do
175+ implies <- P.option [] . P.try $ do
177176 indented
178− implies <- P.try (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
177+ implies <- (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
179178 lfatArrow
180179 return implies
181180 className <- indented *> properName
@@ -194,7 +193,7 @@ parseInstanceDeclaration = do
194193 reserved "instance"
195194 name <- parseIdent <* indented <* doubleColon
196195 deps <- P.optionMaybe $ P.try $ do
197− deps <- P.try (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
196+ deps <- (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
198197 indented
199198 rfatArrow
200199 return deps
@@ -326,11 +325,12 @@ parseIdentifierAndValue =
326325 <|> (,) <$> (C.indented *> stringLiteral) <*> rest
327326 where
328327 rest = C.indented *> colon *> C.indented *> val
329− val = (Just <$> parseValue) <|> (underscore *> pure Nothing)
328+ val = (underscore *> pure Nothing) <|> (Just <$> parseValue)
330329
331330parseAbs :: TokenParser Expr
332331parseAbs = do
333332 symbol' "\\"
333+ -- TODO: remove this 'try' after operator aliases are finished (0.9)
334334 args <- P.many1 (C.indented *> (Abs <$> (Left <$> P.try C.parseIdent <|> Right <$> parseBinderNoParens)))
335335 C.indented *> rarrow
336336 value <- parseValue
@@ -346,7 +346,7 @@ parseConstructor :: TokenParser Expr
346346parseConstructor = Constructor <$> C.parseQualified C.properName
347347
348348parseCase :: TokenParser Expr
349−parseCase = Case <$> P.between (P.try (reserved "case")) (C.indented *> reserved "of") (commaSep1 parseValue)
349+parseCase = Case <$> P.between (reserved "case") (C.indented *> reserved "of") (commaSep1 parseValue)
350350 <*> (C.indented *> C.mark (P.many1 (C.same *> C.mark parseCaseAlternative)))
351351
352352parseCaseAlternative :: TokenParser CaseAlternative
@@ -375,23 +375,25 @@ parseLet = do
375375
376376parseValueAtom :: TokenParser Expr
377377parseValueAtom = P.choice
378− [ P.try parseNumericLiteral
379− , P.try parseCharLiteral
380− , P.try parseStringLiteral
381− , P.try parseBooleanLiteral
382− , parseArrayLiteral
383− , P.try parseObjectLiteral
384− , P.try parseObjectGetter
385− , parseAbs
386− , P.try parseConstructor
387− , P.try parseVar
388− , parseCase
389− , parseIfThenElse
390− , parseDo
391− , parseLet
392− , P.try $ Parens <$> parens parseValue
393− , parseOperatorSection
394− , P.try parseObjectUpdaterWildcard ]
378+ [ parseNumericLiteral
379+ , parseCharLiteral
380+ , parseStringLiteral
381+ , parseBooleanLiteral
382+ , parseArrayLiteral
383+ , P.try parseObjectLiteral
384+ , P.try parseObjectGetter
385+ , parseAbs
386+ , P.try parseConstructor
387+ , P.try parseVar
388+ , parseCase
389+ , parseIfThenElse
390+ , parseDo
391+ , parseLet
392+ , P.try $ Parens <$> parens parseValue
393+ , parseOperatorSection
394+ -- TODO: combine this with parseObjectGetter
395+ , parseObjectUpdaterWildcard
396+ ]
395397
396398-- |
397399-- Parse an expression in backticks or an operator
@@ -427,13 +429,14 @@ parseDoNotationLet :: TokenParser DoNotationElement
427429parseDoNotationLet = DoNotationLet <$> (reserved "let" *> C.indented *> C.mark (P.many1 (C.same *> parseLocalDeclaration)))
428430
429431parseDoNotationBind :: TokenParser DoNotationElement
430−parseDoNotationBind = DoNotationBind <$> parseBinder <*> (C.indented *> larrow *> parseValue)
432+parseDoNotationBind = DoNotationBind <$> P.try (parseBinder <* C.indented <* larrow) <*> parseValue
431433
432434parseDoNotationElement :: TokenParser DoNotationElement
433435parseDoNotationElement = P.choice
434− [ P.try parseDoNotationBind
436+ [ parseDoNotationBind
435437 , parseDoNotationLet
436− , P.try (DoNotationValue <$> parseValue) ]
438+ , DoNotationValue <$> parseValue
439+ ]
437440
438441parseObjectGetter :: TokenParser Expr
439442parseObjectGetter = ObjectGetter <$> (underscore *> C.indented *> dot *> C.indented *> (lname <|> stringLiteral))
@@ -443,7 +446,8 @@ indexersAndAccessors :: TokenParser Expr
443446indexersAndAccessors = C.buildPostfixParser postfixTable parseValueAtom
444447 where
445448 postfixTable = [ parseAccessor
446− , P.try . parseUpdaterBody . Just ]
449+ , P.try . parseUpdaterBody . Just
450+ ]
447451
448452-- |
449453-- Parse a value
@@ -455,9 +459,9 @@ parseValue = withSourceSpan PositionedValue
455459 $ indexersAndAccessors) P.<?> "expression"
456460 where
457461 postfixTable = [ \v -> P.try (flip App <$> (C.indented *> indexersAndAccessors)) <*> pure v
458− , \v -> flip (TypedValue True) <$> (P.try (C.indented *> doubleColon) *> parsePolyType) <*> pure v
462+ , \v -> flip (TypedValue True) <$> (C.indented *> doubleColon *> parsePolyType) <*> pure v
459463 ]
460− operators = [ [ P.Prefix (P.try (C.indented *> symbol' "-") >> return UnaryMinus)
464+ operators = [ [ P.Prefix (C.indented *> symbol' "-" *> return UnaryMinus)
461465 ]
462466 , [ P.Infix (P.try (C.indented *> parseInfixExpr P.<?> "infix expression") >>= \ident ->
463467 return (BinaryNoParens ident)) P.AssocRight
@@ -487,9 +491,6 @@ parseNumberBinder = NumberBinder <$> (sign <*> number)
487491 <|> (symbol' "+" >> return id)
488492 <|> return id
489493
490−parseVarBinder :: TokenParser Binder
491−parseVarBinder = VarBinder <$> C.parseIdent
492−
493494parseNullaryConstructorBinder :: TokenParser Binder
494495parseNullaryConstructorBinder = ConstructorBinder <$> C.parseQualified C.properName <*> pure []
495496
@@ -502,9 +503,13 @@ parseObjectBinder = ObjectBinder <$> braces (commaSep (C.indented *> parseIdenti
502503parseArrayBinder :: TokenParser Binder
503504parseArrayBinder = squares $ ArrayBinder <$> commaSep (C.indented *> parseBinder)
504505
505−parseNamedBinder :: TokenParser Binder
506−parseNamedBinder = NamedBinder <$> (C.parseIdent <* C.indented <* at)
507− <*> (C.indented *> parseBinder)
506+parseVarOrNamedBinder :: TokenParser Binder
507+parseVarOrNamedBinder = do
508+ -- TODO: once operator aliases are finalized in 0.9, this 'try' won't be needed
509+ -- any more since identifiers in binders won't be 'Op's.
510+ name <- P.try C.parseIdent
511+ let parseNamedBinder = NamedBinder name <$> (at *> C.indented *> parseBinder)
512+ parseNamedBinder <|> return (VarBinder name)
508513
509514parseNullBinder :: TokenParser Binder
510515parseNullBinder = underscore *> return NullBinder
@@ -525,38 +530,38 @@ parseBinder :: TokenParser Binder
525530parseBinder = withSourceSpan PositionedBinder (buildPostfixParser postfixTable parseBinderAtom)
526531 where
527532 -- TODO: parsePolyType when adding support for polymorphic types
528− postfixTable = [ \b -> flip TypedBinder b <$> (P.try (indented *> doubleColon) *> parseType)
533+ postfixTable = [ \b -> flip TypedBinder b <$> (indented *> doubleColon *> parseType)
529534 ]
530535 parseBinderAtom :: TokenParser Binder
531− parseBinderAtom = P.choice (map P.try
536+ parseBinderAtom = P.choice
532537 [ parseNullBinder
533538 , parseCharBinder
534539 , parseStringBinder
535540 , parseBooleanBinder
536541 , parseNumberBinder
537− , parseNamedBinder
538− , parseVarBinder
542+ , parseVarOrNamedBinder
539543 , parseConstructorBinder
540544 , parseObjectBinder
541545 , parseArrayBinder
542− , parens parseBinder ]) P.<?> "binder"
546+ , parens parseBinder
547+ ] P.<?> "binder"
543548
544549-- |
545550-- Parse a binder as it would appear in a top level declaration
546551--
547552parseBinderNoParens :: TokenParser Binder
548−parseBinderNoParens = P.choice (map P.try
549− [ parseNullBinder
550− , parseCharBinder
551− , parseStringBinder
552− , parseBooleanBinder
553− , parseNumberBinder
554− , parseNamedBinder
555− , parseVarBinder
556− , parseNullaryConstructorBinder
557− , parseObjectBinder
558− , parseArrayBinder
559− , parens parseBinder ]) P.<?> "binder"
553+parseBinderNoParens = P.choice
554+ [ parseNullBinder
555+ , parseCharBinder
556+ , parseStringBinder
557+ , parseBooleanBinder
558+ , parseNumberBinder
559+ , parseVarOrNamedBinder
560+ , parseNullaryConstructorBinder
561+ , parseObjectBinder
562+ , parseArrayBinder
563+ , parens parseBinder
564+ ] P.<?> "binder"
560565
561566-- |
562567-- Parse a guard