
On Tue, Feb 10, 2015 at 05:29:55PM +0300, Nikita Karetnikov wrote:
User name UserName email UserEmail v Maybe last_login UserLastLogin
where
data Verified data Unverified newtype UserEmail v = UserEmail Text deriving (Show, Read) derivePersistField "UserEmail"
I think you want the verification status to exist at the value level as well as the type level. What you currently have is essentially the same as defining your table to be [(UserName, Maybe (UserEmail v), UserLastLogin)] where I guess you're assuming the `v` will be existentially quantified. Presumably this isn't actually what you want. You could however have (the database version of) [(UserName, Maybe UserEmail, UserLastLogin)] and something like (the database version of) UserEmail -> Maybe UserEmailVerified UserEmail -> Maybe UserEmailUnverified which would give you the type safety you're looking for, I think. Opaleye supports user-created types for this kind of purpose, and I've found it invaluable. Tom