Но частичное применения != частичное применение по месту вызова. Это просто "паттерн". Поэтому частично применить функцию, завернув в новую, которая подставит нужные параметры, можно и в C - технически. Но польза будет сомнительна :)
Каррирование - более фундаментальная штука. И чтобы каррирование не мешало работе, нужен синтаксис соответствующий. У ML-языков неспроса нет скобок вокруг аргументов - именно для того, чтобы каррированные функции было не слишком больно использовать
Частичное применение с достаточной синтаксической поддержкой тоже помогает ФВП даже в некаррирующих языках. Кложа с тамошним #(% * 2) вполне живет и без каррировани - там другие пробелемы, но хоть ФВП нормально можно пользовать
Pattern Matching очень удобен, но только в языках с ADT, т.к. только в них можно проверить exhaustiveness. В языках без ADT толку от сопоставления с образцом мало