1module Type.Constrain.Pattern where
3import Control.Arrow (second)
4import Control.Applicative ((<$>))
5import qualified Control.Monad as Monad
6import qualified Data.List as List
7import qualified Data.Maybe as Maybe
9import qualified Data.Map as Map
11import SourceSyntax.Pattern
14import Type.Environment as Env
15import qualified Type.Constrain.Literal as Literal
18constrain :: Environment -> Pattern -> Type -> IO Fragment
19constrain env pattern tipe =
21 PAnything -> return emptyFragment
24 return $ emptyFragment {
25 typeConstraint = Literal.constrain env lit tipe
31 typeEnv = Map.singleton name (VarN v),
33 typeConstraint = VarN v === tipe
37 fragment <- constrain env p tipe
39 typeEnv = Map.insert name tipe (typeEnv fragment),
40 typeConstraint = name <? tipe /\ typeConstraint fragment
43 PData name patterns -> do
44 (kind, cvars, ctipe) <- freshDataScheme env name
45 let tvars = map VarN cvars
46 msg = concat [ "Constructor '", name, "' expects ", show kind
47 , " argument", if kind == 1 then "" else "s"
48 , " but was given ", show (length patterns), "." ]
49 if length patterns /= kind then error msg else do
50 fragment <- Monad.liftM joinFragments (Monad.zipWithM (constrain env) patterns tvars)
52 typeConstraint = typeConstraint fragment /\ tipe === ctipe,
53 vars = cvars ++ vars fragment
57 pairs <- mapM (\name -> (,) name <$> flexibleVar) fields
58 let tenv = Map.fromList (map (second VarN) pairs)
59 c <- exists $ \t -> return (tipe === record (Map.map (:[]) tenv) t)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list