Albert Y. C. Lai wrote:
apfelmus@quantentunnel.de wrote:
Albert Y. C. Lai wrote:
If and only if the database is a purely functional immutable data structure, this can be done. [...] Many interesting databases are not purely functional immutable; most reside in the external world and can spontaneously change behind your program's back.
I don't think this is the problem because SQL requests are emitted atomically anyway. The (Query a) monad here has nothing to do with mutability of the data base.
The same clock read twice, each reading atomic, can give two different results. (Cf. the monadic type signature of Data.Time.Clock.getCurrentTime.)
The same SELECT to the same database issued twice, each time atomic, can give two different results.
Yeah, of course. That's why the function that executes the query is in the IO-monad: query :: GetRec er vr => Database -> Query (Rel er) -> IO [Record vr] Hennings' question is whether the query type 'Query (Rel el)' really has to be a monad, not whether the function 'query' has to be in the IO-monad. In other words, 'Query a' just assembles a valid SQL-string, it does not query or execute anything. Regards, apfelmus