[Haskell-cafe] Re: functional database queries
bringert at cs.chalmers.se
Wed Feb 21 18:58:42 EST 2007
On Feb 21, 2007, at 20:47 , apfelmus at quantentunnel.de wrote:
> Albert Y. C. Lai wrote:
>> apfelmus at 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;
>>>> reside in the external world and can spontaneously change behind
>>>> 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
>> results. (Cf. the monadic type signature of
>> 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.
This is correct, the Query monad is just used to construct the query.
Running the query is done in IO.
If we look in the source code (http://darcs.haskell.org/haskelldb/src/
Database/HaskellDB/Query.hs), we see that the Query monad is a state
monad, whose state is the current query and an Int used to generate
fresh field names. It would certainly possible to do this without a
monad, though it would probably require reworking the PrimQuery type.
More information about the Haskell-Cafe