オブジェクト指向プログラミングでは、略してOOPでは、オブジェクトを使用してメソッドを呼び出すことでプログラムを作成します。

`form.submit（）`

たとえば、GUIプログラミングに最適であり、一般に、ボタンを押してエレベーターを呼び出したり、照らしたり印刷したりできる物理世界に近いアプローチです。
オブジェクトには内部状態があり、パブリックインターフェイスを公開します。一部の内部不変剤が常に尊重されていることを確認し、ユーザーから複雑さを隠すことは非常に便利です。
しかし、状態変異が意図しない副作用を生成するのは簡単です。

機能的なプログラミングは、それに適用されるロジックからよりきれいなデータを分離します。

`レポート= data.filter（is_valid）.map（to_report）.reduce（to_csv）`

コンポーネントとコンビネーターを混合できるパイプラインに最適ですが、一般的に最適化するのは簡単ではなく、ほとんどのプログラマにとっては馴染みがありません。
In Object Oriented Programming, OOP for short, you make programs by using objects and calling their methods:

`form.submit()`

It is a great fit for GUI programming for example, and generally a approach closer to the physical world where you can push buttons to call an elevator, light up or print something.
Objects have an internal state and expose a public interface. It is very convenient to make sure that some internal invariants are always respected and to hide some complexity from users.
But it is easy for state mutations to generate unintended side effects.

Functional programming separate more cleanly data from logic applied to it, which prevent unintended side effects and can often compose more easily:

`reports = data.filter(is_valid).map(to_report).reduce(to_csv)`

It's a great fit for pipelines where components and combinators can be mixed together but it's generally less easy to optimize and less familiar for most programmers.