Portability | non-portable |
---|---|
Stability | experimental |
Maintainer | leather@cs.uu.nl |
Safe Haskell | Safe-Inferred |
This module defines an extensible, type-indexed function for showing
well-typed values with a format descriptor. This may be considered a Haskell
variant of the C printf
function.
If you are primarily interested in using this library, you will want to see
showsf
and showf
, the more user-friendly functions.
If you are also interested in extending this library with your own format
descriptors, you should read about the Format
class.
- class Functor f => Format d f | d -> f where
- class Functor f => Apply f a b | f a -> b where
- apply :: f a -> b
- showsf :: (Format d f, Apply f ShowS a) => d -> a
- showf :: (Format d f, Apply f String a) => d -> a
- data CharF = Char
- data IntF = Int
- data IntegerF = Integer
- data FloatF = Float
- data DoubleF = Double
- data StringF = String
- data ShowF a = Show
- data NumF a = Num
- data a :%: b = a :%: b
- (%) :: a -> b -> a :%: b
- data WrapF inner outer = Wrap outer inner outer
- data AlignF a = Align Dir Int a
- data AlignChopF a = AlignChop Dir Int a
- data Dir
- data SpacesF = Spaces Int
- newtype Id a = Id a
- newtype Arr a b = Arr (a -> b)
- newtype (f :.: g) a = Comp (f (g a))
- (<>) :: (Functor f, Functor g) => f (b -> c) -> g (a -> b) -> :.: f g (a -> c)
The Classes
class Functor f => Format d f | d -> f whereSource
This class provides the signature for an extensible, type-indexed function
that uses a format descriptor to print a variable number of well-typed
arguments to a string. The type variable d
is the format descriptor, and
the Functor
variable f
determines the type of the value to be shown.
An instance of Format
adds a (type) case to the function. Before defining
an instance, you must first define a format descriptor for your specific type
and expected input. The descriptor is often very simple. See the descriptors
in this module for examples.
Here is the instance for types that are instances of Show
.
dataShowF
a =Show
-- Format descriptor
instance (Show
a) => Format (ShowF
a) (Arr
a) whereshowsf'
Show
=Arr
shows
The Arr
type is one of several Functor
wrappers necessary for defining
these instances.
Format Char Id | Print the enclosed |
Format String Id | Print the enclosed |
Format SpacesF Id | |
Format DoubleF (Arr Double) | |
Format FloatF (Arr Float) | |
Format IntegerF (Arr Integer) | |
Format IntF (Arr Int) | |
Format StringF (Arr String) | |
Format CharF (Arr Char) | |
Format d f => Format (AlignChopF d) f | |
Format d f => Format (AlignF d) f | |
(Num a, Show a) => Format (NumF a) (Arr a) | |
Show a => Format (ShowF a) (Arr a) | |
(Format d1 f1, Format d2 f2) => Format (d1, d2) (:.: f1 f2) | |
(Format din fin, Format dout fout) => Format (WrapF din dout) (:.: fout (:.: fin fout)) | |
(Format d1 f1, Format d2 f2) => Format (:%: d1 d2) (:.: f1 f2) | |
(Format d1 f1, Format d2 f2, Format d3 f3) => Format (d1, d2, d3) (:.: f1 (:.: f2 f3)) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4) => Format (d1, d2, d3, d4) (:.: f1 (:.: f2 (:.: f3 f4))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5) => Format (d1, d2, d3, d4, d5) (:.: f1 (:.: f2 (:.: f3 (:.: f4 f5)))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6) => Format (d1, d2, d3, d4, d5, d6) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 f6))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7) => Format (d1, d2, d3, d4, d5, d6, d7) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 f7)))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8) => Format (d1, d2, d3, d4, d5, d6, d7, d8) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 f8))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 f9)))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 f10))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 f11)))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11, Format d12 f12) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 (:.: f11 f12))))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11, Format d12 f12, Format d13 f13) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 (:.: f11 (:.: f12 f13)))))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11, Format d12 f12, Format d13 f13, Format d14 f14) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 (:.: f11 (:.: f12 (:.: f13 f14))))))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11, Format d12 f12, Format d13 f13, Format d14 f14, Format d15 f15) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 (:.: f11 (:.: f12 (:.: f13 (:.: f14 f15)))))))))))))) |
The Functions
Format Descriptors
These are used to indicate which values and types to show.
Basic Format Descriptors
Class-based Format Descriptors
Print an argument whose type is an instance of the class Show
.
Print an argument whose type is an instance of the class Num
.
Recursive Format Descriptors
Right-associative pair. First print a a
-type format and then a b
-type
format.
a :%: b |
(%) :: a -> b -> a :%: bSource
Right-associative pair. This is a shorter, functional equivalent to the
type (:%:)
.
Print a format of one type wrapped by two other formats of a different type.
Wrap outer inner outer |
Print a format aligned left or right within a column of the given width.
data AlignChopF a Source
Same as AlignF
but chop off the output if it extends past the column
width.
Format d f => Format (AlignChopF d) f |
Other Format Descriptors
Utilities for Defining Instances
Wrapper for a format constant that does not take any arguments. Used in
instance
for example.
Format
String
Id
Id a |
Wrapper for a format descriptor that takes an argument. Used in instance
(
for example.
Show
a) => Format
(ShowF
a) (Arr a)
Arr (a -> b) |
Wrapper for a format descriptor that composes two descriptors. Used in
instance (
for example.
Format
d1 f1, Format
d2 f2) => Format
(d1 :%: d2) (f1 :.:
f2)
Comp (f (g a)) |
(Functor f, Functor g) => Functor (:.: f g) | |
(Apply f b c, Apply g a b) => Apply (:.: f g) a c | |
(Format d1 f1, Format d2 f2) => Format (d1, d2) (:.: f1 f2) | |
(Format din fin, Format dout fout) => Format (WrapF din dout) (:.: fout (:.: fin fout)) | |
(Format d1 f1, Format d2 f2) => Format (:%: d1 d2) (:.: f1 f2) | |
(Format d1 f1, Format d2 f2, Format d3 f3) => Format (d1, d2, d3) (:.: f1 (:.: f2 f3)) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4) => Format (d1, d2, d3, d4) (:.: f1 (:.: f2 (:.: f3 f4))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5) => Format (d1, d2, d3, d4, d5) (:.: f1 (:.: f2 (:.: f3 (:.: f4 f5)))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6) => Format (d1, d2, d3, d4, d5, d6) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 f6))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7) => Format (d1, d2, d3, d4, d5, d6, d7) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 f7)))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8) => Format (d1, d2, d3, d4, d5, d6, d7, d8) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 f8))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 f9)))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 f10))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 f11)))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11, Format d12 f12) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 (:.: f11 f12))))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11, Format d12 f12, Format d13 f13) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 (:.: f11 (:.: f12 f13)))))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11, Format d12 f12, Format d13 f13, Format d14 f14) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 (:.: f11 (:.: f12 (:.: f13 f14))))))))))))) | |
(Format d1 f1, Format d2 f2, Format d3 f3, Format d4 f4, Format d5 f5, Format d6 f6, Format d7 f7, Format d8 f8, Format d9 f9, Format d10 f10, Format d11 f11, Format d12 f12, Format d13 f13, Format d14 f14, Format d15 f15) => Format (d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15) (:.: f1 (:.: f2 (:.: f3 (:.: f4 (:.: f5 (:.: f6 (:.: f7 (:.: f8 (:.: f9 (:.: f10 (:.: f11 (:.: f12 (:.: f13 (:.: f14 f15)))))))))))))) |