{-# OPTIONS --safe --without-K #-} module Lists where open import Agda.Primitive using (_⊔_) infixr 5 _∷_ data List {a} (A : Set a) : Set a where [] : List A _∷_ : A → List A → List A module _ {a b} {A : Set a} {B : Set b} where foldr : (A → B → B) → B → List A → B foldr f b [] = b foldr f b (x ∷ xs) = f x (foldr f b xs) foldl : (B → A → B) → B → List A → B foldl f b [] = b foldl f b (x ∷ xs) = foldl f (f b x) xs record IsList {a b} (A : Set a) (B : Set b) : Set (a ⊔ b) where field [_] : A → List B open IsList ⦃ ... ⦄ public instance nil : ∀ {a} {A : Set a} → IsList A A [_] ⦃ nil ⦄ = _∷ [] infixr 4 _,_ record Cons {a b} (A : Set a) (B : Set b) : Set (a ⊔ b) where constructor _,_ field head : A tail : B instance cons : ∀ {b} {B : Set b} {a} {A : Set a} → ⦃ _ : IsList A B ⦄ → IsList (Cons B A) B [_] ⦃ cons ⦄ (x , xs) = x ∷ [ xs ]