That's a display, read, react loop. Yes, it's imperative, but this loop is always imperative. Get a FRP GUI toolkit in Haskell and you'll see that loop there, imperative.
The difference between functional and imperative code is there existing more than one such loop available at the same time, and in how your functions are implemented.
The difference between functional and imperative code is there existing more than one such loop available at the same time, and in how your functions are implemented.