Difference between revisions of "Context alias"

From HaskellWiki
Jump to navigation Jump to search
(additions of things to have in mind)
(Added section 'Equality constraints')
Line 28: Line 28:
   
 
context Eq a => Num a = (Additive a, Multiplicative a)
 
context Eq a => Num a = (Additive a, Multiplicative a)
  +
  +
==== Equality constraints ====
  +
  +
When <tt>{-# LANGUAGE TypeFamilies #-}</tt> is enabled, type contexts can include [[GHC/Type_families#Equality_constraints|equality constraints]] (<tt>t1 ~ t2</tt>).
  +
  +
It makes sense to also allow them in class aliases (context aliases)
   
 
==== Things to have in mind ====
 
==== Things to have in mind ====

Revision as of 07:46, 16 April 2009

Context aliases, also known as class aliases, are a long-requested feature of Haskell. This feature would allow class hierarchies to be restructured without breaking compatibility to a certain degree. Also, it would make fine-grained class hierarchies usable.

The proposal

The original class alias proposal

The original proposal can be found on a page on John Meachem’s website.

Improvements

“Context alias” instead of “class alias”

A “class alias” actually doesn’t stand for a class but for a context (or a part of a context). So it might be better to choose a slightly different syntax:

context Foobar a = (Foo a, Bar a)

Superclass constraints

John Meacham proposes the following syntax for class aliases (context aliases) with superclass constraints:

class alias Num a = Eq a => (Additive a, Multiplicative a)

This is not consistent with the superclass syntax of class declarations. I think, we should use this syntax:

class alias Eq a => Num a = (Additive a, Multiplicative a)

Or better:

context Eq a => Num a = (Additive a, Multiplicative a)

Equality constraints

When {-# LANGUAGE TypeFamilies #-} is enabled, type contexts can include equality constraints (t1 ~ t2).

It makes sense to also allow them in class aliases (context aliases)

Things to have in mind

In order to get the context alias extension well, we should have an eye on problems we might want to solve with the help of context aliases. Here are some:

  • MonadPlus should just be a combination of Alternative and Monad (actually, Alternative f should just be a combination of Applicative f and forall a. Monoid (f a))
  • Applicative should be a superclass of Monad

Implementation

Starting an implementation of context aliases is planned for the 5th Haskell Hackathon.