@@ -338,18 +338,17 @@ inferBinder val (ConstructorBinder ctor binders) = do
338 Just (_, _, ty, _) -> do
338 Just (_, _, ty, _) -> do
339 (_, fn) <- instantiatePolyTypeWithUnknowns (internalError "Data constructor types cannot contain constraints") ty
339 (_, fn) <- instantiatePolyTypeWithUnknowns (internalError "Data constructor types cannot contain constraints") ty
340 fn' <- introduceSkolemScope <=< replaceAllTypeSynonyms $ fn
340 fn' <- introduceSkolemScope <=< replaceAllTypeSynonyms $ fn
341− go binders fn'
341+ let (args, ret) = peelArgs fn'
343− go [] ty' = case (val, ty') of
344− (TypeConstructor _, TypeApp _ _) -> throwIncorrectArity
348− go (binder : binders') (TypeApp (TypeApp t obj) ret) | t == tyFunction =
349− M.union <$> inferBinder obj binder <*> go binders' ret
350− go _ _ = throwIncorrectArity
351− throwIncorrectArity = throwError . errorMessage $ IncorrectConstructorArity ctor
342+ unless (length args == length binders) . throwError . errorMessage $ IncorrectConstructorArity ctor
344+ M.unions <$> zipWithM inferBinder (reverse args) binders
352 _ -> throwError . errorMessage $ UnknownDataConstructor ctor Nothing
345 _ -> throwError . errorMessage $ UnknownDataConstructor ctor Nothing
347+ peelArgs :: Type -> ([Type], Type)
350+ go args (TypeApp (TypeApp fn arg) ret) | fn == tyFunction = go (arg : args) ret
351+ go args ret = (args, ret)
353inferBinder val (ObjectBinder props) = do
352inferBinder val (ObjectBinder props) = do
354 row <- fresh
353 row <- fresh
355 rest <- fresh
354 rest <- fresh