@@ -72,7 +72,7 @@ parseCase = Case <$> (P.between (C.reserved "case") (C.indented *> C.reserved "o
7272 <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
7373
7474parseCaseAlternative :: P.Parsec String P.Column (Binder, Value)
75−parseCaseAlternative = (,) <$> (parseBinder <* C.lexeme (P.string "->")) <*> parseValue
75+parseCaseAlternative = (,) <$> (parseGuardedBinder <* C.lexeme (P.string "->")) <*> parseValue
7676
7777parseBlock :: P.Parsec String P.Column Value
7878parseBlock = Block <$> (C.reserved "do" *> parseManyStatements)
@@ -211,6 +211,13 @@ parseArrayBinder :: P.Parsec String P.Column Binder
211211parseArrayBinder = C.squares $ ArrayBinder <$> ((C.indented *> parseBinder) `P.sepBy` (C.indented *> C.comma))
212212 <*> P.optionMaybe (C.indented *> C.colon *> C.indented *> parseBinder)
213213
214+parseNamedBinder :: P.Parsec String P.Column Binder
215+parseNamedBinder = NamedBinder <$> (C.parseIdent <* C.indented <* C.lexeme (P.char '@'))
216+ <*> (C.indented *> parseBinder)
217+
218+parseNullBinder :: P.Parsec String P.Column Binder
219+parseNullBinder = C.lexeme (P.char '_') *> P.notFollowedBy C.identLetter *> return NullBinder
220+
214221parseIdentifierAndBinder :: P.Parsec String P.Column (String, Binder)
215222parseIdentifierAndBinder = do
216223 name <- C.lexeme C.identifier
@@ -220,9 +227,11 @@ parseIdentifierAndBinder = do
220227
221228parseBinder :: P.Parsec String P.Column Binder
222229parseBinder = P.choice (map P.try
223− [ parseStringBinder
230+ [ parseNullBinder
231+ , parseStringBinder
224232 , parseBooleanBinder
225233 , parseNumberBinder
234+ , parseNamedBinder
226235 , parseVarBinder
227236 , parseUnaryBinder
228237 , parseNullaryBinder
@@ -230,6 +239,9 @@ parseBinder = P.choice (map P.try
230239 , parseArrayBinder
231240 , C.parens parseBinder ])
232241
242+parseGuardedBinder :: P.Parsec String P.Column Binder
243+parseGuardedBinder = flip ($) <$> parseBinder <*> P.option id (GuardedBinder <$> (C.indented *> C.lexeme (P.char '|') *> C.indented *> parseValue))
244+
233245parseAssignmentTarget :: P.Parsec String P.Column AssignmentTarget
234246parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)
235247 where