I was experimenting with component-based game engine architectures for 2 years and eventually stumbled upon (OOP) viewpoint to why I think FRP helps to write more reusable code.
The argument for component-based game-engines usually starts like this: Game-objects should be represented like objects in reality but as the project progresses however, class hierarchies become more and more complex and thus should be split into small, reusable components.
Automatic communication is restricted to the known components and new functionality always has to be game-specific (either hard-coded, or in scripts, or any other data-driven method).
Even with components you define the player game-object specifically at some point: Player = Position Component Visual Component Input Component.
Do we implement a new Random Mover-component, or do we need a new component,… just to encapsulate the random function into a component?
And how does this fit into the automatic Position-Mover-communication?
For example, let the movement of a game-object by calculated by: the initial position some translation over time from user-input a random factor … You may then compose the movement behavior into more complex behaviors (or complete game-objects if you like) in every way you can imagine: A movable, static image game-object? Moving Animation = same translation function draw animation function. Static Animation = position draw animation function.