open import Agda.Builtin.Nat using (Nat; _+_)
data Either (A B : Set) : Set where
Left : A → Either A B
Right : B → Either A B
fromEitherAB : ∀ {A B : Set} → A → Either A B → A
fromEitherAB _ (Left a) = a
fromEitherAB defA (Right _) = defA
fromEither : ∀ {A : Set} → A → ∀ {B : Set} → Either A B → A
fromEither _ (Left a) = a
fromEither defA (Right _) = defA
data OnlyLeft (A B : Set) : Set where
Left : A → OnlyLeft A B
private variable A B C : Set
fromOnlyLeft : OnlyLeft A B → A
fromOnlyLeft (Left a) = a
fromOnlyLeft2 : OnlyLeft (OnlyLeft A B) C → A
fromOnlyLeft2 (Left (Left a)) = a
record OnlyLeftR (A B : Set) : Set where
field left : A
open OnlyLeftR public
fromOnlyLeftR : OnlyLeftR A B → A
fromOnlyLeftR r = r .left
fromOnlyLeftR2 : OnlyLeftR (OnlyLeftR A B) C → A
fromOnlyLeftR2 r = r .left .left
open import Agda.Builtin.Nat
test : Nat
test = fromEitherAB {B = Nat} 42 (Left 0)
+ fromEither 0 {B = Nat} (Right 42)
+ fromOnlyLeft {B = Nat} (Left 0)
+ fromOnlyLeft2 {B = Nat} {C = Nat} (Left (Left 0))
+ fromOnlyLeftR2 {B = Nat} {C = Nat} (record { left = record { left = 42 } })
{-# COMPILE AGDA2LAMBOX test #-}
Debug λ☐ Rocq ↪
WASM C OCaml CakeML Rust Elm