@@ -2,7 +2,7 @@ module Patterns (patternTerm, patternExpr, makeLambda, flattenPatterns) where
4import Data.Char (isUpper)
4import Data.Char (isUpper)
5−import Control.Applicative ((<$>))
5+import Control.Applicative ((<$>),(<*>))
6import Control.Monad
6import Control.Monad
7import Text.Parsec
7import Text.Parsec
8import ParseLib
8import ParseLib
@@ -11,8 +11,7 @@ patternBasic :: Monad m => ParsecT [Char] u m Pattern
11patternBasic =
11patternBasic =
12 choice [ char '_' >> return PAnything
12 choice [ char '_' >> return PAnything
13 , do x@(c:_) <- var
13 , do x@(c:_) <- var
14− if isUpper c then PData x <$> spacePrefix patternTerm
14+ return $ if isUpper c then PData x [] else PVar x
18patternTuple :: Monad m => ParsecT [Char] u m Pattern
17patternTuple :: Monad m => ParsecT [Char] u m Pattern
@@ -25,8 +24,11 @@ patternList = plist <$> braces (commaSep patternExpr)
25patternTerm :: Monad m => ParsecT [Char] u m Pattern
24patternTerm :: Monad m => ParsecT [Char] u m Pattern
26patternTerm = patternTuple <|> patternList <|> patternBasic <?> "pattern"
25patternTerm = patternTuple <|> patternList <|> patternBasic <?> "pattern"
27+patternConstructor :: Monad m => ParsecT [Char] u m Pattern
28+patternConstructor = PData <$> capVar <*> spacePrefix patternTerm
28patternExpr :: Monad m => ParsecT [Char] u m Pattern
30patternExpr :: Monad m => ParsecT [Char] u m Pattern
29−patternExpr = foldr1 pcons <$> consSep1 patternTerm <?> "pattern"
31+patternExpr = foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm) <?> "pattern"
32makeLambda pats body = foldr Lambda (makeBody pats body) (map getName pats)
34makeLambda pats body = foldr Lambda (makeBody pats body) (map getName pats)