
On Tue, Feb 27, 2018 at 02:53:33PM +0000, Brian Hurt wrote:
I'm looking for pointers on how to do something. What I'm trying to do: I want to define a newtype wrapper for database connections with a phantom type to control whether the connection is read-only or read-write. So I have:
newtype Conn a = Conn { unConn :: Connection }
data ReadOnly = ReadOnly
data ReadWrite = ReadWrite
-- Simplifying here openConn :: MonadIO m => a -> Conn a
query :: (MonadIO m, ToRow r, FromRow s) => Conn a -> Query -> r -> m [s]
execute :: (MonadIO m, ToRow r) => Conn a -> Query -> r -> m Int64
But I want to be able to restrict the type a to be either ReadOnly or ReadWrite. Solutions I've come up with so far are: [...] Are their alternatives I haven't considered yet?
Have you considered {-# LANGUAGE DataKinds #-} data Read = ReadOnly | ReadWrite ?