git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Resolves #1169. Throw constructor arity error when case omits params
f1dd8a5Michael Gilliland
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
368 fn' <- introduceSkolemScope <=< replaceAllTypeSynonyms $ fn
368 fn' <- introduceSkolemScope <=< replaceAllTypeSynonyms $ fn
369 go binders fn'
369 go binders fn'
370 where
370 where
371+ go [] ty' = case (val, ty') of
372+ (TypeConstructor _, TypeApp _ _) -> throwIncorrectArity
371− go [] ty' = do
373+ _ -> do
372− _ <- subsumes Nothing val ty'
374+ _ <- subsumes Nothing val ty'
373− return M.empty
375+ return M.empty
374 go (binder : binders') (TypeApp (TypeApp t obj) ret) | t == tyFunction =
376 go (binder : binders') (TypeApp (TypeApp t obj) ret) | t == tyFunction =
375 M.union <$> inferBinder obj binder <*> go binders' ret
377 M.union <$> inferBinder obj binder <*> go binders' ret
378+ go _ _ = throwIncorrectArity
376− go _ _ = throwError . errorMessage $ IncorrectConstructorArity ctor
379+ throwIncorrectArity = throwError . errorMessage $ IncorrectConstructorArity ctor
377 _ -> throwError . errorMessage $ UnknownDataConstructor ctor Nothing
380 _ -> throwError . errorMessage $ UnknownDataConstructor ctor Nothing
378inferBinder val (ObjectBinder props) = do
381inferBinder val (ObjectBinder props) = do
379 row <- fresh
382 row <- fresh