@@ -66,14 +66,21 @@ newtype TypeSolution = TypeSolution { runTypeSolution :: (Int -> Type, Int -> Ro
6666emptyTypeSolution :: TypeSolution
6767emptyTypeSolution = TypeSolution (TUnknown, RUnknown)
6868
69+isFunction :: Value -> Bool
70+isFunction (Abs _ _) = True
71+isFunction (TypedValue untyped _) = isFunction untyped
72+isFunction _ = False
73+
74+allConstraints :: Ident -> Value -> Check ([TypeConstraint], Int)
75+allConstraints name val | isFunction val = do
76+ me <- fresh
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
80+
6981typeOf :: Ident -> Value -> Check PolyType
7082typeOf name val = do
71− (cs, n) <- case val of
72− Abs _ _ -> do
73− me <- fresh
74− (cs, n) <- typeConstraints (M.singleton name me) val
75− return (TypeConstraint me (TUnknown n) (ValueOrigin val): cs, n)
76− _ -> typeConstraints M.empty val
83+ (cs, n) <- allConstraints name val
7784 desugared <- replaceAllTypeSynonyms cs
7885 solution <- solveTypeConstraints desugared emptyTypeSolution
7986 let ty = fst (runTypeSolution solution) n