2 -- Module : Lambda.Type
3 -- Copyright : Tomáš Musil 2014
6 -- Maintainer : tomik.musil@gmail.com
7 -- Stability : experimental
9 -- Data types for Hindley-Milner types.
21 type TypeVarName = String
22 type TypeName = String
24 data Type = Primitive TypeName | TypeVar TypeVarName | TypeFunction Type Type deriving (Show)
25 data TypeScheme = TScheme Type | TSForAll TypeVarName TypeScheme deriving (Show)
27 data HMTerm = HMTerm Term TypeScheme | HMLet VarName HMTerm HMTerm TypeScheme
29 type Substitution = TypeScheme -> TypeScheme
34 substitute :: TypeScheme -> TypeVarName -> TypeScheme -> TypeScheme
35 substitute = undefined
37 unify :: TypeScheme -> TypeScheme -> Either String Substitution
38 unify (TScheme (Primitive a)) (TScheme (Primitive b)) | a == b = Right id
39 unify (TScheme (TypeVar a)) (TScheme (TypeVar b)) | a == b = Right id
40 unify a b = Left "cannot unify " ++ show a ++ " with " ++ show b
42 algW :: HMTerm -> Either String TypeScheme
43 algW (HMTerm (Var _) t) = Right t
44 algW (HMTerm (Lambda x t) (TScheme p)) = do
45 let v = TScheme (TypeVar fresh)
46 np <- substitute v x t
48 algW (HMTerm (App u v) t) = do
52 (TScheme (TypeFunction a b)) -> do
55 _ -> Left $ "cannot apply " ++ show tu ++ " to " ++ show tv