[web-devel] Database.Persistent

Felipe Almeida Lessa felipe.lessa at gmail.com
Fri May 6 05:50:13 CEST 2011


On Fri, May 6, 2011 at 12:31 AM, Greg Weber <greg at gregweber.info> wrote:
> 1) lazy IO, but don't hold a connection open- accessing a lazy field creates
> an entirely new request. This means a change in the type signature of the
> field accessor to be in IO.

I think lazy IO is out of question.  But I don't get this change in
the type signature.

> 2) A to be excluded field must be nullable, and excluding it will return a
> Nothing. Instead of a runtime failure, you get a runtime wtf? moment if you
> don't realize why your data is not being displayed.

How would you find out if it is Nothing because you didn't ask for it,
or if it's Nothing because it really is Nothing?  There must be
something to tell one situation from the other.  So I guess this is
not acceptable as well.

But a similar approach may be acceptable:

  Person
    name String
    photo ByteString

would become

  data Person = Person {name :: String, photo :: ByteString}

But then you could say

  Person
    name String
    photo ByteString Large

and then it would become

  data Person = Person {name :: String, photo :: Fetched ByteString}

where

  data Fetched a = NotFetched | Fetched !a

The good:
 - No combinatorial explosion.
 - No undefined values.

The bad:
 - Can't statically check that everything was fetched, for example,
when inserting.

Some variants:

a) Two data types

  data Person = Person {name :: String, photo :: ByteString}
  data PersonOpt = PersonOpt {nameOpt :: String, photoOpt :: Fetched ByteString}

b) GADTs

  data Person t = Person {name :: String, photo :: Fetched t ByteString}

  data Fetched t a where
    NotFetched :: Fetched Incomplete a
    Fetched :: a -> Fetched Complete a

  data Incomplete
  data Complete

Note that all names are terrible =(, but that's another bikeshed ;).

Cheers,

-- 
Felipe.



More information about the web-devel mailing list