Semantically, FRP's concurrency is fine-grained, determinate, and continuous.
Dynamic/evolving values (i.e., values "over time") are first class values in themselves. You can define them and combine them, pass them into & out of functions. I called these things "behaviors".
In software design, I always ask the same question: "what does it mean?".
It's been quite a challenge to implement this model correctly and efficiently, but that's another story.
The basic idea behind reactive programming is that there are certain datatypes that represent a value "over time". Computations that involve these changing-over-time values will themselves have values that change over time.