معمولا برای توضیح بهتر زبان های برنامه نویسی Functional (یا تابعی) آن را با زبان های برنامه نویسی Imperative (دستوری) مقایسه می کنند. تفاوت اصلی این دو سبک برنامه نویسی در نحوه بیان مراحل اجرای برنامه توسط برنامه نویس می باشد، در زبان های برنامه نویسی Imperative (مانند C) مراحل اجرای برنامه بصورت قدم به قدم توسط برنامه نویسی تشریح می شود و برنامه نویسی با آنها بسیار شبیه به برنامه ریزی روزانه زندگی است این در حالی است که در زبان های برنامه نویسی Functional مراحل اجرای برنامه در قالب ترکیب توابع و فراخواتی آنها توسط برنامه نویس بیان می شود.
علاوه بر نحوه بیان مراحل برنامه در قالب توابع، زبان های برنامه نویسی Functional خصوصیات دیگری نیز دارند:
-
Immutability: این زبان ها، برنامه نویسان را از نگه داشتن وضعیت ها در برنامه و داده های تغییرپذیر (mutable data) برحذر می دارند. این قانون در زبان های Functional معمولا به این طریق اعمال می گردد که مقدار یک متغییر پس از تعریف نمی تواند تغییر کند.
-
First-class functions: بر خلاف زبان های Imperative، در زبان های Functional توابع نوع داده ای اولیه هستند و این بدین معنی است که در زبان های Functional ما می توانیم از توابع بعنوان مقادیر (مانند متغییر ها در زبان های Imperative) استفاده کنیم و آنها را بعنوان پارامتر برای یک تابع دیگر ارسال کنیم و یا بعنوان مقدار بازگشتی یک تابع از آنها استفاده کنیم.
-
Recursion: در زبان های Imperative برای پردازش آرایه ها و لیست ها از حلقه استفاده می شود ولی در زبان های Functional بدلیل immutability استفاده از حلقه ها امکان پذیر نیست. استفاده از توابع بازگشتی ابزار زبان های Functional برای این منظور است.
-
Pure Functions: در زبان های Functional برای جلوگیری از side effect خروجی یک Pure Function به ازای ورودی های یکسان در تمامی مراحل اجرای برنامه یکسان است.
زبان های برنامه نویسی Functional خصوصیات دیگری نیز دارند که می توانید در این لینک مشاهده کنید.
نکته: توضیحات فوق درباره زبان های برنامه نویسی کاملا Functional بود (مانند Haskell و Erlang)، زبان های برنامه نویسی وجود دارند که کاملا Functional نیستند و اصطلاحا ترکیبی هستند (مانند Scala) بدین معنی که هم از سبک برنامه نویسی Functional پشتیبانی می کنند و هم سایر سبک ها (مانند شئ گرا).