def curry[A, B, C, D](f: (A, B, C) => D): A => B => C => D = ???
def uncurry[A, B, C, D](f: A => B => C => D): (A, B, C) => D = ???
def compose[A, B, C, D](f: A => B, g: B => C, h: C => D): A => D = ???
def curry[A, B, C, D](f: (A, B, C) => D): A => B => C => D = {
a => b => c => f(a, b, c)
}
def uncurry[A, B, C, D](f: A => B => C => D): (A, B, C) => D = {
(a, b, c) => f(a)(b)(c)
}
def compose[A, B, C, D](f: A => B, g: B => C, h: C => D): A => D = {
compose(compose(f, g), h)
}