git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #1703 from purescript/1669-constraint-parens

Drop paren requirement for constraints

commit6457f30b3c2c9cbd3d520d24ebb80ba76318cf65 authorGary Burgess <gary.burgess@gmail.com> dateSat 12 Dec 2015, 23:24 (11 years ago) parentdd66f58b7b396f
3 files changed+36−26
examples/passing/UntupledConstraints.purs+17 src/Language/PureScript/Parser/Declarations.hs+9−4 src/Language/PureScript/Parser/Types.hs+10−22
examples/passing/UntupledConstraints.pursnew file+17
@@ -0,0 +1,17 @@
1+module Main where
2+
3+import Prelude
4+import Control.Monad.Eff.Console
5+
6+class Show a <= Nonsense a where
7+ method :: a -> a
8+
9+data Box a = Box a
10+
11+instance showBox :: Show a => Show (Box a) where
12+ show (Box a) = "Box " <> show a
13+
14+strangeThing :: forall m. Semigroup (m Unit) => m Unit -> m Unit -> m Unit
15+strangeThing x y = x <> y
16+
17+main = log "Done"
src/Language/PureScript/Parser/Declarations.hs+9−4
@@ -33,6 +33,7 @@ import Language.PureScript.Environment
3333import Language.PureScript.Errors
3434import Language.PureScript.Kinds
3535import Language.PureScript.Names
36+import Language.PureScript.Types
3637import Language.PureScript.Parser.Common
3738import Language.PureScript.Parser.Kinds
3839import Language.PureScript.Parser.Lexer
@@ -174,9 +175,9 @@ parseDeclarationRef =
174175parseTypeClassDeclaration :: TokenParser Declaration
175176parseTypeClassDeclaration = do
176177 reserved "class"
177− implies <- P.option [] $ do
178+ implies <- P.option [] $ P.try $ do
178179 indented
179− implies <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
180+ implies <- P.try (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
180181 lfatArrow
181182 return implies
182183 className <- indented *> properName
@@ -185,13 +186,17 @@ parseTypeClassDeclaration = do
185186 indented *> reserved "where"
186187 indented *> mark (P.many (same *> positioned parseTypeDeclaration))
187188 return $ TypeClassDeclaration className idents implies members
189+ where
190+
191+parseConstraint :: TokenParser Constraint
192+parseConstraint = (,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)
188193
189194parseInstanceDeclaration :: TokenParser (TypeInstanceBody -> Declaration)
190195parseInstanceDeclaration = do
191196 reserved "instance"
192197 name <- parseIdent <* indented <* doubleColon
193− deps <- P.optionMaybe $ do
194− deps <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
198+ deps <- P.optionMaybe $ P.try $ do
199+ deps <- P.try (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
195200 indented
196201 rfatArrow
197202 return deps
src/Language/PureScript/Parser/Types.hs+10−22
@@ -1,18 +1,3 @@
1−-----------------------------------------------------------------------------
2−--
3−-- Module : Language.PureScript.Parser.Types
4−-- Copyright : (c) Phil Freeman 2013
5−-- License : MIT
6−--
7−-- Maintainer : Phil Freeman <paf31@cantab.net>
8−-- Stability : experimental
9−-- Portability :
10−--
11−-- |
12−-- Parsers for types
13−--
14−-----------------------------------------------------------------------------
15−
161module Language.PureScript.Parser.Types (
172 parseType,
183 parsePolyType,
@@ -70,7 +55,8 @@ parseForAll = mkForAll <$> (P.try (reserved "forall") *> P.many1 (indented *> id
7055--
7156parseTypeAtom :: TokenParser Type
7257parseTypeAtom = indented *> P.choice (map P.try
73− [ parseArray
58+ [ parseConstrainedType
59+ , parseArray
7460 , parseArrayOf
7561 , parseFunction
7662 , parseObject
@@ -79,21 +65,23 @@ parseTypeAtom = indented *> P.choice (map P.try
7965 , parseTypeConstructor
8066 , parseForAll
8167 , parens parseRow
82− , parseConstrainedType
8368 , parens parsePolyType
8469 ])
8570
8671parseConstrainedType :: TokenParser Type
8772parseConstrainedType = do
88− constraints <- parens . commaSep1 $ do
89− className <- parseQualified properName
90− indented
91− ty <- P.many parseTypeAtom
92− return (className, ty)
73+ constraints <- P.try (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
9374 _ <- rfatArrow
9475 indented
9576 ty <- parseType
9677 return $ ConstrainedType constraints ty
78+ where
79+ parseConstraint = do
80+ className <- parseQualified properName
81+ indented
82+ ty <- P.many parseTypeAtom
83+ return (className, ty)
84+
9785
9886parseAnyType :: TokenParser Type
9987parseAnyType = P.buildExpressionParser operators (buildPostfixParser postfixTable parseTypeAtom) P.<?> "type"