Skip to content

Commit 67edf7a

Browse files
committed
[] can now be used in type class instances
1 parent bbdc8d6 commit 67edf7a

File tree

9 files changed

+33
-24
lines changed

9 files changed

+33
-24
lines changed

examples/passing/ArrayType.purs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module ArrayType where
2+
3+
test :: [] Number
4+
test = [1, 2, 3]
5+
6+
class Functor f where
7+
fmap :: forall a b. (a -> b) -> f a -> f b
8+
9+
foreign import (:) :: forall a. a -> [a] -> [a]
10+
11+
instance Functor [] where
12+
fmap _ [] = []
13+
fmap f (x:xs) = f x : fmap f xs

purescript.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: purescript
2-
version: 0.3.0
2+
version: 0.3.1
33
cabal-version: >=1.8
44
build-type: Simple
55
license: MIT

src/Language/PureScript/CodeGen/JS.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ runtimeTypeChecks args ty =
125125
argumentCheck val Number = [typeCheck val "number"]
126126
argumentCheck val String = [typeCheck val "string"]
127127
argumentCheck val Boolean = [typeCheck val "boolean"]
128-
argumentCheck val (Array _) = [arrayCheck val]
128+
argumentCheck val (TypeApp Array _) = [arrayCheck val]
129129
argumentCheck val (Object row) =
130130
let
131131
(pairs, _) = rowToList row

src/Language/PureScript/Parser/Types.hs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ parseBoolean :: P.Parsec String ParseState Type
3636
parseBoolean = const Boolean <$> reserved "Boolean"
3737

3838
parseArray :: P.Parsec String ParseState Type
39-
parseArray = squares $ Array <$> parseType
39+
parseArray = squares $ return Array
40+
41+
parseArrayOf :: P.Parsec String ParseState Type
42+
parseArrayOf = squares $ TypeApp Array <$> parseType
4043

4144
parseObject :: P.Parsec String ParseState Type
4245
parseObject = braces $ Object <$> parseRow
@@ -64,6 +67,7 @@ parseTypeAtom = indented *> P.choice (map P.try
6467
, parseString
6568
, parseBoolean
6669
, parseArray
70+
, parseArrayOf
6771
, parseObject
6872
, parseFunction
6973
, parseTypeVariable

src/Language/PureScript/Pretty/Types.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ typeLiterals = mkPattern match
3131
match Number = Just "Number"
3232
match String = Just "String"
3333
match Boolean = Just "Boolean"
34-
match (Array ty) = Just $ "[" ++ prettyPrintType ty ++ "]"
34+
match Array = Just $ "[]"
3535
match (Object row) = Just $ "{ " ++ prettyPrintType row ++ " }"
3636
match (TypeVar var) = Just var
3737
match (TypeConstructor ctor) = Just $ show ctor

src/Language/PureScript/Sugar/TypeClasses.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ typeToString :: ModuleName -> Type -> Either String String
122122
typeToString _ String = return "string"
123123
typeToString _ Number = return "number"
124124
typeToString _ Boolean = return "boolean"
125-
typeToString _ (Array (TypeVar _)) = return "array"
125+
typeToString _ Array = return "array"
126126
typeToString mn (TypeConstructor ty') = return $ qualifiedToString mn ty'
127127
typeToString mn (TypeApp ty' (TypeVar _)) = typeToString mn ty'
128128
typeToString _ _ = Left "Type class instance must be of the form T a1 ... an"

src/Language/PureScript/TypeChecker/Kinds.hs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,7 @@ infer :: Type -> Subst Kind
9595
infer Number = return Star
9696
infer String = return Star
9797
infer Boolean = return Star
98-
infer (Array t) = do
99-
k <- infer t
100-
k ~~ Star
101-
return Star
98+
infer Array = return $ FunKind Star Star
10299
infer (Object row) = do
103100
k <- infer row
104101
k ~~ Row Star

src/Language/PureScript/TypeChecker/Types.hs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ instance Unifiable Type where
5353
apply s (TUnknown u) = runSubstitution s u
5454
apply s (SaturatedTypeSynonym name tys) = SaturatedTypeSynonym name $ map (apply s) tys
5555
apply s (ForAll idents ty) = ForAll idents $ apply s ty
56-
apply s (Array t) = Array (apply s t)
5756
apply s (Object r) = Object (apply s r)
5857
apply s (Function args ret) = Function (map (apply s) args) (apply s ret)
5958
apply s (TypeApp t1 t2) = TypeApp (apply s t1) (apply s t2)
@@ -62,7 +61,6 @@ instance Unifiable Type where
6261
unknowns (TUnknown (Unknown u)) = [u]
6362
unknowns (SaturatedTypeSynonym _ tys) = concatMap unknowns tys
6463
unknowns (ForAll _ ty) = unknowns ty
65-
unknowns (Array t) = unknowns t
6664
unknowns (Object r) = unknowns r
6765
unknowns (Function args ret) = concatMap unknowns args ++ unknowns ret
6866
unknowns (TypeApp t1 t2) = unknowns t1 ++ unknowns t2
@@ -91,7 +89,7 @@ unifyTypes t1 t2 = rethrow (\e -> "Error unifying type " ++ prettyPrintType t1 +
9189
unifyTypes' Number Number = return ()
9290
unifyTypes' String String = return ()
9391
unifyTypes' Boolean Boolean = return ()
94-
unifyTypes' (Array s) (Array t) = s `unifyTypes` t
92+
unifyTypes' Array Array = return ()
9593
unifyTypes' (Object row1) (Object row2) = row1 ~~ row2
9694
unifyTypes' (Function args1 ret1) (Function args2 ret2) = do
9795
guardWith "Function applied to incorrect number of args" $ length args1 == length args2
@@ -218,9 +216,7 @@ typeHeadsAreEqual _ _ String String = Just []
218216
typeHeadsAreEqual _ _ Number Number = Just []
219217
typeHeadsAreEqual _ _ Boolean Boolean = Just []
220218
typeHeadsAreEqual _ _ (Skolem s1) (Skolem s2) | s1 == s2 = Just []
221-
typeHeadsAreEqual _ _ (Array (TypeVar v)) (Array ty) = Just [(v, ty)]
222-
typeHeadsAreEqual _ _ (Array ty) (Array (TypeVar v)) = Just [(v, ty)]
223-
typeHeadsAreEqual m e (Array ty1) (Array ty2) = typeHeadsAreEqual m e ty1 ty2
219+
typeHeadsAreEqual _ _ Array Array = Just []
224220
typeHeadsAreEqual m e (TypeConstructor c1) (TypeConstructor c2) | typeConstructorsAreEqual e m c1 c2 = Just []
225221
typeHeadsAreEqual m e (TypeApp h1 (TypeVar v)) (TypeApp h2 arg) = (:) (v, arg) <$> typeHeadsAreEqual m e h1 h2
226222
typeHeadsAreEqual m e t1@(TypeApp _ _) t2@(TypeApp _ (TypeVar _)) = typeHeadsAreEqual m e t2 t1
@@ -312,7 +308,7 @@ infer' v@(BooleanLiteral _) = return $ TypedValue True v Boolean
312308
infer' (ArrayLiteral vals) = do
313309
ts <- mapM infer vals
314310
els <- fresh
315-
forM_ ts $ \(TypedValue _ _ t) -> els ~~ Array t
311+
forM_ ts $ \(TypedValue _ _ t) -> els ~~ TypeApp Array t
316312
return $ TypedValue True (ArrayLiteral ts) els
317313
infer' (Unary op val) = do
318314
v <- infer val
@@ -338,8 +334,8 @@ infer' (ObjectUpdate o ps) = do
338334
infer' (Indexer index val) = do
339335
el <- fresh
340336
index' <- check index Number
341-
val' <- check val (Array el)
342-
return $ TypedValue True (Indexer (TypedValue True index' Number) (TypedValue True val' (Array el))) el
337+
val' <- check val (TypeApp Array el)
338+
return $ TypedValue True (Indexer (TypedValue True index' Number) (TypedValue True val' (TypeApp Array el))) el
343339
infer' (Accessor prop val) = do
344340
typed@(TypedValue _ _ objTy) <- infer val
345341
propTy <- inferProperty objTy prop
@@ -533,13 +529,13 @@ inferBinder val (ObjectBinder props) = do
533529
inferBinder val (ArrayBinder binders) = do
534530
el <- fresh
535531
m1 <- M.unions <$> mapM (inferBinder el) binders
536-
val ~~ Array el
532+
val ~~ TypeApp Array el
537533
return m1
538534
inferBinder val (ConsBinder headBinder tailBinder) = do
539535
el <- fresh
540536
m1 <- inferBinder el headBinder
541537
m2 <- inferBinder val tailBinder
542-
val ~~ Array el
538+
val ~~ TypeApp Array el
543539
return $ m1 `M.union` m2
544540
inferBinder val (NamedBinder name binder) = do
545541
m <- inferBinder val binder
@@ -668,10 +664,10 @@ check' v@(StringLiteral _) String = return v
668664
check' v@(BooleanLiteral _) Boolean = return v
669665
check' (Unary op val) ty = checkUnary op val ty
670666
check' (Binary op left right) ty = checkBinary op left right ty
671-
check' (ArrayLiteral vals) (Array ty) = ArrayLiteral <$> forM vals (\val -> check val ty)
667+
check' (ArrayLiteral vals) (TypeApp Array ty) = ArrayLiteral <$> forM vals (\val -> check val ty)
672668
check' (Indexer index vals) ty = do
673669
index' <- check index Number
674-
vals' <- check vals (Array ty)
670+
vals' <- check vals (TypeApp Array ty)
675671
return $ Indexer index' vals'
676672
check' (Abs args ret) (Function argTys retTy) = do
677673
moduleName <- substCurrentModule <$> ask

src/Language/PureScript/Types.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ data Type
2727
| Number
2828
| String
2929
| Boolean
30-
| Array Type
30+
| Array
3131
| Object Type
3232
| Function [Type] Type
3333
| TypeVar String
@@ -54,7 +54,6 @@ isMonoType (ForAll _ _) = False
5454
isMonoType ty = isPolyType ty
5555

5656
isPolyType :: Type -> Bool
57-
isPolyType (Array ty) = isMonoType ty
5857
isPolyType (Object ps) = all isPolyType (map snd . fst $ rowToList ps)
5958
isPolyType (Function args ret) = all isPolyType args && isPolyType ret
6059
isPolyType (TypeApp t1 t2) = isMonoType t1 && isMonoType t2

0 commit comments

Comments
 (0)