@@ -66,14 +66,21 @@ newtype TypeSolution = TypeSolution { runTypeSolution :: (Int -> Type, Int -> Ro
66emptyTypeSolution :: TypeSolution
66emptyTypeSolution :: TypeSolution
67emptyTypeSolution = TypeSolution (TUnknown, RUnknown)
67emptyTypeSolution = TypeSolution (TUnknown, RUnknown)
69+isFunction :: Value -> Bool
70+isFunction (Abs _ _) = True
71+isFunction (TypedValue untyped _) = isFunction untyped
74+allConstraints :: Ident -> Value -> Check ([TypeConstraint], Int)
75+allConstraints name val | isFunction val = do
77+ (cs, n) <- typeConstraints (M.singleton name me) val
78+ return (TypeConstraint me (TUnknown n) (ValueOrigin val): cs, n)
79+allConstraints _ val = typeConstraints M.empty val
69typeOf :: Ident -> Value -> Check PolyType
81typeOf :: Ident -> Value -> Check PolyType
70typeOf name val = do
82typeOf name val = do
71− (cs, n) <- case val of
83+ (cs, n) <- allConstraints name val
74− (cs, n) <- typeConstraints (M.singleton name me) val
75− return (TypeConstraint me (TUnknown n) (ValueOrigin val): cs, n)
76− _ -> typeConstraints M.empty val
77 desugared <- replaceAllTypeSynonyms cs
84 desugared <- replaceAllTypeSynonyms cs
78 solution <- solveTypeConstraints desugared emptyTypeSolution
85 solution <- solveTypeConstraints desugared emptyTypeSolution
79 let ty = fst (runTypeSolution solution) n
86 let ty = fst (runTypeSolution solution) n