Module FunNotation.
Notation "f $ x" := (f x)
(at level 99, x at level 99, right associativity, only parsing).
Notation "'begin' e1 'end'" := ((e1))
(at level 0, only parsing).
End FunNotation.
Definition compose A B C (g:B -> C) (f:A -> B) (x:A) : C := g (f x).
Definition uncurry A B C (f:A -> B -> C) (x:A * B) : C := let (a,b) := x in f a b.
Definition curry  {A B C} (f : A * B -> C) (a : A) (b : B) : C := f (a, b).

Lemma curry_uncurry : forall A B C (f : A * B -> C) ab,
uncurry (curry f) ab = f ab.