From efd5f75c0672773341b5ca1c1d4b2ad0c0d09daa Mon Sep 17 00:00:00 2001 From: Ohad Kammar Date: Sun, 7 Aug 2022 18:23:04 +0100 Subject: Initial version --- src/Data/Fun/Nary.idr | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/Data/Fun/Nary.idr (limited to 'src/Data/Fun') diff --git a/src/Data/Fun/Nary.idr b/src/Data/Fun/Nary.idr new file mode 100644 index 0000000..21a684b --- /dev/null +++ b/src/Data/Fun/Nary.idr @@ -0,0 +1,51 @@ +module Data.Fun.Nary + +import Data.Vect + +%default total + +public export +data Visibility = Visible | Hidden | Auto + +public export +Pi : Visibility -> (a : Type) -> (a -> Type) -> Type +Pi Visible a b = (x : a) -> b x +Pi Hidden a b = {x : a} -> b x +Pi Auto a b = {auto x : a} -> b x + +public export +lam : (vis : Visibility) -> (0 b : a -> Type) -> + ((x : a) -> b x) -> Pi vis a b +lam Visible b f = f +lam Hidden b f = f _ +lam Auto b f = f %search + +public export +app : (vis : Visibility) -> (0 b : a -> Type) -> + Pi vis a b -> ((x : a) -> b x) +app Visible b f x = f x +app Hidden b f x = f +app Auto b f x = f + +public export +PI : (n : Nat) -> Visibility -> (a : Type) -> (Vect n a -> Type) -> Type +PI Z vis a b = b [] +PI (S n) vis a b = Pi vis a (\ x => PI n vis a (b . (x ::))) + +public export +curry : (n : Nat) -> (vis : Visibility) -> + (0 b : Vect n a -> Type) -> + ((as : Vect n a) -> b as) -> + PI n vis a b +curry 0 vis b f = f [] +curry (S n) vis b f + = lam vis _ $ \ x => curry n vis (b . (x ::)) (\ xs => f (x :: xs)) + +public export +uncurry : (n : Nat) -> (vis : Visibility) -> + (0 b : Vect n a -> Type) -> + PI n vis a b -> + (as : Vect n a) -> b as +uncurry 0 vis b f [] = f +uncurry (S n) vis b f (x :: xs) + = uncurry n vis (b . (x ::)) (app vis _ f x) xs -- cgit v1.2.3