Commit 1a03162e authored by simonpj's avatar simonpj
Browse files

[project @ 2003-07-29 10:14:57 by simonpj]

Comments only
parent 09a17f7a
......@@ -79,12 +79,27 @@ data Expr b -- "b" for the type of binders,
| Lam b (Expr b)
| Let (Bind b) (Expr b)
| Case (Expr b) b [Alt b] -- Binder gets bound to value of scrutinee
-- Invariant: the list of alternatives is ALWAYS EXHAUSTIVE
-- Invariant: the DEFAULT case must be *first*, if it occurs at all
-- Invariant: The list of alternatives is ALWAYS EXHAUSTIVE,
-- meaning that it covers all cases that can occur
-- See the example below
--
-- Invariant: The DEFAULT case must be *first*, if it occurs at all
| Note Note (Expr b)
| Type Type -- This should only show up at the top
-- level of an Arg
-- An "exhausive" case does not necessarily mention all constructors:
-- data Foo = Red | Green | Blue
--
-- ...case x of
-- Red -> True
-- other -> f (case x of
-- Green -> ...
-- Blue -> ... )
-- The inner case does not need a Red alternative, because x can't be Red at
-- that program point.
type Arg b = Expr b -- Can be a Type
type Alt b = (AltCon, [b], Expr b) -- (DEFAULT, [], rhs) is the default alternative
......
......@@ -497,6 +497,11 @@ makeDerivEqns tycl_decls
-- Don't want
-- instance Eq [A] => Eq A !!
-- Here's a recursive newtype that's actually OK
-- newtype S1 = S1 [T1 ()]
-- newtype T1 a = T1 (StateT S1 IO a ) deriving( Monad )
-- It's currently rejected. Oh well.
-- Check that eta reduction is OK
-- (a) the dropped-off args are identical
-- (b) the remaining type args mention
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment