erasure improvements

This commit is contained in:
2025-02-02 16:33:37 -08:00
parent c83632881d
commit 9586ca96bb
7 changed files with 31 additions and 26 deletions

View File

@@ -114,15 +114,16 @@ join mma = mma >>= id
-- Equality
infixl 1 _≡_
data _≡_ : {A : U} -> A -> A -> U where
Refl : {A : U} -> {a : A} -> a a
data _≡_ : {0 A : U} -> A -> A -> U where
Refl : {0 A : U} -> {a : A} -> a a
replace : {A : U} {a b : A} -> (P : A -> U) -> a b -> P a -> P b
replace : {0 A : U} {0 a b : A} -> (P : A -> U) -> a b -> P a -> P b
replace p Refl x = x
cong : {A B : U} {a b : A} -> (f : A -> B) -> a b -> f a f b
cong : {0 A B : U} {0 a b : A} -> (f : A -> B) -> a b -> f a f b
cong f Refl = Refl
sym : {A : U} -> {a b : A} -> a b -> b a
sym : {0 A : U} -> {0 a b : A} -> a b -> b a
sym Refl = Refl
@@ -130,10 +131,10 @@ sym Refl = Refl
-- Functor
class Functor (m : U U) where
map : {0 a b} (a b) m a m b
map : a b. (a b) m a m b
infixr 4 _<$>_ _<$_
_<$>_ : {0 f} {{Functor f}} {0 a b} (a b) f a f b
_<$>_ : f. {{Functor f}} {0 a b} (a b) f a f b
f <$> ma = map f ma
_<$_ : f a b. {{Functor f}} b f a f b
@@ -167,8 +168,8 @@ instance Functor SnocList where
infixl 3 _<*>_ _<*_ _*>_
class Applicative (f : U U) where
-- appIsFunctor : Functor f
return : {0 a} a f a
_<*>_ : {0 a b} -> f (a b) f a f b
return : a. a f a
_<*>_ : a b. f (a b) f a f b
_<*_ : f a b. {{Applicative f}} f a f b f a
@@ -188,10 +189,12 @@ instance Traversable List where
traverse_ : t f a b. {{Traversable t}} {{Applicative f}} (a f b) t a f Unit
traverse_ f xs = return (const MkUnit) <*> traverse f xs
for : {t : U U} {f : U U} {{Traversable t}} {{appf : Applicative f}} {a : U} {b : U} t a (a f b) f (t b)
-- FIXME - there is something subtly wrong in erasure here. t gets applied and there is no warning about it.
-- maybe we don't check the head of an application?
for : {0 t : U U} {0 f : U U} {{Traversable t}} {{appf : Applicative f}} {0 a : U} {0 b : U} t a (a f b) f (t b)
for stuff fun = traverse fun stuff
for_ : {t : U U} {f : U U} {{Traversable t}} {{appf : Applicative f}} {a : U} {b : U} t a (a f b) f Unit
for_ : {0 t : U U} {0 f : U U} {{Traversable t}} {{appf : Applicative f}} {0 a : U} {0 b : U} t a (a f b) f Unit
for_ stuff fun = return (const MkUnit) <*> traverse fun stuff
instance Applicative Maybe where