А что, если функция двух переменных? А такие вообще бывают? Ответ простой: нет, не бывают. Ладно-ладно, шучу. Бывают, просто они, как луковица, завёрнуты в оболочки, а такой концепт называется каррированием в честь Хаскелла Карри. Да, это тот самый Haskell Curry, в честь которого назван и язык Haskell.
(1.9)
Формально это изоморфизм, то есть биекция между двумя множествами функций.
(1.10)
В формуле слева — функции из пары в , справа — функции из в функции из в . Каждой функции двух аргументов отвечает ровно одна каррированная по правилу , и наоборот — . Эти два перехода взаимно обратны, ничего не теряя и не добавляя, поэтому оба множества функций попросту неразличимы.
Несколько примеров из Haskell:
-- тип функции нескольких аргументов — правоассоциативная цепочка стрелок
f :: a -> b -> c -- то же самое, что a -> (b -> c)
-- частичное применение: add 2 — «недоданная» функция
add :: Int -> Int -> Int
add x y = x + y
add2 :: Int -> Int
add2 = add 2
map add2 [1, 2, 3] -- [3, 4, 5]
-- переходники curry и uncurry — свидетели изоморфизма
curry :: ((a, b) -> c) -> a -> b -> c
uncurry :: (a -> b -> c) -> (a, b) -> c
-- сечения операторов — то же частичное применение
(+3) :: Num a => a -> a
(*2) :: Num a => a -> a