Tony Morris | 14 Aug 01:38 2012
Picon

Flipping type constructors

I have a data-type that is similar to EitherT, however, I have ordered
the type variables like so:

data EitherT (f :: * -> *) (a :: *) (b :: *) = ...

This allows me to declare some desirable instances:

instance Functor f => Bifunctor (EitherT f)
instance Foldable f => Bifoldable (EitherT f)
instance Traversable f => Bitraversable (EitherT f)

However, I am unable to declare a MonadTrans instance:

instance MonadTrans (EitherT a) -- kind error

I looked at Control.Compose.Flip to resolve this, but it does not appear
to be kind-polymorphic.
http://hackage.haskell.org/packages/archive/TypeCompose/0.9.1/doc/html/src/Control-Compose.html#Flip

I was wondering if there are any well-developed techniques to deal with
this? Of course, I could just write my own Flip with the appropriate
kinds and be done with it. Maybe there is a more suitable way?

--

-- 
Tony Morris
http://tmorris.net/
Ryan Ingram | 20 Aug 23:33 2012
Picon

Re: Flipping type constructors

It seems really hard to solve this, since the type checker works before instance selection has had a chance to do anything.

Instead of looking at the instance declaration, look at the use site:

   lift x

expects the argument to have type

   x :: t m a

for some t :: (* -> *) -> * -> *, m :: * -> *, and a :: *; it's not until t is known that we can do instance selection, and in your case, EitherT M A B doesn't have the required form and so is a type error already.

I think the best answer is sadly to just have to have a (kind-polymorphic!) newtype flip and deal with it.

I can imagine there being some way to (ab)use kind polymorphism to redefine MonadTrans in a way that allows the 'm' argument to appear in more places in the target type, but I'm not clever enough to come up with a proposal for how to do so.

  -- ryan


On Mon, Aug 13, 2012 at 4:38 PM, Tony Morris <tonymorris <at> gmail.com> wrote:
I have a data-type that is similar to EitherT, however, I have ordered
the type variables like so:

data EitherT (f :: * -> *) (a :: *) (b :: *) = ...

This allows me to declare some desirable instances:

instance Functor f => Bifunctor (EitherT f)
instance Foldable f => Bifoldable (EitherT f)
instance Traversable f => Bitraversable (EitherT f)

However, I am unable to declare a MonadTrans instance:

instance MonadTrans (EitherT a) -- kind error

I looked at Control.Compose.Flip to resolve this, but it does not appear
to be kind-polymorphic.
http://hackage.haskell.org/packages/archive/TypeCompose/0.9.1/doc/html/src/Control-Compose.html#Flip

I was wondering if there are any well-developed techniques to deal with
this? Of course, I could just write my own Flip with the appropriate
kinds and be done with it. Maybe there is a more suitable way?


--
Tony Morris
http://tmorris.net/



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe <at> haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe <at> haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
Erik Hesselink | 18 Aug 22:13 2012
Picon

Re: Flipping type constructors

The next version of GHC will have an extension for kind polymorphism.
I'm not sure if it has to be enabled in the module that defines flip
or in the module that uses it, but it might help.

Erik

On Tue, Aug 14, 2012 at 1:38 AM, Tony Morris <tonymorris <at> gmail.com> wrote:
> I have a data-type that is similar to EitherT, however, I have ordered
> the type variables like so:
>
> data EitherT (f :: * -> *) (a :: *) (b :: *) = ...
>
> This allows me to declare some desirable instances:
>
> instance Functor f => Bifunctor (EitherT f)
> instance Foldable f => Bifoldable (EitherT f)
> instance Traversable f => Bitraversable (EitherT f)
>
> However, I am unable to declare a MonadTrans instance:
>
> instance MonadTrans (EitherT a) -- kind error
>
> I looked at Control.Compose.Flip to resolve this, but it does not appear
> to be kind-polymorphic.
> http://hackage.haskell.org/packages/archive/TypeCompose/0.9.1/doc/html/src/Control-Compose.html#Flip
>
> I was wondering if there are any well-developed techniques to deal with
> this? Of course, I could just write my own Flip with the appropriate
> kinds and be done with it. Maybe there is a more suitable way?
>
>
> --
> Tony Morris
> http://tmorris.net/
>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe <at> haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

Gmane