) >>= \newF->
fresh >>= \tv->case expected of
FuncType t = pure (s1, t, (FunExpr p newF args fs))
) >>= \newF->
fresh >>= \tv->case expected of
FuncType t = pure (s1, t, (FunExpr p newF args fs))
_ = (let given = foldr (->>) tv argTs in
lift (unify expected given) >>= \s2->
let fReturnType = subst s2 tv in
_ = (let given = foldr (->>) tv argTs in
lift (unify expected given) >>= \s2->
let fReturnType = subst s2 tv in
pure (compose s2 s1, VoidType, FunStmt newF args_ fs)
ReturnStmt Nothing = pure (zero, VoidType, s)
pure (compose s2 s1, VoidType, FunStmt newF args_ fs)
ReturnStmt Nothing = pure (zero, VoidType, s)
ReturnStmt (Just e) = infer e >>= \(sub, t, e_)-> pure (sub, t, ReturnStmt (Just e_))
reverseFs :: Type FieldSelector -> Typing Type
ReturnStmt (Just e) = infer e >>= \(sub, t, e_)-> pure (sub, t, ReturnStmt (Just e_))
reverseFs :: Type FieldSelector -> Typing Type