The MFlow app server can express routes within normal Haskell monadic code. The FlowM monad backtrack and goes forward to track the URL of any page within the monadic flow.
To make a web application program more close to a plain console application, I created runNavigation, that get the port from the first execution parameter. If not, it read it from the PORT environment variable. If it does not exist, it uses the por 80.
runNavigation executes a persistent navigation (whose state is logged and later recovered when the process has a timeout). If the flow is not persistent, it must be prefixed with transientNav.
The result is a more close visualization of what the FlowM monad is: a navigation monad.
This example has two routes (letters and numbers). Each one has a simple succession of pages. The user can navigate forward and backward, introduce any url and the program will track the code of he page to be executed and generated.