Type-level operators
Stefan Holdermans
stefan at vectorfabrics.com
Wed Apr 20 15:35:43 CEST 2011
Simon,
Regarding the note you attached to the Trac ticket on the pretty-printing of kind ascriptions (http://hackage.haskell.org/trac/ghc/ticket/5141#comment:2):
> Note, though, that it's likely that we're considering making operators
> like '*' into type ''constructors'' rather that type ''variables'. This
> is inconsitent with terms, but is jolly convenient:
> {{{
> data a + b = Left a | Right b
> }}}
> Of course there'll be a flag. But let us know if you think that having
> operators be type variables is very useful. (I tend to think it's more
> confusing than useful.)
I myself am perfectly alright with being "forced" to write
{{{
data a :+: b = Left a | Right b
}}}
Although I don't have a *convincing* example of the usefulness of operators as type variables, I like the idea of consistency with the term level: IMO it keeps things predictable.
And even as it may not qualify as convincing, I do remember having written code similar to
{{{
data (f :+: g) a = Inl (f a) | Inr (g a)
data (f :*: g) a = f a :*: g a
class FunctorOp ((&) :: (* -> *) -> (* -> *) -> (* -> *)) where ...
instance FunctorOp (:+:) where ...
instance FunctorOp (:*:) where ...
class FunctorOp (&) => CommOp (&) where comm :: f & g -> g & f
instance CommOp (:+:) where ...
instance CommOp (:*:) where ...
f :: (CommOp (&), Functor f, Functor g) -> f & g -> ...
f ... = ...
}}}
All this, of course, just to put in my tuppence worth.
Cheers,
Stefan
More information about the Glasgow-haskell-users
mailing list