Термин "ортогональный" пришел из математики, где у него есть синоним: "перпендикулярный". В данном контексте его можно понимать как "две вещи не имеют ничего общего друг с другом".
Когда люди сравнивают FP и OO, они часто путают две отдельные оси.
С одной стороны, у вас есть функциональное программирование против императивного программирования. Джонас дает хорошее сравнение этих двух видов программирования. В одном предложении это звучит так: "поток данных против потока управления".
Другая ось - это абстракция данных. Такие языки, как Haskell, используют абстрактные типы данных, чтобы, ну, абстрагировать данные. Smalltalk использует объекты, которые объединяют данные и операции над ними в единое целое. Уильям Кук объясняет лучше, чем я, в своей статье On Understanding Data Abstraction, Revisited .
Совершенно понятно, что большинство людей считают FP и OO противоположностями: большинство OO-языков императивны, поэтому если сравнивать, скажем, Haskell и Java, то получится поток данных + ADT против потока управления + объект. Но есть и другие возможности! Матиас Феллейзен объясняет, как счастливо поженить FP и OO в своем докладе Functional Objects.
Прикрепляю к посту несколько видео по теме: