git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Resolves #1169. Throw constructor arity error when case omits params
commitf1dd8a596b871f62758b8e3a21740a5f7a27c00c authorMichael Gilliland <mjg.py3@gmail.com> dateSat 20 Jun 2015, 20:07 (11 years ago) parent39347bf
2 files changed+21−4
examples/failing/CaseDoesNotMatchAllConstructorArgs.purs+14 src/Language/PureScript/TypeChecker/Types.hs+7−4
examples/failing/CaseDoesNotMatchAllConstructorArgs.pursnew file+14
@@ -0,0 +1,14 @@
1+module Main where
2+
3+import Prelude
4+
5+data Person = Person String Int
6+
7+data TwoPeople = Two Person Person
8+
9+getName p = case p of
10+ (Two (Person n) (Person n2 a2)) -> n
11+ _ -> "Unknown"
12+
13+
14+name = getName (Two (Person "Jimmy" 20) (Person "" 1))
src/Language/PureScript/TypeChecker/Types.hs+7−4
@@ -368,12 +368,15 @@ inferBinder val (ConstructorBinder ctor binders) = do
368368 fn' <- introduceSkolemScope <=< replaceAllTypeSynonyms $ fn
369369 go binders fn'
370370 where
371− go [] ty' = do
372− _ <- subsumes Nothing val ty'
373− return M.empty
371+ go [] ty' = case (val, ty') of
372+ (TypeConstructor _, TypeApp _ _) -> throwIncorrectArity
373+ _ -> do
374+ _ <- subsumes Nothing val ty'
375+ return M.empty
374376 go (binder : binders') (TypeApp (TypeApp t obj) ret) | t == tyFunction =
375377 M.union <$> inferBinder obj binder <*> go binders' ret
376− go _ _ = throwError . errorMessage $ IncorrectConstructorArity ctor
378+ go _ _ = throwIncorrectArity
379+ throwIncorrectArity = throwError . errorMessage $ IncorrectConstructorArity ctor
377380 _ -> throwError . errorMessage $ UnknownDataConstructor ctor Nothing
378381inferBinder val (ObjectBinder props) = do
379382 row <- fresh