Fix pattern matching for rank 2 constructors, and add an example
commit7e3515ca705b4eec078a0e5d982054d2ff4eb7bd
authorPhil Freeman <paf31@cantab.net>
dateWed 27 Nov 2013, 17:01 (13 years ago)
parentce885ef
examples/passing/Rank2Data.psnew file+23
@@ -0,0 +1,23 @@
1+data Id = Id forall a. a -> a
2+
3+runId = \id a -> case id of
4+ Id f -> f a
5+
6+data Nat = Nat forall r. r -> (r -> r) -> r
7+
8+runNat = \nat -> case nat of
9+ Nat f -> f 0 (\n -> n + 1)
10+
11+zero = Nat (\zero _ -> zero)
12+
13+succ = \n -> case n of
14+ Nat f -> Nat (\zero succ -> succ (f zero succ))
15+
16+add = \n m -> case n of
17+ Nat f -> case m of
18+ Nat g -> Nat (\zero succ -> g (f zero succ) succ)
19+
20+one = succ zero
21+two = succ zero
22+four = add two two
23+fourNumber = runNat four
src/Language/PureScript/TypeChecker/Types.hs+2−2
@@ -474,8 +474,8 @@ inferBinder val (UnaryBinder ctor binder) = do
474474 modulePath <- checkModulePath `fmap` lift get
475475 case M.lookup (qualify modulePath ctor) (dataConstructors env) of
476476 Just ty -> do
477− obj <- fresh
478− ty `subsumes` (Function [obj] val)
477+ Function [obj] ret <- replaceAllVarsWithUnknowns ty
478+ val `subsumes` ret
479479 inferBinder obj binder
480480 _ -> throwError $ "Constructor " ++ show ctor ++ " is not defined"
481481inferBinder val (ObjectBinder props) = do