
Hi Román,
Why not just pass Address to deliverPackage and Email to sendEmail,
instead of passing a user? That way each function gets exactly the
information it needs, and there's no need to muck with GADTs and
DataKinds.
Erik
On Thu, Jun 11, 2015 at 6:54 PM, Román González
Hello there,
I've been thinking on different approaches to constraint particular functions to a particular constructor of an ADT in order to reduce representation of invalid states. Say for example I've this types:
data Address = Address { ... } newtype Email = Email String data Package = Package { ... } data EmailMsg = EmailMsg { ... }
data User = RealUser Address | VirtualUser Email
And I would like to implement two functions:
deliverPackage :: User -> Package -> IO Bool sendEmail :: User -> EmailMsg -> IO ()
I would like to constraint both deliverPackage and sendEmail to receive only the semantically correct constructor of User.
I know of an approach I could use, that is wrapping each constructor in it's own newtype, and create some smart constructor that way, that approach works, but I find it rather verbose.
Is there any other well known approach to deal with this scenarios?
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe