quox/examples/list.quox

42 lines
1.1 KiB
Plaintext
Raw Normal View History

2023-04-18 18:42:40 -04:00
load "nat.quox";
namespace list {
def0 Vec : → ★ → ★ =
2023-03-31 13:31:49 -04:00
λ n A ⇒
2023-05-21 14:33:42 -04:00
caseω n return ★ of {
2023-03-31 13:31:49 -04:00
zero ⇒ {nil};
succ _, 0.Tail ⇒ A × Tail
};
def0 List : ★ → ★ =
2023-03-31 13:31:49 -04:00
λ A ⇒ (len : ) × Vec len A;
2023-05-21 14:33:42 -04:00
def nil : 0.(A : ★) → List A =
2023-03-31 13:31:49 -04:00
λ A ⇒ (0, 'nil);
def cons : 0.(A : ★) → A → List A → List A =
λ A x xs ⇒ case xs return List A of { (len, elems) ⇒ (succ len, x, elems) };
2023-04-17 15:44:16 -04:00
2023-05-21 14:33:42 -04:00
def foldr' : 0.(A B : ★) →
B → ω.(A → B → B) → (n : ) → Vec n A → B =
2023-04-17 15:44:16 -04:00
λ A B z c n ⇒
case n return n' ⇒ Vec n' A → B of {
zero ⇒
λ nil ⇒ case nil return B of { 'nil ⇒ z };
succ n, 1.ih ⇒
λ cons ⇒ case cons return B of { (first, rest) ⇒ c first (ih rest) }
};
def foldr : 0.(A B : ★) → B → ω.(A → B → B) → List A → B =
2023-04-17 15:44:16 -04:00
λ A B z c xs ⇒
case xs return B of { (len, elems) ⇒ foldr' A B z c len elems };
2023-03-31 13:31:49 -04:00
def sum : List = foldr 0 nat.plus;
2023-03-31 13:31:49 -04:00
2023-04-18 18:42:40 -04:00
def numbers : List = (5, (0, 1, 2, 3, 4, 'nil));
2023-03-31 13:31:49 -04:00
2023-04-17 15:44:16 -04:00
def number-sum : sum numbers ≡ 10 : = δ _ ⇒ 10;
2023-04-18 18:42:40 -04:00
}