shithub: MicroHs

Download patch

ref: d370185fefb5bd0f338e7b9d65280a54929e40bf
parent: 0e0fb3a05f851c0485a4ddd5ba7cdc6ddb9e87f9
author: Lennart Augustsson <lennart@augustsson.net>
date: Sun Dec 8 13:03:20 EST 2024

Nore patterns

--- a/README.md
+++ b/README.md
@@ -53,6 +53,7 @@
    * DuplicateRecordFields
    * EmptyDataDecls
    * ExistentialQuantification
+   * ExplicitNamespaces
    * ExtendedDefaultRules
    * FlexibleContexts
    * FlexibleInstance
--- a/src/MicroHs/TypeCheck.hs
+++ b/src/MicroHs/TypeCheck.hs
@@ -1439,13 +1439,20 @@
     _ -> return adef
 
 tcPattern :: EDef -> EType -> T EDef
-tcPattern (Pattern (i, vks) p me) t = do
-  traceM ("Pattern " ++ show (i, vks, p, t))
-  p' <- return p  -- XXX
-  me' <- traverse (tcEqns True t) me
+tcPattern (Pattern (ip, vks) p me) at = do
+  traceM ("Pattern " ++ show (ip, vks, p, me, at))
+  let step [] t = tcPat (Check t) p
+      step (ik:iks) t = do
+        (ti, tr) <- unArrow (getSLoc ik) t
+        withExtVal (idKindIdent ik) ti $ step iks tr
+      dropForall (EForall _ _ t) = dropForall t
+      dropForall t = t
+  (_, _, p') <- step vks (dropForall at)   -- XXX
+  me' <- traverse (tcEqns True at) me
   mn <- gets moduleName
   checkConstraints
-  return $ Pattern (qualIdent mn i, vks) p' me'
+  traceM ("Pattern after " ++ show (qualIdent mn ip, vks, p', me'))
+  return $ Pattern (qualIdent mn ip, vks) p' me'
 tcPattern _ _ = error "tcPattern"
 
 -- Add implicit forall and type check.
@@ -2277,9 +2284,9 @@
     ELit _ _           -> check0
     ENegApp _          -> check0
     EViewPat _ _       -> check0
-    _ -> impossible
+    _                  -> impossible
   where
-    check0 = if n /= 0 then tcError (getSLoc p) "Bad pattern" else return ()
+    check0 = if n /= 0 then tcError (getSLoc p) ("Bad pattern " ++ show p) else return ()
 
 tcBinds :: forall a . [EBind] -> ([EBind] -> T a) -> T a
 tcBinds xbs ta = do