[Haskell-cafe] Re: functional database queries

Bjorn Bringert 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;  
>>>> 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

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.

/Björn


More information about the Haskell-Cafe mailing list