The Quipper System

Safe HaskellNone

Libraries.Tuple

Description

This module provides isomorphisms between n-tuples and repeated pairs. It is used to be able to write type classes for n-tuples more generically. Essentially we want to be able to write code for 17-tuples once and for all, rather than once for each type class we define. Ideally there would be a standard Haskell library for this.

Two type classes are provided: Tuple, and TupleOrUnary. Tuple is recommended for most uses.

Synopsis

Documentation

class TupleOrUnary t s | s -> t whereSource

This type class relates types of the form t = (a,b,c,d) (“tupled form”) to types of the form s = (a,(b,(c,(d,())))) (“standard form”), and provides a way to convert between the two representations.

The tupled form can always be deduced from the standard form.

Methods

weak_tuple :: s -> tSource

For example, maps (a,(b,(c,(d,())))) to (a,b,c,d).

weak_untuple :: t -> sSource

For example, maps (a,b,c,d) to (a,(b,(c,(d,())))).

Instances

TupleOrUnary () () 
TupleOrUnary a (a, ()) 
TupleOrUnary (a, b) (a, (b, ())) 
TupleOrUnary (a, b, c) (a, (b, (c, ()))) 
TupleOrUnary (a, b, c, d) (a, (b, (c, (d, ())))) 
TupleOrUnary (a, b, c, d, e) (a, (b, (c, (d, (e, ()))))) 
TupleOrUnary (a, b, c, d, e, f) (a, (b, (c, (d, (e, (f, ())))))) 
TupleOrUnary (a, b, c, d, e, f, g) (a, (b, (c, (d, (e, (f, (g, ()))))))) 
TupleOrUnary (a, b, c, d, e, f, g, h) (a, (b, (c, (d, (e, (f, (g, (h, ())))))))) 
TupleOrUnary (a, b, c, d, e, f, g, h, i) (a, (b, (c, (d, (e, (f, (g, (h, (i, ()))))))))) 
TupleOrUnary (a, b, c, d, e, f, g, h, i, j) (a, (b, (c, (d, (e, (f, (g, (h, (i, (j, ())))))))))) 

class TupleOrUnary t s => Tuple t s | s -> t, t -> s whereSource

In almost all instances, the standard form can also be deduced from the tupled form; the only exception is the unary case. The Tuple class includes no new methods, adding just this functional dependency.

While the methods of Tuple are always copied from those of TupleOrUnary, they are renamed, so that use of these methods tells the type checker it can use the extra functional dependency.

Methods

tuple :: s -> tSource

untuple :: t -> sSource

Instances

Tuple () () 
Tuple (a, b) (a, (b, ())) 
Tuple (a, b, c) (a, (b, (c, ()))) 
Tuple (a, b, c, d) (a, (b, (c, (d, ())))) 
Tuple (a, b, c, d, e) (a, (b, (c, (d, (e, ()))))) 
Tuple (a, b, c, d, e, f) (a, (b, (c, (d, (e, (f, ())))))) 
Tuple (a, b, c, d, e, f, g) (a, (b, (c, (d, (e, (f, (g, ()))))))) 
Tuple (a, b, c, d, e, f, g, h) (a, (b, (c, (d, (e, (f, (g, (h, ())))))))) 
Tuple (a, b, c, d, e, f, g, h, i) (a, (b, (c, (d, (e, (f, (g, (h, (i, ()))))))))) 
Tuple (a, b, c, d, e, f, g, h, i, j) (a, (b, (c, (d, (e, (f, (g, (h, (i, (j, ()))))))))))