summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorYale AI Dept <ai@nebula.cs.yale.edu>1993-07-14 13:08:00 -0500
committerDuncan McGreggor <duncan.mcgreggor@rackspace.com>1993-07-14 13:08:00 -0500
commit4e987026148fe65c323afbc93cd560c07bf06b3f (patch)
tree26ae54177389edcbe453d25a00c38c2774e8b7d4 /doc
Import to github.
Diffstat (limited to 'doc')
-rw-r--r--doc/announcement64
-rw-r--r--doc/comparison291
-rw-r--r--doc/lisp-interface/lisp-interface.dvibin0 -> 23156 bytes
-rw-r--r--doc/manual/haskell.dvibin0 -> 68832 bytes
-rw-r--r--doc/optimizer/optimizer.dvibin0 -> 25624 bytes
-rw-r--r--doc/tutorial/tutorial.ps6257
-rw-r--r--doc/xinterface/xman.dvibin0 -> 13076 bytes
7 files changed, 6612 insertions, 0 deletions
diff --git a/doc/announcement b/doc/announcement
new file mode 100644
index 0000000..8c9e8f1
--- /dev/null
+++ b/doc/announcement
@@ -0,0 +1,64 @@
+
+ Announcing the release of Yale Haskell 2.0.5
+
+We are releasing the latest version of the Yale Haskell system,
+Y2.0.5, in source form. This fixes a number of minor problems in the
+2.0.5a release (for Sparc only) and should be relatively bug free.
+
+Yale Haskell can be built from sources using CMU Common Lisp, Lucid
+Common Lisp, Allegro Common Lisp, or Harlequin LispWorks. The system
+may also build on akcl but the performance is very poor.
+
+Compiled versions of the system are available for Sparc systems running
+SunOS 4.1.2 and Sparc 10's (sun4m) running 4.1.3. Anyone building a system
+using CMU lisp on a different platform should let us know and we will
+add more executables to the ftp area. Look at the README for further
+information.
+
+This release features an X window interface. Using CLX, the full
+functionality of X windows has been made available at the Haskell
+level. There is also a Haskell <-> Lisp interface similar to the C
+interface in the Glasgow system.
+
+
+Our system is available for anonymous ftp from the Yale Haskell ftp site:
+
+ Site Host name Raw IP address
+ Yale nebula.cs.yale.edu 128.36.13.1
+
+All files are in the directory pub/haskell/yale.
+
+haskell-source-205.tar.gz -- The full sources
+haskell-205-<machine+OS>.tar.gz
+Compiling from scratch will take an hour or two, depending on system
+resources. The file $HASKELL/com/<your-lisp>/README will contain
+complete building instructions.
+
+To obtain Yale Haskell via ftp:
+
+ - Move to the directory where you intend to place Yale Haskell
+ - Ftp to nebula and login anonymously
+ - cd to pub/haskell/yale
+ - Get the tar file: get haskell-source-205.tar.gz (a .Z file is available
+ for those without gzip).
+ - Unzip the file: (your zip utility may have a different name)
+ gzip -d *.gz
+ - Untar the file: tar xf *.tar
+ - Consult the documentation for further instructions. Either print
+ out the reference manual in doc/manual/haskell.dvi or look at
+ install.verb in the same directory.
+
+Send any comments or questions to haskell-request@cs.yale.edu
+
+
+New features in this release include:
+
+ * Much better optimization
+ * Monadic I/O
+ * A general Haskell to Lisp interface
+ * An X window interface
+ * Strictness annotations and strict data constructors
+ * Lots of bugs fixed
+ * Improvements to the tutorial and Emacs interface
+ * Ported to all major Lisp systems
+
diff --git a/doc/comparison b/doc/comparison
new file mode 100644
index 0000000..43c6073
--- /dev/null
+++ b/doc/comparison
@@ -0,0 +1,291 @@
+
+ Different Versions of Yale Haskell Compared
+ -------------------------------------------
+
+
+There are currently three different platforms running Yale Haskell.
+Yale Haskell runs on Lucid Common Lisp, CMU Common Lisp, and AKCL. This
+document describes the differences between these systems.
+
+Differences in performance between the different versions of Yale
+Haskell reflect the underlying Lisp systems. The better the Lisp
+system, the better the Haskell system built on it. However, getting
+optimal performance from our Haskell system on top of a Common Lisp
+system requires careful attention to the underlying compiler. Small
+changes in the optimization settings or the addition of crucial
+declarations can make significant differences in performance. We have
+been doing most of our work using the Lucid system and have tuned it
+more than the others. These comparisons are greatly influenced by the
+amount of time we have spent tuning the system: the CMU version has
+been tuned only a little and the AKCL version hardly at all.
+
+
+ Methodology
+
+The following timings are only approximate. They were obtained using
+the timing functions provided by the Common Lisp system. All timings
+were done on an unloaded Sparc 1. No attempt was made to account for
+garbage collection, differences in heap size, or similar factors. We
+don't intend these benchmark results to be taken as an exhaustive
+comparison of the different Lisp implementations involved.
+
+
+ Portability
+
+We have had no trouble moving our system to different hardware
+platforms under the same Lisp system. Since the release is in source
+form, we expect that users will be able to build on any hardware
+platform supported by one the Lisps we have ported to. Probably the
+only real constraint on portability is the requirement for a large
+virtual memory space.
+
+From the comp.lang.lisp FAQ:
+
+ Lucid Common Lisp runs on a variety of platforms, including PCs (AIX),
+ Apollo, HP, Sun-3, Sparc, IBM RT, IBM RS/6000, Decstation 3100,
+ Silicon Graphics, and Vax.
+
+ CMU Common Lisp is free, and runs on Sparcs (Mach and SunOs),
+ DecStation 3100 (Mach), IBM RT (Mach) and requires 16mb RAM, 25mb disk.
+
+ Kyoto Common Lisp (KCL) is free, but requires a license. Conforms to CLtL1.
+ It is available by anonymous ftp from rascal.ics.utexas.edu [128.83.138.20],
+ cli.com [192.31.85.1], or [133.11.11.11] (a machine in Japan)
+ in the directory /pub. AKCL is in the file akcl-xxx.tar.Z (take the
+ highest value of xxx). To obtain KCL, one must first sign and mail a
+ copy of the license agreement to: Special Interest Group in LISP,
+ c/o Taiichi Yuasa, Department of Computer Science, Toyohashi
+ University of Technology, Toyohashi 441, JAPAN. Runs on Sparc,
+ IBM RT, RS/6000, DecStation 3100, hp300, hp800, Macintosh II (under AUX),
+ mp386, IBM PS2, Silicon Graphics 4d, Sun3, Sun4, Sequent Symmetry,
+ IBM 370, NeXT and Vax. A port to DOS is in beta test as
+ math.utexas.edu:pub/beta2.zip.
+
+We have not yet completed ports of Yale Haskell to any other Lisp
+implementations, although we are likely to do so in the future.
+
+
+ System Size
+
+The overall size of the Haskell system depends on the size of the
+underlying Lisp system and how much unnecessary Lisp overhead has been
+removed for the system. We have removed large Lisp packages (like
+CLOS or CLX), but have not attempted to do any tree shaking. The size
+of the saved images (including the Lisp system, the Haskell compiler,
+and the compiled prelude) is
+
+Image Size:
+
+Lucid 10 meg
+CMU 18 meg
+AKCL 11 meg
+
+The larger size of the CMU system is probably an artifact of their way
+of saving the system.
+
+
+ Compilation Time
+
+There are three possible ways to compile a Haskell program. All
+Haskell programs must be translated into Lisp. The generated Lisp can
+then be interpreted, using no additional compilation time; compiled
+with a `fast' but nonoptimizing Lisp compiler; or compiled with the
+`slow' compiler that aggressively attempts to perform as many
+optimizations as possible.
+
+To time the `fast', nonoptimizing compiler, we have been using
+
+(PROCLAIM '(OPTIMIZE (SPEED 3) (SAFETY 0) (COMPILATION-SPEED 3)))
+
+and for the `slow', fully optimizing compiler, we have been using
+
+(PROCLAIM '(OPTIMIZE (SPEED 3) (SAFETY 0) (COMPILATION-SPEED 0)))
+
+so that the only difference is in the COMPILATION-SPEED quality.
+Lucid does, in fact, provide two completely different compilers that
+correspond to these optimize settings. For all three implementations,
+it appears that that the effect of a higher compilation speed setting
+is primarily in being less aggressive about inlining and making use of
+type declarations.
+
+The Haskell system itself (including the Prelude) is normally built
+with the fully optimizing compiler.
+
+To show just the Haskell to Lisp compilation time, here are the times
+needed to compile the Prelude (about 2500 lines of Haskell code).
+This does not include the time in the Lisp compiler or starting up the
+system.
+
+Time to compile the Prelude into Lisp: (CPU times)
+
+Lucid 111 sec
+CMU 87 sec
+AKCL 576 sec
+
+Running the Lisp compiler on the generated code takes far longer than
+running the Haskell compiler to produce the Lisp code. For example,
+the optimizing Lucid compiler takes 47 minutes to compile the Prelude
+(about x20 slower than Haskell -> Lisp). The nonoptimizing compiler
+is significantly faster but generates poorer code.
+
+The following times are the Lisp compilation time for the Prolog
+interpreter (found in the demo directory of our release):
+
+Lucid - interpreted 8.8 sec Haskell -> Lisp
+Lucid - nonopt 20.0 sec Lisp -> Machine code
+Lucid - optimizing 320.0 sec Lisp -> Machine code
+CMU - interpreted 12.4 sec Haskell -> Lisp
+CMU - nonopt 121.0 sec Lisp -> Machine code
+CMU - optimizing 152.8 sec Lisp -> Machine code
+AKCL - interpreted 47.8 sec Haskell -> Lisp
+AKCL - nonopt ~180 sec Lisp -> Machine code
+AKCL - optimizing ~360 sec Lisp -> Machine code
+
+The AKCL timings are only approximate, because the Lisp timing
+functions do not capture the time spent in the C compiler.
+
+
+Code Speed
+
+The speed of the Haskell program depends on whether the Lisp code
+has been compiled with the optimizing or nonoptimizing compiler, or
+is running interpretively.
+
+The first benchmark is nfib, which indicates the basic speed of
+function calling and Int arithmetic.
+
+module Main where
+
+nfib :: Int -> Int
+nfib 0 = 1
+nfib 1 = 1
+nfib n = nfib (n-1) + nfib (n-2)
+
+
+ nfib 20 nfib 30
+Lucid (Interpreted) 116 sec *
+Lucid (nonopt) 0.14 sec 9.4 sec
+Lucid (optimizing) 0.08 sec 4.8 sec
+CMU (Interpreted) 23.8 sec *
+CMU (nonopt) 0.24 sec 6.9 sec
+CMU (optimizing) 0.11 sec 7.0 sec
+AKCL (Interpreted) 141 sec *
+AKCL (nonopt) 0.20 sec 21.3 sec
+AKCL (optimizing) 0.15 sec 18.2 sec
+
+* Too slow to benchmark
+
+For other data types, there was no significant difference betwen
+optimizing and nonoptimizing compilation in any of the systems.
+Changing the signature of nfib to Integer -> Integer:
+
+ nfib 20 nfib 30
+Lucid (interpreted) 140 sec *
+Lucid (compiled) 0.18 sec 10.2 sec
+CMU (interpreted) 24.2 sec *
+CMU (compiled) 0.16 sec 10.5 sec
+AKCL (interpreted) 145 sec *
+AKCL (compiled) 1.07 sec 127 sec
+
+Nfib with signature Float -> Float:
+
+ nfib 20 nfib 30
+Lucid (interpreted) 222 sec *
+Lucid (compiled) 16.4 sec 2416 sec
+CMU (interpreted) 44.2 sec *
+CMU (compiled) 1.61 sec 352 sec
+AKCL (interpreted) 161 sec *
+AKCL (compiled) 103 sec *
+
+Overloaded functions run considerably slower than nonoverloaded
+functions. By allowing nfib to remain overloaded, Num a => a -> a,
+and using the Int overloading the same benchmarks run much slower.
+Again, there is no real difference between the different compiler
+optimization settings.
+
+ nfib 15 nfib 20
+Lucid (interpreted) 14.2 sec 156 sec
+Lucid (compiled) 0.97 sec 9.3 sec
+CMU (interpreted) 23.8 sec 155 sec
+CMU (compiled) 0.89 sec 15.6 sec
+AKCL (interpreted) 30.8 sec 387 sec
+AKCL (compiled) 10.3 sec 119 sec
+
+Basic Haskell data structuring operations (pattern matching and
+construction) can be tested using another version of nfib which uses
+natural numbers:
+
+ data Nat = Z | S Nat
+
+The difference betwen CMU and Lucid here is consistent with other
+benchmarks that manipulate structures.
+
+ nfib 10 nfib 15
+Lucid (Interpreted) 1.39 sec 26.7 sec
+Lucid (compiled) 0.26 sec 2.28 sec
+CMU (interpreted) 3.1 sec <stack overflow>
+CMU (compiled) 0.16 sec 0.54 sec
+AKCL (Interpreted) 4.25 sec <stack overflow>
+AKCL (compiled) 0.21 sec 13.9 sec
+
+
+ A Large Program
+
+For a final benchmark, we use the Prolog interpreter as a way of
+getting a feel for general performance of larger programs. This
+program is typical of symbolic (as opposed to numeric) computation.
+
+Time to solve append(X,Y,cons(a,cons(b,cons(c,nil)))):
+
+Lucid 12.2 sec
+CMU 12.0 sec
+AKCL 69.1 sec
+
+My interpretation of this result is that although Lucid is a bit
+slower on the previous small benchmarks, it makes up for this is
+larger programs where advantages like better instruction scheduling,
+register allocation, or memory usage may make a difference. In
+general, Lucid and CMU are very similar in performance for larger
+programs.
+
+
+ Conclusions
+
+Briefly stated, the pluses and minuses of each system are as follows:
+
+Lucid (4.0.0):
+ + Development (nonoptimizing) compiler is very fast
+ + Fast Haskell -> Lisp compilation
+ + Generates good code
+ + Very robust
+ - Costs money
+ - Slow floating point code
+ - Fairly slow interpreter
+ - The production (optimizing) compiler is extremely slow.
+
+CMU (16e):
+ + Free
+ + As fast as Lucid for Haskell -> Lisp
+ + Good floating point performance
+ + Generated code is very fast
+ + Fast interpreter
+ - Slow Lisp -> machine code compilation
+ - Doesn't run on many systems
+
+AKCL (1.615):
+ + Free
+ + Widely portable
+ - Slow (generally 3 - 5 times slower, sometimes much worse)
+ - Flakey (tends to core dump on errors, choke on large programs, etc.)
+
+Generally, using the fully optimizing compiler seems to be useful only
+in code involving Int arithmetic.
+
+The fast compiler for Lucid is a big advantage, delivering by far the
+fastest compilation to machine code with relatively little loss in
+speed compared to the optimizing compiler.
+
+
+ Yale Haskell Group
+ September 25, 1992
+
diff --git a/doc/lisp-interface/lisp-interface.dvi b/doc/lisp-interface/lisp-interface.dvi
new file mode 100644
index 0000000..b45e902
--- /dev/null
+++ b/doc/lisp-interface/lisp-interface.dvi
Binary files differ
diff --git a/doc/manual/haskell.dvi b/doc/manual/haskell.dvi
new file mode 100644
index 0000000..a789515
--- /dev/null
+++ b/doc/manual/haskell.dvi
Binary files differ
diff --git a/doc/optimizer/optimizer.dvi b/doc/optimizer/optimizer.dvi
new file mode 100644
index 0000000..8d0d2bc
--- /dev/null
+++ b/doc/optimizer/optimizer.dvi
Binary files differ
diff --git a/doc/tutorial/tutorial.ps b/doc/tutorial/tutorial.ps
new file mode 100644
index 0000000..333d9da
--- /dev/null
+++ b/doc/tutorial/tutorial.ps
@@ -0,0 +1,6257 @@
+%!PS-Adobe-2.0
+%%Creator: dvips, version 5.4 (C) 1986-90 Radical Eye Software
+%%Title: tutorial.dvi
+%%Pages: 53 1
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%%BeginProcSet: tex.pro
+/TeXDict 200 dict def TeXDict begin /N /def load def /B{bind def}N /S /exch
+load def /X{S N}B /TR /translate load N /isls false N /vsize 10 N /@rigin{
+isls{[0 1 -1 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+Resolution VResolution vsize neg mul TR}B /@letter{/vsize 10 N}B /@landscape{
+/isls true N /vsize -1 N}B /@a4{/vsize 10.6929133858 N}B /@a3{/vsize 15.5531 N
+}B /@ledger{/vsize 16 N}B /@legal{/vsize 13 N}B /@manualfeed{statusdict
+/manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0
+]N /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0
+]N df-tail}B /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N
+/FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N
+/Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[
+}B /E{pop nn dup definefont setfont}B /ch-image{ch-data dup type /stringtype
+ne{ctr get /ctr ctr 1 add N}if}B /ch-width{ch-data dup length 5 sub get}B
+/ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup length 3
+sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data
+dup length 1 sub get}B /ctr 0 N /CharBuilder{save 3 1 roll S dup /base get 2
+index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff
+ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height
+true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{
+/cc X dup type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S
+ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr
+ctr 1 add N}B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI
+save N @rigin 0 0 moveto}B /eop{clear SI restore showpage userdict /eop-hook
+known{eop-hook}if}B /@start{userdict /start-hook known{start-hook}if
+/VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1
+string dup 0 3 index put cvn put}for}B /p /show load N /RMat[1 0 0 -1 0 0]N
+/BDot 8 string N /v{/ruley X /rulex X V}B /V{gsave TR -.1 -.1 TR rulex ruley
+scale 1 1 false RMat{BDot}imagemask grestore}B /a{moveto}B /delta 0 N /tail{
+dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}B /d{
+-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /l{p
+-4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t
+{p 4 w}B /w{0 rmoveto}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B
+/eos{clear SS restore}B end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs
+792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP false N /BBcalc false N
+/p 3 def}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{
+@scaleunit div /vsc X}B /@hsize{/hs X /CLIP true N}B /@vsize{/vs X /CLIP true
+N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{10 div /rwi X}
+B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X /BBcalc true N}B
+/magscale true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{md begin /letter{}N /note{}N /legal{}N /od{txpose 1 0 mtx
+defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{
+itransform moveto}}{transform{itransform lineto}}{6 -2 roll transform 6 -2
+roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll
+itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array
+astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{
+PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR
+pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
+get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if
+yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270
+rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not
+and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip
+not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}
+ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy
+TR .96 dup scale neg S neg S TR}if}N /cp{pop pop showpage pm restore}N end}if}
+if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{
+DVImag dup scale}if}N /psfts{S 65536 div N}N /startTexFig{/psf$SavedState save
+N userdict maxlength dict begin /magscale false def normalscale currentpoint
+TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx
+sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx
+psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N
+/erasepage{}N /copypage{}N @MacSetUp}N /doclip{psf$llx psf$lly psf$urx psf$ury
+currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S
+lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState
+restore}N /@beginspecial{SDict begin /SpecialSave save N gsave normalscale
+currentpoint TR @SpecialDefaults}B /@setspecial{CLIP{newpath 0 0 moveto hs 0
+rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}{initclip}ifelse ho vo TR
+hsc vsc scale ang rotate BBcalc{rwi urx llx sub div dup scale llx neg lly neg
+TR}if /showpage{}N /erasepage{}N /copypage{}N newpath}B /@endspecial{grestore
+clear SpecialSave restore end}B /@defspecial{SDict begin}B /@fedspecial{end}B
+/li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{/SaveX currentpoint /SaveY X N 1
+setlinecap newpath}B /st{stroke SaveX SaveY moveto}B /fil{fill SaveX SaveY
+moveto}B /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix
+currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix
+setmatrix}B end
+%%EndProcSet
+TeXDict begin 1000 300 300 @start /Fa 3 84 df<00000000C000000001E000000003E000
+000003C000000007C00000000F800000001F000000001E000000003E000000007C00000000F800
+000000F000000001F000000003E000000007C000000007800000000F800000001F000000003E00
+0000003C000000007C00000000F800000001F000000001E000000003E000000007C00000000780
+0000000F800000001F000000003E000000003C000000007C00000000F800000001F000000001E0
+00000003E000000007C00000000F800000000F000000001F000000003E000000007C0000000078
+00000000F800000000F0000000006000000000232E82AB1F>19 D<00000000001800000000003C
+0000000000FC0000000001F80000000003F00000000007E0000000001F80000000003F00000000
+007E0000000001FC0000000003F00000000007E0000000000FC0000000003F00000000007E0000
+000000FC0000000001F80000000007E0000000000FC0000000001F80000000007F0000000000FC
+0000000001F80000000003F0000000000FC0000000001F80000000003F00000000007E00000000
+01F80000000003F00000000007E0000000001FC0000000003F00000000007E0000000000FC0000
+000000F000000000006000000000002E2582A22A>35 D<6000000000F000000000F80000000078
+000000007C000000003E000000001F000000000F000000000F8000000007C000000003E0000000
+01E000000001F000000000F8000000007C000000003C000000003E000000001F000000000F8000
+0000078000000007C000000003E000000001E000000001F000000000F8000000007C000000003C
+000000003E000000001F000000000F80000000078000000007C000000003E000000001F0000000
+00F000000000F8000000007C000000003E000000001E000000001F000000000F8000000007C000
+000003C000000003E000000001E000000000C0232E82AB1F>83 D E /Fb
+5 111 df<004000C000C003800D8001800180030003000300030006000600060006000C000C00
+0C000C001800FF800A157C9412>49 D<030706000000000000384C4C4C8C181818303262622438
+08177D960B>105 D<003000700020000000000000000000000000038004400460046008C000C0
+00C000C0018001800180018003000300030003006600E600CC0070000C1D81960B>I<1F000600
+0600060006000C000C000C000C001870189819381A30340038003E0033006300631063106310C3
+20C1C00D177D9610>I<387044984708460C8C180C180C180C1818301831186118623026303810
+0E7D8D14>110 D E /Fc 46 122 df<000FF07F00007FF9FF8000F83FC7C001E07F8FC003E07F
+0FC007C07F0FC007C03F078007C01F000007C01F000007C01F000007C01F000007C01F0000FFFF
+FFF800FFFFFFF80007C01F000007C01F000007C01F000007C01F000007C01F000007C01F000007
+C01F000007C01F000007C01F000007C01F000007C01F000007C01F000007C01F000007C01F0000
+07C01F000007C01F00003FF8FFF0003FF8FFF0002220809F1F>11 D<FFF0FFF0FFF0FFF00C047F
+8B11>45 D<387CFEFEFE7C3807077C860F>I<00E00001E0000FE000FFE000F3E00003E00003E0
+0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0
+0003E00003E00003E00003E00003E00003E00003E000FFFF80FFFF80111D7C9C1A>49
+D<07F0001FFE00383F007C1F80FE0FC0FE0FC0FE0FE0FE07E07C07E03807E0000FE0000FC0000F
+C0001F80001F00003E0000780000F00000E00001C0000380600700600E00601C00E01FFFC03FFF
+C07FFFC0FFFFC0FFFFC0131D7D9C1A>I<01FC0007FF000E0F801E0FC03F07E03F07E03F07E03F
+07E01E0FC0000FC0000F80001F0001FC0001FC00000F800007C00003E00003F00003F83803F87C
+03F8FE03F8FE03F8FE03F0FC03F07807E03C0FC01FFF8003FC00151D7E9C1A>I<0001C00003C0
+0007C00007C0000FC0001FC0003BC00073C00063C000C3C00183C00383C00703C00E03C00C03C0
+1803C03803C07003C0E003C0FFFFFEFFFFFE0007C00007C00007C00007C00007C00007C000FFFE
+00FFFE171D7F9C1A>I<3803803FFF803FFF003FFE003FFC003FF0003F80003000003000003000
+0030000033F80037FE003C1F00380F801007C00007C00007E00007E07807E0FC07E0FC07E0FC07
+E0FC07C0780FC0600F80381F001FFC0007F000131D7D9C1A>I<387CFEFEFE7C38000000000000
+387CFEFEFE7C3807147C930F>58 D<0000E000000000E000000001F000000001F000000001F000
+000003F800000003F800000006FC00000006FC0000000EFE0000000C7E0000000C7E000000183F
+000000183F000000303F800000301F800000701FC00000600FC00000600FC00000C007E00000FF
+FFE00001FFFFF000018003F000018003F000030001F800030001F800060001FC00060000FC000E
+0000FE00FFE00FFFE0FFE00FFFE0231F7E9E28>65 D<FFFFFE00FFFFFFC007C007E007C003F007
+C001F807C001FC07C001FC07C001FC07C001FC07C001FC07C001F807C003F807C007F007C00FE0
+07FFFF8007FFFFC007C003F007C001F807C001FC07C000FC07C000FE07C000FE07C000FE07C000
+FE07C000FE07C000FC07C001FC07C003F807C007F0FFFFFFE0FFFFFF001F1F7E9E25>I<0007FC
+02003FFF0E00FE03DE03F000FE07E0003E0FC0001E1F80001E3F00000E3F00000E7F0000067E00
+00067E000006FE000000FE000000FE000000FE000000FE000000FE000000FE0000007E0000007E
+0000067F0000063F0000063F00000C1F80000C0FC0001807E0003803F0007000FE01C0003FFF80
+0007FC001F1F7D9E26>I<FFFFFE0000FFFFFFC00007E007F00007E001F80007E000FC0007E000
+7E0007E0003F0007E0003F0007E0001F8007E0001F8007E0001F8007E0001FC007E0001FC007E0
+001FC007E0001FC007E0001FC007E0001FC007E0001FC007E0001FC007E0001FC007E0001F8007
+E0001F8007E0001F8007E0003F0007E0003F0007E0007E0007E000FC0007E001F80007E007F000
+FFFFFFC000FFFFFE0000221F7E9E28>I<FFFFFFE0FFFFFFE007E007E007E001E007E000E007E0
+006007E0007007E0003007E0003007E0603007E0603007E0600007E0E00007E1E00007FFE00007
+FFE00007E1E00007E0E00007E0600007E0600C07E0600C07E0000C07E0001807E0001807E00018
+07E0003807E0007807E000F807E003F0FFFFFFF0FFFFFFF01E1F7E9E22>I<FFFFFFE0FFFFFFE0
+07E007E007E001E007E000E007E0006007E0007007E0003007E0003007E0603007E0603007E060
+0007E0E00007E1E00007FFE00007FFE00007E1E00007E0E00007E0600007E0600007E0600007E0
+000007E0000007E0000007E0000007E0000007E0000007E0000007E00000FFFF8000FFFF80001C
+1F7E9E21>I<FFFF0FFFF0FFFF0FFFF007E0007E0007E0007E0007E0007E0007E0007E0007E000
+7E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007FF
+FFFE0007FFFFFE0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007
+E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E00FFFF0FFFF0
+FFFF0FFFF0241F7E9E29>72 D<FFFF8000FFFF800007E0000007E0000007E0000007E0000007E0
+000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E000C007E000C007E000C007E001C007E001C007E001C007E00380
+07E0038007E00F8007E01F80FFFFFF80FFFFFF801A1F7E9E1F>76 D<FFE000FFF0FFF000FFF007
+F000060007F800060006FC000600067E000600063F000600063F800600061F800600060FC00600
+0607E006000603F006000601F806000601FC06000600FC060006007E060006003F060006001F86
+0006001FC60006000FE600060007E600060003F600060001FE00060000FE00060000FE00060000
+7E000600003E000600001E000600000E00FFF0000600FFF0000600241F7E9E29>78
+D<001FF80000FFFF0001F81F8007E007E00FC003F01F8001F81F0000F83F0000FC7F0000FE7E00
+007E7E00007EFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE
+00007F7E00007E7F0000FE7F0000FE3F0000FC3F8001FC1F8001F80FC003F007E007E001F81F80
+00FFFF00001FF800201F7D9E27>I<FFFFFE00FFFFFF8007E00FE007E003F007E001F807E001F8
+07E001FC07E001FC07E001FC07E001FC07E001FC07E001F807E001F807E003F007E00FE007FFFF
+8007FFFE0007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0
+000007E0000007E0000007E00000FFFF0000FFFF00001E1F7E9E24>I<03FC080FFF381E03F838
+00F8700078700038F00038F00018F00018F80000FC00007FC0007FFE003FFF801FFFE00FFFF007
+FFF000FFF80007F80000FC00007C00003CC0003CC0003CC0003CE00038E00078F80070FE01E0E7
+FFC081FF00161F7D9E1D>83 D<7FFFFFFC7FFFFFFC7C07E07C7007E01C6007E00C6007E00CE007
+E00EC007E006C007E006C007E006C007E0060007E0000007E0000007E0000007E0000007E00000
+07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E000
+0007E0000007E00003FFFFC003FFFFC01F1E7E9D24>I<FFFE0FFFC0FFE0FFFE0FFFC0FFE00FC0
+00FC000E000FE000FC000E0007E000FE000C0007E000FE000C0003F000FE00180003F001FF0018
+0003F001BF00180001F801BF00300001F8031F80300001FC031F80700000FC031F80600000FC06
+0FC06000007E060FC0C000007E0E0FE0C000007E0C07E0C000003F0C07E18000003F1803F18000
+003F9803F38000001F9803F30000001FB001FB0000000FF001FE0000000FF001FE0000000FE000
+FE00000007E000FC00000007C0007C00000007C0007C00000003C0007800000003800038000000
+018000300000331F7F9E36>87 D<07FC001FFF003F0F803F07C03F03E03F03E00C03E00003E000
+7FE007FBE01F03E03C03E07C03E0F803E0F803E0F803E0FC05E07E0DE03FF8FE0FE07E17147F93
+19>97 D<FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00
+001F1FC01F7FF01FE0F81F807C1F007E1F003E1F003E1F003F1F003F1F003F1F003F1F003F1F00
+3F1F003E1F003E1F007C1F807C1EC1F81C7FE0181F8018207E9F1D>I<01FE0007FF801F0FC03E
+0FC03E0FC07C0FC07C0300FC0000FC0000FC0000FC0000FC0000FC00007C00007E00003E00603F
+00C01F81C007FF0001FC0013147E9317>I<0007F80007F80000F80000F80000F80000F80000F8
+0000F80000F80000F80000F80000F801F8F80FFEF81F83F83E01F87E00F87C00F87C00F8FC00F8
+FC00F8FC00F8FC00F8FC00F8FC00F87C00F87C00F87E00F83E01F81F07F80FFEFF03F8FF18207E
+9F1D>I<01FE0007FF800F83C01E01E03E00F07C00F07C00F8FC00F8FFFFF8FFFFF8FC0000FC00
+00FC00007C00007C00003E00181E00180F807007FFE000FF8015147F9318>I<001F8000FFC001
+F3E003E7E003C7E007C7E007C3C007C00007C00007C00007C00007C000FFFC00FFFC0007C00007
+C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007
+C00007C0003FFC003FFC0013207F9F10>I<01FC3C07FFFE0F079E1E03DE3E03E03E03E03E03E0
+3E03E03E03E01E03C00F07800FFF0009FC001800001800001C00001FFF800FFFF007FFF81FFFFC
+3C007C70003EF0001EF0001EF0001E78003C78003C3F01F80FFFE001FF00171E7F931A>I<FF00
+00FF00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0FC01F3F
+E01F61F01FC0F81F80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00
+F81F00F81F00F81F00F8FFE3FFFFE3FF18207D9F1D>I<1C003E007F007F007F003E001C000000
+00000000000000000000FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F
+001F001F001F00FFE0FFE00B217EA00E>I<FF0000FF00001F00001F00001F00001F00001F0000
+1F00001F00001F00001F00001F00001F01FE1F01FE1F00F01F00C01F03801F07001F0C001F1800
+1F7C001FFC001F9E001F0F001E0F801E07C01E03C01E01E01E01F01E00F8FFC3FFFFC3FF18207E
+9F1C>107 D<FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F
+001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B207E9F0E>I<FE
+0FE03F80FE1FF07FC01E70F9C3E01E407D01F01E807E01F01F807E01F01F007C01F01F007C01F0
+1F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01
+F01F007C01F01F007C01F0FFE3FF8FFEFFE3FF8FFE27147D932C>I<FE0FC0FE3FE01E61F01EC0
+F81E80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00
+F81F00F8FFE3FFFFE3FF18147D931D>I<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC
+007EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F83E00F81F83F007FFC001FF0017
+147F931A>I<FF1FC0FF7FF01FE1F81F80FC1F007E1F007E1F003E1F003F1F003F1F003F1F003F
+1F003F1F003F1F003E1F007E1F007C1F80FC1FC1F81F7FE01F1F801F00001F00001F00001F0000
+1F00001F00001F0000FFE000FFE000181D7E931D>I<01F81807FE381F87783F01F83E01F87E00
+F87C00F8FC00F8FC00F8FC00F8FC00F8FC00F8FC00F87C00F87E00F87E00F83F01F81F87F80FFE
+F803F8F80000F80000F80000F80000F80000F80000F80000F80007FF0007FF181D7E931C>I<FE
+3E00FE7F801ECFC01E8FC01E8FC01F8FC01F03001F00001F00001F00001F00001F00001F00001F
+00001F00001F00001F00001F0000FFF000FFF00012147E9316>I<0FE63FFE701E600EE006E006
+F800FFC07FF83FFC1FFE03FE001FC007C007E007F006F81EFFFCC7F010147E9315>I<01800180
+018003800380038007800F803F80FFFCFFFC0F800F800F800F800F800F800F800F800F800F800F
+860F860F860F860F8607CC03F801F00F1D7F9C14>I<FF07F8FF07F81F00F81F00F81F00F81F00
+F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F01F81F01F80F06F807FC
+FF03F8FF18147D931D>I<FFE07F80FFE07F801F001C000F8018000F80180007C0300007C03000
+03E0600003E0600001F0C00001F0C00001F9C00000F9800000FF8000007F0000007F0000003E00
+00003E0000001C0000001C000019147F931C>I<FFE1FF00FFE1FF000F80700007C0E00007E0C0
+0003E1800001F3800000FF0000007E0000003E0000003F0000007F8000006F800000C7C0000183
+E0000381F0000701F8000E00FC00FF81FF80FF81FF8019147F931C>120
+D<FFE07F80FFE07F801F001C000F8018000F80180007C0300007C0300003E0600003E0600001F0
+C00001F0C00001F9C00000F9800000FF8000007F0000007F0000003E0000003E0000001C000000
+1C0000001800000018000078300000FC300000FC600000C0E00000E1C000007F8000001E000000
+191D7F931C>I E /Fd 2 111 df<0300038003000000000000000000000000001C002400460046
+008C000C0018001800180031003100320032001C0009177F960C>105 D<383C0044C600470200
+4602008E06000C06000C06000C0C00180C00180C40181840181880300880300F00120E7F8D15>
+110 D E /Fe 20 122 df<03CC0E2E181C381C301C701CE038E038E038E038C072C072C07260F2
+61341E180F107C8F14>97 D<7E000E000E000E001C001C001C001C00380038003BC03C30783070
+1870187018E038E038E038E038C070C060C0E060C063801E000D1A7C9912>I<01F006080C1818
+38301070006000E000E000E000E000E008E010602030C01F000D107C8F12>I<001F8000038000
+0380000380000700000700000700000700000E00000E0003CE000E2E00181C00381C00301C0070
+1C00E03800E03800E03800E03800C07200C07200C0720060F2006134001E1800111A7C9914>I<
+01E006181C08380870087010FFE0E000E000E000E000E0086010602030C01F000D107C8F12>I<
+1F80000380000380000380000700000700000700000700000E00000E00000E7C000F86001E0700
+1E07001C07001C0700380E00380E00380E00381C00701C80701C80703880703900E01900600E00
+111A7E9914>104 D<030706000000000000384C4E8E9C9C1C3838707272E2E4643808197C980C>
+I<1F8003800380038007000700070007000E000E000E0E0E131C271C431C801F003C003F8039C0
+38E070E270E270E270E4E0646038101A7E9912>107 D<3F0707070E0E0E0E1C1C1C1C38383838
+70707070E4E4E4E46830081A7D990A>I<307C1E00598663009E0783809E0703809C0703809C07
+0380380E0700380E0700380E0700380E0E00701C0E40701C0E40701C1C40701C1C80E0380C8060
+1807001A107C8F1F>I<307C005986009E07009E07009C07009C0700380E00380E00380E00381C
+00701C80701C80703880703900E01900600E0011107C8F16>I<01F006180C0C180E300E700E60
+0EE00EE00EE00CE01CE018E030606030C01F000F107C8F14>I<030F000590C009E0C009C06009
+C06009C0600380E00380E00380E00380E00701C00701800703800703000E8E000E78000E00000E
+00001C00001C00001C00001C0000FF00001317808F14>I<03C20E2E181C381C301C701CE038E0
+38E038E038C070C070C07060F061E01EE000E000E001C001C001C001C01FF00F177C8F12>I<30
+F059189E389C189C009C0038003800380038007000700070007000E00060000D107C8F10>I<03
+E004300830187018601C001F801FC00FE000E00060E060E06080C041803E000C107D8F10>I<06
+000E000E000E000E001C001C00FFC01C0038003800380038007000700070007000E100E100E100
+E200640038000A177C960D>I<38064C074E0E8E0E9C0E9C0E1C1C381C381C381C703970397039
+3079389A0F0C10107C8F15>I<38184C1C4E1C8E0C9C0C9C0C1C08380838083808701070107020
+304018C00F000E107C8F12>I<38064C074E0E8E0E9C0E9C0E1C1C381C381C381C703870387038
+307838F00F700070006060E0E1C0C18047003C0010177C8F13>121 D E
+/Ff 27 122 df<60F0F878181818303060C080050C789614>39 D<00C001C0030006000C001C00
+38003000700070006000E000E000E000E000E000E000E000600070007000300038001C000C0006
+00030001C000C00A1D7A9914>I<8000C0006000300018001C000E000600070007000300038003
+800380038003800380038003000700070006000E001C00180030006000C0008000091D7C9914>
+I<01C00001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF8001C00001C00001C0
+0001C00001C00001C00001C00011117F9314>43 D<70F8FCFC7C0C1830E0C0060A798414>I<70
+F8F8F8700505798414>46 D<0006000E000E001C001C003800380070007000E000E001C001C003
+8003800380070007000E000E001C001C003800380070007000E000E000C0000F1D7E9914>I<70
+F8F8F87000000000000070F8F8F8700510798F14>58 D<FFFF80FFFF807FFF8000000000000000
+00007FFF80FFFF80FFFF8011097F8F14>61 D<FFE0FFE0E000E000E000E000E000E000E000E000
+E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000FFE0FFE00B
+1D799914>91 D<FFE0FFE000E000E000E000E000E000E000E000E000E000E000E000E000E000E0
+00E000E000E000E000E000E000E000E000E000E000E0FFE0FFE00B1D7F9914>93
+D<0818306060C0C0C0F0F87830050C799914>96 D<1FC0007FF000707800201800001C00001C00
+07FC001FFC003C1C00701C00E01C00E01C00E01C00707C003FFF800F8F8011107E8F14>I<03F8
+0FFC1C1C380870006000E000E000E000E00060007000380E1C1E0FFC03F00F107E8F14>99
+D<007E00007E00000E00000E00000E00000E00000E0007CE000FFE001C3E00301E00700E00E00E
+00E00E00E00E00E00E00E00E00E00E00700E00301E00383E001FEFC007CFC012177F9614>I<07
+E00FF01C38301C700CE00EE00EFFFEFFFEE00060007000380E1C1E0FFC03F00F107E8F14>I<00
+7C00FE01CE03840380038003807FFEFFFE03800380038003800380038003800380038003800380
+03807FFC7FFC0F177F9614>I<030007800780030000000000000000007F807F80038003800380
+038003800380038003800380038003800380FFFCFFFC0E187D9714>105
+D<FF80FF8003800380038003800380038003800380038003800380038003800380038003800380
+03800380FFFEFFFE0F177E9614>108 D<FC7800FDFE001F86001E07001C07001C07001C07001C
+07001C07001C07001C07001C07001C07001C0700FF8FE0FF8FE01310808F14>110
+D<07C01FF03C78701C701CE00EE00EE00EE00EE00EE00E701C783C3C781FF007C00F107E8F14>
+I<03CE000FFE001C3E00301E00700E00E00E00E00E00E00E00E00E00E00E00E00E00700E00301E
+001C3E000FEE0007CE00000E00000E00000E00000E00000E00000E00007FC0007FC012187F8F14
+>113 D<0FD83FF86038C038C038F0007F803FF007F8001C6006E006F006F81CFFF8CFE00F107E
+8F14>115 D<030007000700070007007FFCFFFC07000700070007000700070007000700070E07
+0E070E070C03FC00F00F157F9414>I<FE3F80FE3F801C1C001C1C001C1C001C1C000E38000E38
+000E380006300007700007700007700003E00003E00003E00011107F8F14>118
+D<7E3F007E3F001E38000E780007700007E00003E00001C00003C00003E0000770000E78000E38
+001C1C00FE3F80FE3F8011107F8F14>120 D<FE3F80FE3F801C1C001C1C001C1C000E1C000E38
+000E380007380007300007300003700003700001E00001E00001E00001C00001C00001C0000380
+007380007700007E00003C000011187F8F14>I E /Fg 56 123 df<000FF000007FFC0001F80E
+0003E01F0007C03F000F803F000F803F000F801E000F800C000F8000000F8000000F8000000F80
+0000FFFFFF00FFFFFF000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F
+801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F00
+0F801F007FF0FFE07FF0FFE01B237FA21F>12 D<3803807C07C0FE0FE0FF0FF0FF0FF07F07F03B
+03B00300300300300700700600600600600C00C01C01C018018070070020020014117EA21D>34
+D<387CFEFFFF7F3B03030706060C1C18702008117C8610>44 D<FFFCFFFCFFFCFFFC0E047F8C13
+>I<387CFEFEFE7C3807077C8610>I<0000180000380000380000700000700000E00000E00000E0
+0001C00001C0000380000380000380000700000700000700000E00000E00001C00001C00001C00
+00380000380000700000700000700000E00000E00001C00001C00001C000038000038000070000
+0700000700000E00000E00000E00001C00001C0000380000380000380000700000700000E00000
+E00000C0000015317DA41C>I<00180000780001F800FFF800FFF80001F80001F80001F80001F8
+0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8
+0001F80001F80001F80001F80001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>49
+D<03FC000FFF003C1FC07007E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F80003
+F00003F00007E00007C0000F80001F00003E0000380000700000E01801C0180380180700180E00
+380FFFF01FFFF03FFFF07FFFF0FFFFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03F03F
+03F03F81F83F81F83F81F81F03F81F03F00003F00003E00007C0001F8001FE0001FF000007C000
+01F00001F80000FC0000FC3C00FE7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07F00F
+FFC001FE0017207E9F1C>I<0000E00001E00003E00003E00007E0000FE0001FE0001FE00037E0
+0077E000E7E001C7E00187E00307E00707E00E07E00C07E01807E03807E07007E0E007E0FFFFFE
+FFFFFE0007E00007E00007E00007E00007E00007E00007E000FFFE00FFFE17207E9F1C>I<1000
+201E01E01FFFC01FFF801FFF001FFE001FF8001BC00018000018000018000018000019FC001FFF
+001E0FC01807E01803E00003F00003F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03
+F07007E03007C01C1F800FFF0003F80015207D9F1C>I<001F8000FFE003F07007C0F00F01F81F
+01F83E01F83E01F87E00F07C00007C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC
+007EFC007EFC007EFC007E7C007E7C007E7C007E3C007C3E007C1E00F80F00F00783E003FFC000
+FF0017207E9F1C>I<6000007800007FFFFE7FFFFE7FFFFC7FFFF87FFFF87FFFF0E00060E000C0
+C00180C00300C00300000600000C00001C0000180000380000780000780000F00000F00000F000
+01F00001F00001F00003F00003F00003F00003F00003F00003F00003F00001E00017227DA11C>
+I<00FE0003FFC00703E00E00F01C00F01C00783C00783E00783F00783F80783FE0F01FF9E01FFF
+C00FFF8007FFC003FFE007FFF01E7FF83C1FFC7807FC7801FEF000FEF0003EF0001EF0001EF000
+1CF8001C7800383C00381F01F00FFFC001FF0017207E9F1C>I<01FE0007FF800F83E01E01F03E
+00F07C00F87C0078FC007CFC007CFC007CFC007EFC007EFC007EFC007E7C00FE7C00FE3E01FE1E
+037E0FFE7E07FC7E00207E00007C00007C1E007C3F00F83F00F83F00F03F01E01E03C01C0F800F
+FE0003F80017207E9F1C>I<387CFEFEFE7C380000000000000000387CFEFEFE7C3807167C9510>
+I<000070000000007000000000F800000000F800000000F800000001FC00000001FC00000003FE
+00000003FE00000003FE00000006FF000000067F0000000E7F8000000C3F8000000C3F80000018
+3FC00000181FC00000381FE00000300FE00000300FE00000600FF000006007F00000E007F80000
+FFFFF80000FFFFF800018001FC00018001FC00038001FE00030000FE00030000FE000600007F00
+0600007F00FFE00FFFF8FFE00FFFF825227EA12A>65 D<FFFFFF8000FFFFFFE00007F001F80007
+F000FC0007F0007E0007F0007E0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F00
+07F0007E0007F000FE0007F000FC0007F003F80007FFFFF00007FFFFF00007F001FC0007F0007E
+0007F0003F0007F0003F8007F0001F8007F0001FC007F0001FC007F0001FC007F0001FC007F000
+1FC007F0001FC007F0003F8007F0003F8007F0007F0007F001FE00FFFFFFF800FFFFFFC0002222
+7EA128>I<0003FE0080001FFF818000FF01E38001F8003F8003E0001F8007C0000F800F800007
+801F800007803F000003803F000003807F000001807E000001807E00000180FE00000000FE0000
+0000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000007E000000007E00
+0001807F000001803F000001803F000003801F800003000F8000030007C000060003F0000C0001
+F800380000FF00F000001FFFC0000003FE000021227DA128>I<FFFFFF8000FFFFFFF00007F003
+FC0007F0007E0007F0003F0007F0001F8007F0000FC007F00007E007F00007E007F00007F007F0
+0003F007F00003F007F00003F007F00003F807F00003F807F00003F807F00003F807F00003F807
+F00003F807F00003F807F00003F807F00003F807F00003F007F00003F007F00003F007F00007E0
+07F00007E007F0000FC007F0001F8007F0003F0007F0007E0007F003FC00FFFFFFF000FFFFFF80
+0025227EA12B>I<FFFFFFFCFFFFFFFC07F000FC07F0003C07F0001C07F0000C07F0000E07F000
+0E07F0000607F0180607F0180607F0180607F0180007F0380007F0780007FFF80007FFF80007F0
+780007F0380007F0180007F0180007F0180307F0180307F0000307F0000607F0000607F0000607
+F0000E07F0000E07F0001E07F0003E07F001FCFFFFFFFCFFFFFFFC20227EA125>I<FFFFFFF8FF
+FFFFF807F001F807F0007807F0003807F0001807F0001C07F0001C07F0000C07F0000C07F0180C
+07F0180C07F0180007F0180007F0380007F0780007FFF80007FFF80007F0780007F0380007F018
+0007F0180007F0180007F0180007F0000007F0000007F0000007F0000007F0000007F0000007F0
+000007F00000FFFFE000FFFFE0001E227EA123>I<FFFFE0FFFFE003F80003F80003F80003F800
+03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800
+03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800
+FFFFE0FFFFE013227FA115>73 D<FFFFE000FFFFE00007F0000007F0000007F0000007F0000007
+F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000
+07F0000007F0000007F0000007F0000007F0000007F0001807F0001807F0001807F0001807F000
+3807F0003807F0007007F0007007F000F007F001F007F007F0FFFFFFF0FFFFFFF01D227EA122>
+76 D<FFF000000FFFFFF800001FFF07F800001FE006FC000037E006FC000037E006FC000037E0
+067E000067E0067E000067E0063F0000C7E0063F0000C7E0061F800187E0061F800187E0060FC0
+0307E0060FC00307E0060FC00307E00607E00607E00607E00607E00603F00C07E00603F00C07E0
+0601F81807E00601F81807E00601F81807E00600FC3007E00600FC3007E006007E6007E006007E
+6007E006003FC007E006003FC007E006001F8007E006001F8007E006001F8007E006000F0007E0
+FFF00F00FFFFFFF00600FFFF30227EA135>I<FFF8001FFEFFFC001FFE07FC0000C007FE0000C0
+06FF0000C0067F8000C0063FC000C0061FE000C0060FE000C0060FF000C00607F800C00603FC00
+C00601FE00C00600FE00C00600FF00C006007F80C006003FC0C006001FE0C006000FF0C0060007
+F0C0060007F8C0060003FCC0060001FEC0060000FFC00600007FC00600007FC00600003FC00600
+001FC00600000FC006000007C006000003C006000003C0FFF00001C0FFF00000C027227EA12C>
+I<0007FC0000003FFF800000FC07E00003F001F80007E000FC000FC0007E001F80003F001F8000
+3F003F00001F803F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00
+000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F
+00001FC07F00001FC03F00001F803F80003F801F80003F000FC0007E0007E000FC0003F001F800
+00FC07E000003FFF80000007FC000023227DA12A>I<FFFFFF00FFFFFFE007F007F007F001FC07
+F000FC07F0007E07F0007E07F0007F07F0007F07F0007F07F0007F07F0007F07F0007E07F0007E
+07F000FC07F001FC07F007F007FFFFE007FFFF0007F0000007F0000007F0000007F0000007F000
+0007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000FFFF8000FFFF
+800020227EA126>I<FFFFFE0000FFFFFFC00007F007F00007F001F80007F000FC0007F0007E00
+07F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007E0007F000FC
+0007F001F80007F007F00007FFFFC00007FFFF800007F00FE00007F007F00007F003F80007F001
+FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F0
+01FC0607F000FE0607F000FF0CFFFF803FF8FFFF800FF027227EA12A>82
+D<01FC0407FF8C1F03FC3C007C7C003C78001C78001CF8000CF8000CFC000CFC0000FF0000FFE0
+007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FF00007F00003F00003FC0001FC000
+1FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF8018227DA11F>I<7FFFFFFF807FFF
+FFFF807E03F80F807803F807807003F803806003F80180E003F801C0E003F801C0C003F800C0C0
+03F800C0C003F800C0C003F800C00003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000003F800000003F8000003FFFF
+F80003FFFFF80022227EA127>I<FFFF803FFCFFFF803FFC07F000018007F000018007F0000180
+07F000018007F000018007F000018007F000018007F000018007F000018007F000018007F00001
+8007F000018007F000018007F000018007F000018007F000018007F000018007F000018007F000
+018007F000018007F000018007F000018007F000018007F000018003F000030003F800030001F8
+00060000FC000E00007E001C00003F80F800000FFFE0000001FF000026227EA12B>I<0400400E
+00E0180180380380300300600600600600E00E00C00C00C00C00DC0DC0FE0FE0FF0FF0FF0FF07F
+07F03E03E01C01C014117AA21D>92 D<07FC001FFF803F07C03F03E03F01E03F01F01E01F00001
+F00001F0003FF003FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF8
+7F07E03F18167E951B>97 D<FF000000FF0000001F0000001F0000001F0000001F0000001F0000
+001F0000001F0000001F0000001F0000001F0000001F0000001F0FE0001F3FF8001FF07C001F80
+1E001F001F001F000F801F000F801F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F
+000FC01F000FC01F000F801F001F801F801F001FC03E001EE07C001C3FF800180FC0001A237EA2
+1F>I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC0000FC0000
+FC0000FC00007C00007E00007E00003E00301F00600FC0E007FF8000FE0014167E9519>I<0001
+FE000001FE0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000
+003E0000003E0000003E0001FC3E0007FFBE000F81FE001F007E003E003E007E003E007C003E00
+FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E007C003E007C003E
+003E007E001E00FE000F83BE0007FF3FC001FC3FC01A237EA21F>I<00FE0007FF800F87C01E01
+E03E01F07C00F07C00F8FC00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00
+003E00181F00300FC07003FFC000FF0015167E951A>I<003F8000FFC001E3E003C7E007C7E00F
+87E00F83C00F80000F80000F80000F80000F80000F8000FFFC00FFFC000F80000F80000F80000F
+80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F
+80000F80007FF8007FF80013237FA211>I<03FC1E0FFF7F1F0F8F3E07CF3C03C07C03E07C03E0
+7C03E07C03E07C03E03C03C03E07C01F0F801FFF0013FC003000003000003800003FFF801FFFF0
+0FFFF81FFFFC3800FC70003EF0001EF0001EF0001EF0001E78003C7C007C3F01F80FFFE001FF00
+18217E951C>I<FF000000FF0000001F0000001F0000001F0000001F0000001F0000001F000000
+1F0000001F0000001F0000001F0000001F0000001F07E0001F1FF8001F307C001F403C001F803E
+001F803E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F00
+3E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FFE1FFC01A237EA21F>I<1C00
+3E007F007F007F003E001C000000000000000000000000000000FF00FF001F001F001F001F001F
+001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B247EA310>I<FF
+00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00
+1F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B237EA210>108
+D<FF07F007F000FF1FFC1FFC001F303E303E001F403E403E001F801F801F001F801F801F001F00
+1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F
+001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00
+1F001F00FFE0FFE0FFE0FFE0FFE0FFE02B167E9530>I<FF07E000FF1FF8001F307C001F403C00
+1F803E001F803E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E
+001F003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FFE1FFC01A167E951F>
+I<00FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007EFC00
+7EFC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>I<FF0FE000
+FF3FF8001FF07C001F803E001F001F001F001F801F001F801F000FC01F000FC01F000FC01F000F
+C01F000FC01F000FC01F000FC01F000FC01F001F801F001F801F803F001FC03E001FE0FC001F3F
+F8001F0FC0001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F000000FF
+E00000FFE000001A207E951F>I<00FE030007FF87000FC1C7001F006F003F003F007E003F007E
+001F007C001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F007E001F00
+7E001F003E003F001F007F000FC1DF0007FF9F0001FC1F0000001F0000001F0000001F0000001F
+0000001F0000001F0000001F0000001F000000FFE00000FFE01B207E951E>I<FE1F00FE3FC01E
+67E01EC7E01E87E01E87E01F83C01F00001F00001F00001F00001F00001F00001F00001F00001F
+00001F00001F00001F00001F0000FFF000FFF00013167E9517>I<0FF3003FFF00781F00600700
+E00300E00300F00300FC00007FE0007FF8003FFE000FFF0001FF00000F80C00780C00380E00380
+E00380F00700FC0E00EFFC00C7F00011167E9516>I<0180000180000180000180000380000380
+000780000780000F80003F8000FFFF00FFFF000F80000F80000F80000F80000F80000F80000F80
+000F80000F80000F80000F80000F81800F81800F81800F81800F81800F830007C30003FE0000F8
+0011207F9F16>I<FF01FE00FF01FE001F003E001F003E001F003E001F003E001F003E001F003E
+001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F00
+7E001F00FE000F81BE0007FF3FC001FC3FC01A167E951F>I<FFE01FE0FFE01FE00F8006000F80
+06000FC00E0007C00C0007E01C0003E0180003E0180001F0300001F0300000F8600000F8600000
+7CC000007CC000007FC000003F8000003F8000001F0000001F0000000E0000000E00001B167F95
+1E>I<FFE07FC0FFE07FC00F801C0007C0380003E0700003F0600001F8C00000F98000007F8000
+003F0000001F0000001F8000003FC0000037C0000063E00000C1F00001C0F8000380FC0007007E
+000E003E00FF80FFE0FF80FFE01B167F951E>120 D<FFE01FE0FFE01FE00F8006000F8006000F
+C00E0007C00C0007E01C0003E0180003E0180001F0300001F0300000F8600000F86000007CC000
+007CC000007FC000003F8000003F8000001F0000001F0000000E0000000E0000000C0000000C00
+000018000078180000FC380000FC300000FC60000069C000007F8000001F0000001B207F951E>
+I<7FFFF07FFFF07C03E07007C0600FC0E01F80C01F00C03E00C07E0000FC0000F80001F00003F0
+3007E03007C0300F80701F80703F00603E00E07C03E0FFFFE0FFFFE014167E9519>I
+E /Fh 11 121 df<70F8F8F87005057C840D>58 D<70F8FCFC74040404080810102040060E7C84
+0D>I<00F1800389C00707800E03801C03803C0380380700780700780700780700F00E00F00E00
+F00E00F00E10F01C20F01C20703C20705C40308C400F078014147E9318>97
+D<007C01C207010E011C013C013802780C7BF07C00F000F000F000F00070007001700230041838
+07C010147E9315>101 D<01E0000FE00001C00001C00001C00001C00003800003800003800003
+80000700000700000701E00706100E08700E10F00E20F00E40601C80001D00001E00001FC00038
+7000383800383800381C20703840703840703840701880E01880600F0014207E9F18>107
+D<1E07802318C023A06043C0704380704380708700E00700E00700E00700E00E01C00E01C00E01
+C00E03821C03841C07041C07081C03083803101801E017147E931B>110
+D<03C1E004621804741C08781C08701E08701E10E01E00E01E00E01E00E01E01C03C01C03C01C0
+3C01C0380380780380700380E003C1C0072380071E000700000700000E00000E00000E00000E00
+001C00001C0000FFC000171D819317>112 D<00C000E001C001C001C001C003800380FFF80380
+07000700070007000E000E000E000E001C001C001C001C10382038203820384018800F000D1C7F
+9B10>116 D<0F00601180702180E021C0E041C0E04380E08381C00701C00701C00701C00E0380
+0E03800E03800E03840E07080C07080C07080E0F1006131003E1E016147E931A>I<0F01801183
+C02183E021C1E041C0E04380608380400700400700400700400E00800E00800E00800E01000E01
+000C02000E04000E040006180001E00013147E9316>I<03C1C00C62201034701038F02038F020
+386040700000700000700000700000E00000E00000E00000E02061C040F1C040F1C080E2C08044
+6300383C0014147E931A>120 D E /Fi 86 127 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8
+70000000000070F8F8F870051C779B18>33 D<4010E038F078E038E038E038E038E038E038E038
+E038E038E03860300D0E7B9C18>I<00C00001C00001C00001C00003F0000FFC003FFE007DCF00
+71C700E1C380E1C780E1C780E1C780F1C00079C0003DC0001FE0000FF80003FC0001DE0001CF00
+01C70061C380F1C380F1C380E1C380E1C70071C70079DE003FFE001FF80007E00001C00001C000
+01C00000C00011247D9F18>36 D<3803007C07807C0780EE0F80EE0F00EE0F00EE1F00EE1E00EE
+1E00EE3E007C3C007C3C00387C0000780000780000F80000F00001F00001E00001E00003E00003
+C00003C00007C0000783800787C00F87C00F0EE00F0EE01F0EE01E0EE01E0EE03E0EE03C07C03C
+07C018038013247E9F18>I<01C00007E0000FF0000E70001C38001C38001C38001C38001C73F0
+1C73F01CE3F00FE3800FC7000F87000F07001F0E003F0E007B8E0073DC00E1DC00E0F800E0F800
+E07070E0787070FC707FFFE03FCFE00F03C0141C7F9B18>I<387C7C7E3E0E0E0E1C1C38F8F0C0
+070E789B18>I<007000F001E003C007800F001E001C00380038007000700070007000E000E000
+E000E000E000E000E000E0007000700070007000380038001C001E000F00078003C001F000F000
+700C24799F18>I<6000F00078003C001E000F000780038001C001C000E000E000E000E0007000
+7000700070007000700070007000E000E000E000E001C001C0038007800F001E003C007800F000
+60000C247C9F18>I<01C00001C00001C00001C000C1C180F1C780F9CF807FFF001FFC0007F000
+07F0001FFC007FFF00F9CF80F1C780C1C18001C00001C00001C00001C00011147D9718>I<0060
+0000F00000F00000F00000F00000F00000F00000F0007FFFC0FFFFE0FFFFE07FFFC000F00000F0
+0000F00000F00000F00000F00000F00000600013147E9718>I<1C3E7E7F3F1F070E1E7CF86008
+0C788518>I<7FFF00FFFF80FFFF807FFF0011047D8F18>I<3078FCFC78300606778518>I<0003
+00000780000780000F80000F00001F00001E00001E00003E00003C00007C0000780000780000F8
+0000F00001F00001E00003E00003C00003C00007C0000780000F80000F00000F00001F00001E00
+003E00003C00003C00007C0000780000F80000F00000F0000060000011247D9F18>I<01F00007
+FC000FFE001F1F001C07003803807803C07001C07001C0E000E0E000E0E000E0E000E0E000E0E0
+00E0E000E0E000E0E000E0F001E07001C07001C07803C03803801C07001F1F000FFE0007FC0001
+F000131C7E9B18>I<01800380038007800F803F80FF80FB804380038003800380038003800380
+03800380038003800380038003800380038003807FFCFFFE7FFC0F1C7B9B18>I<03F0000FFE00
+3FFF007C0F807003C0E001C0F000E0F000E06000E00000E00000E00001C00001C00003C0000780
+000F00001E00003C0000780000F00001E00007C0000F80001E00E03C00E07FFFE0FFFFE07FFFE0
+131C7E9B18>I<07F8001FFE003FFF007807807803C07801C03001C00001C00003C0000380000F
+0003FF0003FE0003FF000007800003C00001C00000E00000E00000E0F000E0F000E0F001C0F003
+C07C07803FFF001FFE0003F800131C7E9B18>I<001F00003F0000770000770000E70001E70001
+C7000387000787000707000E07001E07003C0700380700780700F00700FFFFF8FFFFF8FFFFF800
+0700000700000700000700000700000700007FF000FFF8007FF0151C7F9B18>I<1FFF803FFF80
+3FFF803800003800003800003800003800003800003800003800003BF8003FFE003FFF003C0780
+1803C00001C00000E00000E06000E0F000E0F000E0E001C07003C07C0F803FFF001FFC0003F000
+131C7E9B18>I<007E0001FF0007FF800F83C01E03C01C03C0380180380000700000700000E1F8
+00E7FE00FFFF00FE0780F803C0F001C0F000E0E000E0F000E07000E07000E07000E03801C03C03
+C01E07800FFF0007FE0001F800131C7E9B18>I<E00000FFFFE0FFFFE0FFFFE0E003C0E0078000
+0700000E00001E00001C0000380000380000700000700000E00000E00000E00001C00001C00001
+C00001C00003C000038000038000038000038000038000038000038000131D7E9C18>I<03F800
+0FFE001FFF003E0F803803807001C07001C07001C07001C03803803C07801FFF0007FC000FFE00
+1F1F003C07807001C0F001E0E000E0E000E0E000E0E000E07001C07803C03E0F801FFF000FFE00
+03F800131C7E9B18>I<03F0000FFC001FFE003C0F00780780700380E001C0E001C0E001C0E001
+E0E001E07001E07803E03C0FE01FFFE00FFEE003F0E00000E00001C00001C00001C03003807807
+80780F00783E003FFC001FF00007C000131C7E9B18>I<3078FCFC783000000000000000003078
+FCFC78300614779318>I<183C7E7E3C180000000000000000183C7E7E3E1E0E1C3C78F060071A
+789318>I<000300000780001F80003F00007E0001FC0003F00007E0001FC0003F00007E0000FC
+0000FC00007E00003F00001FC00007E00003F00001FC00007E00003F00001F8000078000030011
+187D9918>I<7FFFC0FFFFE0FFFFE0FFFFE0000000000000000000000000FFFFE0FFFFE0FFFFE0
+7FFFC0130C7E9318>I<600000F00000FC00007E00003F00001FC00007E00003F00001FC00007E
+00003F00001F80001F80003F00007E0001FC0003F00007E0001FC0003F00007E0000FC0000F000
+0060000011187D9918>I<007C0001FE0007FF000F87801E03C03C1DC0387FC070FFE071E3E071
+C1E0E1C1E0E380E0E380E0E380E0E380E0E380E0E380E0E1C1C071C1C071E3C070FF80387F003C
+1C001E00E00F83E007FFC001FF80007E00131C7E9B18>64 D<00700000F80000F80000D80000D8
+0001DC0001DC0001DC00018C00038E00038E00038E00038E000306000707000707000707000707
+000FFF800FFF800FFF800E03800E03801C01C01C01C07F07F0FF8FF87F07F0151C7F9B18>I<FF
+FC00FFFF00FFFF801C03C01C01C01C00E01C00E01C00E01C00E01C01E01C01C01C07C01FFF801F
+FF001FFFC01C03C01C00E01C00F01C00701C00701C00701C00701C00F01C00E01C03E0FFFFC0FF
+FF80FFFE00141C7F9B18>I<00F8E003FEE007FFE00F07E01E03E03C01E03800E07000E07000E0
+700000E00000E00000E00000E00000E00000E00000E00000E000007000007000E07000E03800E0
+3C00E01E01C00F07C007FF8003FE0000F800131C7E9B18>I<7FF800FFFE007FFF001C0F801C03
+C01C03C01C01E01C00E01C00E01C00F01C00701C00701C00701C00701C00701C00701C00701C00
+701C00F01C00E01C00E01C01E01C01C01C03C01C0F807FFF00FFFE007FF800141C7F9B18>I<FF
+FFF0FFFFF0FFFFF01C00701C00701C00701C00701C00001C00001C0E001C0E001C0E001FFE001F
+FE001FFE001C0E001C0E001C0E001C00001C00001C00381C00381C00381C00381C0038FFFFF8FF
+FFF8FFFFF8151C7F9B18>I<FFFFE0FFFFE0FFFFE01C00E01C00E01C00E01C00E01C00001C0000
+1C1C001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C1C001C00001C00001C00001C0000
+1C00001C00001C0000FFC000FFC000FFC000131C7E9B18>I<01F1C003FDC00FFFC01F0FC01C03
+C03803C03801C07001C07001C0700000E00000E00000E00000E00000E00000E00FF0E01FF0E00F
+F07001C07001C07003C03803C03803C01C07C01F0FC00FFFC003FDC001F1C0141C7E9B18>I<7F
+07F0FF8FF87F07F01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01FFFC01F
+FFC01FFFC01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C07F07F0FF
+8FF87F07F0151C7F9B18>I<7FFF00FFFF807FFF0001C00001C00001C00001C00001C00001C000
+01C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000
+01C00001C00001C0007FFF00FFFF807FFF00111C7D9B18>I<7FE000FFE0007FE0000E00000E00
+000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00
+000E00000E00000E00700E00700E00700E00700E00707FFFF0FFFFF07FFFF0141C7F9B18>76
+D<FC01F8FE03F8FE03F83B06E03B06E03B06E03B06E03B8EE03B8EE0398CE0398CE039DCE039DC
+E039DCE038D8E038D8E038F8E03870E03870E03800E03800E03800E03800E03800E03800E0FE03
+F8FE03F8FE03F8151C7F9B18>I<7E07F0FF0FF87F07F01D81C01D81C01D81C01DC1C01CC1C01C
+C1C01CE1C01CE1C01CE1C01C61C01C71C01C71C01C31C01C39C01C39C01C39C01C19C01C19C01C
+1DC01C0DC01C0DC01C0DC07F07C0FF87C07F03C0151C7F9B18>I<0FF8003FFE007FFF00780F00
+700700F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380
+E00380E00380E00380E00380E00380F00780700700780F007FFF003FFE000FF800111C7D9B18>
+I<FFFE00FFFF80FFFFC01C03C01C01E01C00E01C00701C00701C00701C00701C00701C00E01C01
+E01C03C01FFFC01FFF801FFE001C00001C00001C00001C00001C00001C00001C00001C0000FF80
+00FF8000FF8000141C7F9B18>I<7FF800FFFE007FFF001C0F801C03801C03C01C01C01C01C01C
+01C01C03C01C03801C0F801FFF001FFE001FFE001C0F001C07001C03801C03801C03801C03801C
+03801C039C1C039C1C039C7F01F8FF81F87F00F0161C7F9B18>82 D<03F3801FFF803FFF807C0F
+80700780E00380E00380E00380E000007000007800003F00001FF00007FE0000FF00000F800003
+C00001C00000E00000E06000E0E000E0E001E0F001C0F80780FFFF80FFFE00E7F800131C7E9B18
+>I<7FFFF8FFFFF8FFFFF8E07038E07038E07038E0703800700000700000700000700000700000
+700000700000700000700000700000700000700000700000700000700000700000700000700007
+FF0007FF0007FF00151C7F9B18>I<FF07F8FF07F8FF07F81C01C01C01C01C01C01C01C00E0380
+0E03800E03800E03800F0780070700070700070700070700038E00038E00038E00038E00018C00
+01DC0001DC0001DC0000D80000F80000F800007000151C7F9B18>86 D<FE03F8FE03F8FE03F870
+00707000707000703800E03800E03800E03800E03800E038F8E038F8E039DCE039DCE019DCC019
+DCC019DCC0198CC01D8DC01D8DC01D8DC01D8DC00D8D800D05800F07800F07800E0380151C7F9B
+18>I<7F8FE07F9FE07F8FE00E07000F0700070E00078E00039C0003DC0001F80001F80000F000
+00F00000700000F00000F80001F80001DC00039E00038E00070F000707000E07800E03801E03C0
+7F07F0FF8FF87F07F0151C7F9B18>I<FFF8FFF8FFF8E000E000E000E000E000E000E000E000E0
+00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000
+E000E000FFF8FFF8FFF80D24779F18>91 D<600000F00000F00000F800007800007C00003C0000
+3C00003E00001E00001F00000F00000F00000F800007800007C00003C00003C00003E00001E000
+01F00000F00000F800007800007800007C00003C00003E00001E00001E00001F00000F00000F80
+00078000078000030011247D9F18>I<FFF8FFF8FFF80038003800380038003800380038003800
+380038003800380038003800380038003800380038003800380038003800380038003800380038
+00380038FFF8FFF8FFF80D247F9F18>I<018007C01FF07EFCF83EE00E0F067C9B18>I<7FFF00FF
+FF80FFFF807FFF0011047D7F18>I<061E3E387070E0E0E0F8FC7C7C38070E789E18>I<1FE0003F
+F8007FFC00781E00300E0000070000070000FF0007FF001FFF007F0700780700E00700E00700E0
+0700F00F00781F003FFFF01FFBF007E1F014147D9318>I<7E0000FE00007E00000E00000E0000
+0E00000E00000E00000E3E000EFF800FFFC00FC1E00F80E00F00700E00700E00380E00380E0038
+0E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF80063E00151C809B18>I<01FE
+0007FF001FFF803E0780380300700000700000E00000E00000E00000E00000E00000E000007000
+007001C03801C03E03C01FFF8007FF0001FC0012147D9318>I<001F80003F80001F8000038000
+038000038000038000038003E3800FFB801FFF803C1F80380F80700780700380E00380E00380E0
+0380E00380E00380E00380700780700780380F803C1F801FFFF00FFBF803E3F0151C7E9B18>I<
+01F00007FC001FFE003E0F00380780700380700380E001C0E001C0FFFFC0FFFFC0FFFFC0E00000
+7000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>I<001F80007FC000FFE000E1
+E001C0C001C00001C00001C0007FFFC0FFFFC0FFFFC001C00001C00001C00001C00001C00001C0
+0001C00001C00001C00001C00001C00001C00001C00001C0007FFF007FFF007FFF00131C7F9B18
+>I<01E1F007FFF80FFFF81E1E301C0E003807003807003807003807003807001C0E001E1E001F
+FC001FF80039E0003800001C00001FFE001FFFC03FFFE07801F0700070E00038E00038E00038E0
+00387800F07E03F01FFFC00FFF8001FC00151F7F9318>I<7E0000FE00007E00000E00000E0000
+0E00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E0
+0E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3FC171C809B18>I<0380
+0007C00007C00007C0000380000000000000000000000000007FC000FFC0007FC00001C00001C0
+0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000FFFF
+00FFFF80FFFF00111D7C9C18>I<0038007C007C007C003800000000000000000FFC1FFC0FFC00
+1C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C
+001C001C6038F078FFF07FE03F800E277E9C18>I<FE0000FE0000FE00000E00000E00000E0000
+0E00000E00000E3FF00E7FF00E3FF00E07800E0F000E1E000E3C000E78000EF0000FF8000FFC00
+0F9C000F0E000E0F000E07000E03800E03C0FFC7F8FFC7F8FFC7F8151C7F9B18>I<7FE000FFE0
+007FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0
+0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0007FFFC0FFFFE07FFF
+C0131C7E9B18>I<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E1C001C1C1C001C1C1C
+001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C007F1F
+1F00FFBFBF807F1F1F001914819318>I<7E3E00FEFF807FFFC00FC1C00F80E00F00E00E00E00E
+00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3FC17
+14809318>I<01F0000FFE001FFF003E0F803803807001C07001C0E000E0E000E0E000E0E000E0
+E000E0F001E07001C07803C03C07803E0F801FFF000FFE0001F00013147E9318>I<7E3E00FEFF
+807FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E00380E00380E00380F00700F00
+700F80E00FC1E00FFFC00EFF800E3E000E00000E00000E00000E00000E00000E00000E00007FC0
+00FFE0007FC000151E809318>I<01E38007FB801FFF803E1F80380F80700780700780E00380E0
+0380E00380E00380E00380E00380700780700780380F803C1F801FFF800FFB8003E38000038000
+0380000380000380000380000380000380003FF8003FF8003FF8151E7E9318>I<7F87E0FF9FF0
+7FBFF803F87803F03003E00003C00003C000038000038000038000038000038000038000038000
+0380000380007FFE00FFFF007FFE0015147F9318>I<07F7003FFF007FFF00780F00E00700E007
+00E007007C00007FE0001FFC0003FE00001F00600780E00380E00380F00380F80F00FFFF00FFFC
+00E7F00011147D9318>I<0180000380000380000380000380007FFFC0FFFFC0FFFFC003800003
+80000380000380000380000380000380000380000380000380400380E00380E00380E001C1C001
+FFC000FF80003E0013197F9818>I<7E07E0FE0FE07E07E00E00E00E00E00E00E00E00E00E00E0
+0E00E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FFFE01FCFC171480
+9318>I<7F8FF0FF8FF87F8FF01E03C00E03800E03800E0380070700070700070700038E00038E
+00038E00038E0001DC0001DC0001DC0000F80000F80000700015147F9318>I<FF8FF8FF8FF8FF
+8FF83800E03800E03800E01C01C01C01C01C71C01CF9C01CF9C01CD9C01CD9C00DDD800DDD800D
+DD800D8D800F8F800F8F8007070015147F9318>I<7F8FF07F9FF07F8FF0070700078E00039E00
+01DC0001F80000F80000700000F00000F80001DC00039E00038E000707000F07807F8FF0FF8FF8
+7F8FF015147F9318>I<7F8FF0FF8FF87F8FF00E01C00E03800E03800703800707000707000387
+00038600038E0001CE0001CE0000CC0000CC0000DC000078000078000078000070000070000070
+0000F00000E00079E0007BC0007F80003F00001E0000151E7F9318>I<3FFFF07FFFF07FFFF070
+01E07003C0700780000F00001E00003C0000F80001F00003C0000780000F00701E00703C007078
+0070FFFFF0FFFFF0FFFFF014147F9318>I<0007E0001FE0007FE000780000E00000E00000E000
+00E00000E00000E00000E00000E00000E00000E00000E00001E0007FC000FF8000FF80007FC000
+01E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000007800
+007FE0001FE00007E013247E9F18>I<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0
+F0F0F0F0F0F0F0F0F0F0F0F0600424769F18>I<7C0000FF0000FFC00003C00000E00000E00000
+E00000E00000E00000E00000E00000E00000E00000E00000E00000F000007FC0003FE0003FE000
+7FC000F00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00003
+C000FFC000FF00007C000013247E9F18>I<060C1F1E3FBEFBF8F1F060C00F067C9B18>I
+E /Fj 59 123 df<0003E0001C1800381800703C00E03C00E03801C00001C00001C00001C00001
+C0000380007FFFF00380700380700380700380700700E00700E00700E00700E00700E00700E00E
+01C00E01C00E01C00E01C00E01C00E01C01C03801E03C0FF0FF816207E9F19>12
+D<381C7C3E7C3E7E3F3A1D040204020402080408041008201040208040100E7A9F17>34
+D<1C3E7E7E3A0202040408081020C0070E7D840D>44 D<FFC0FFC00A027D8A0F>I<3078F87870
+05057C840D>I<00000400000C00000C0000180000180000300000300000600000600000C00000
+C0000180000180000300000300000600000600000C00000C000018000018000030000030000060
+0000600000C00000C0000180000180000300000300000600000600000600000C00000C00001800
+00180000300000300000600000600000C00000C00000800000162D7EA117>I<000C001C00FC0F
+380038003800380038003800700070007000700070007000E000E000E000E000E000E001C001C0
+01C001C001C001C0038003C0FFFE0F1E7C9D17>49 D<003F8000C1E00100F00200780400780400
+780F007C0F807C0F807C0F00780600780000F80000F00001E00001C0000380000700000E00001C
+0000380000600000C0000180000300200600200800401000403FFFC07FFF80FFFF80161E7E9D17
+>I<007F000183C00201E00400F00700F00F00F00F01F00F01F00001E00001E00003C000038000
+0700000E0000F800000E000007000007800007C00003C00007C03007C07807C0F807C0F807C0F0
+0780800F00400E00201C0018780007E000141F7D9D17>I<0000600000600000E00001C00003C0
+0005C0000DC00009C00011C000238000438000C380008380010380020380040700080700180700
+100700200700400700FFFFF0000E00000E00000E00000E00000E00001C00001E0001FFE0141E7E
+9D17>I<01803001FFE003FFC003FF0003FC00020000020000020000040000040000040000047C
+000587000603800C01800801C00001C00001E00001E00001E00001E07003C0F803C0F003C0E003
+80800780400700400E00201C0018700007C000141F7D9D17>I<000F8000704000C0200180E003
+01E00701E00E00C01E00001C00003C000038000078F800790E007A07007C0300F80380F80380F0
+03C0F003C0F003C0F003C0F00780E00780E00780E00700E00F00600E00701C0030180018700007
+C000131F7C9D17>I<2000003FFFE07FFFC07FFF80400100C00200800200800400000800001000
+0020000040000040000080000180000300000300000700000600000E00000E00001E00001C0000
+1C00003C00003C00003C0000780000780000780000300000131F799D17>I<003F0000C1C00100
+600200600400300C00300C00300C00300C00600E00600F80C00FC18007F60003FC0001FC0001FF
+00063F800C0F801007C03003C06001C06000C0C000C0C000C0C000C0C00080C001006003003004
+0018180007E000141F7D9D17>I<007E0001C3000301800601C00E01C01C00C03C00E03C00E03C
+01E07801E07801E07801E07801E07803E07803E03803C03807C01C0BC00C13C003E38000078000
+0780000700000E00600E00F01C00F01800E0300080600041C0003F0000131F7C9D17>I<000010
+0000001800000038000000380000007800000078000000FC000001BC0000013C0000033C000002
+3C0000063C0000043E0000081E0000081E0000101E0000101E0000201E0000200F0000400F0000
+400F0000FFFF0000800F0001000F8001000780020007800200078004000780040007800C0007C0
+3E0007C0FF807FFC1E207E9F22>65 D<07FFFF00007C01C0003C01E0003C00F0007800F8007800
+F8007800F8007800F8007800F8007800F000F001F000F001E000F003C000F00F8000FFFE0000F0
+0F0001E007C001E003C001E003E001E001E001E001E001E001E003C001E003C003E003C003E003
+C003C003C007C003C00F8007800F0007803E00FFFFF0001D1F7E9E20>I<0001F808000E061800
+380138007000F801E0007803C0007007800030078000300F0000301F0000301E0000303E000020
+3C0000007C0000007C0000007C0000007C000000F8000000F8000000F8000000F8000000F80000
+007800004078000080780000803C0000803C0001001C0002000E00020006000C000300100001C0
+E000003F00001D217B9F21>I<07FFFF00007C01E0003C00F0003C00780078003C0078003C0078
+001E0078001E0078001E0078001F00F0001F00F0001F00F0001F00F0001F00F0001F00F0001F01
+E0001E01E0003E01E0003E01E0003E01E0003C01E0007C03C0007803C000F003C000F003C001E0
+03C003C003C0078007800F0007803C00FFFFE000201F7E9E23>I<07FFFFF8007C0078003C0038
+003C001800780018007800080078000800780008007800080078080800F0100000F0100000F010
+0000F0300000FFF00000F0700001E0200001E0200001E0200001E0200001E0000801E0001003C0
+001003C0001003C0002003C0002003C0006003C000C0078001C0078007C0FFFFFF801D1F7E9E1F
+>I<07FFFFF8007C0078003C0038003C0018007800180078000800780008007800080078000800
+78000800F0100000F0100000F0100000F0300000F0700000FFF00001E0600001E0200001E02000
+01E0200001E0200001E0000003C0000003C0000003C0000003C0000003C0000003C00000078000
+0007C00000FFFE00001D1F7E9E1E>I<0001FC04000F030C003C009C0070007C00E0003C01C000
+3803800018078000180F0000181F0000181E0000183E0000103C0000007C0000007C0000007C00
+00007C000000F8000000F8000000F8007FFCF80003E0780001E0780001E0780003C0780003C03C
+0003C03C0003C01C0003C00E0007C007000B800380118001E06080003F80001E217B9F24>I<07
+FFC7FFC0007C00F800003C007800003C007800007800F000007800F000007800F000007800F000
+007800F000007800F00000F001E00000F001E00000F001E00000F001E00000FFFFE00000F001E0
+0001E003C00001E003C00001E003C00001E003C00001E003C00001E003C00003C007800003C007
+800003C007800003C007800003C007800003C007800007800F000007C00F8000FFF8FFF800221F
+7E9E22>I<07FFE0007C00003C00003C0000780000780000780000780000780000780000F00000
+F00000F00000F00000F00000F00001E00001E00001E00001E00001E00001E00003C00003C00003
+C00003C00003C00003C00007800007C000FFFC00131F7F9E10>I<07FFF000007E0000003C0000
+003C000000780000007800000078000000780000007800000078000000F0000000F0000000F000
+0000F0000000F0000000F0000001E0000001E0000001E0000001E0000001E0008001E0010003C0
+010003C0010003C0030003C0020003C0060003C0060007801E0007807C00FFFFFC00191F7E9E1C
+>76 D<07FC0000FFC0007C0000F800003C00017800003C00017800004E0002F000004E0002F000
+004E0004F000004E0004F000004E0008F000004E0008F00000870011E00000870011E000008700
+21E00000870021E00000870041E00000838041E00001038083C00001038083C00001038103C000
+01038203C0000101C203C0000101C403C0000201C40780000201C80780000201C80780000201D0
+0780000200F00780000600E00780000600E00F00000F00C00F8000FFE0C1FFF8002A1F7E9E2A>
+I<07FC01FFC0003E003E00003E001800003E001800004F001000004F0010000047801000004780
+10000043C010000043C010000083C020000081E020000081E020000080F020000080F020000080
+782000010078400001007C400001003C400001003C400001001E400001001E400002000F800002
+000F800002000F800002000780000200078000060003800006000300000F00010000FFE0010000
+221F7E9E22>I<0003F800001E0E000038070000E0038001C001C003C001E0078000E00F0000F0
+0F0000F01E0000F01E0000F83E0000F83C0000F87C0000F87C0000F87C0000F87C0000F8F80001
+F0F80001F0F80001F0F80001F0F80003E0780003E0780003C0780007C07C0007803C000F003C00
+1E001E001C000E0038000700F00003C3C00000FE00001D217B9F23>I<07FFFF00007C03C0003C
+01E0003C00F0007800F0007800F8007800F8007800F8007800F8007800F000F001F000F001E000
+F003C000F0078000F00F0000FFF80001E0000001E0000001E0000001E0000001E0000001E00000
+03C0000003C0000003C0000003C0000003C0000003C000000780000007C00000FFFC00001D1F7E
+9E1F>I<07FFFC00007C0700003C03C0003C01E0007801E0007801F0007801F0007801F0007801
+F0007801E000F003E000F003C000F0078000F00F0000F03C0000FFF00001E0300001E0380001E0
+1C0001E01C0001E01C0001E01E0003C03E0003C03E0003C03E0003C03E0003C03E0003C03E0207
+803E0407C01F04FFFC0F18000003E01F207E9E21>82 D<003F040060CC01803C03801C03001C07
+00180600080E00080E00080E00080E00000F00000F80000FE00007FE0003FF8001FFC0007FE000
+07E00001E00000E00000F00000F04000E04000E04000E04000E06000C0600180E00380F80300C6
+0C0081F80016217D9F19>I<3FFFFFF03C0780F03007803060078030400F0010400F0010C00F00
+10800F0010800F0010800F0010001E0000001E0000001E0000001E0000001E0000001E0000003C
+0000003C0000003C0000003C0000003C0000003C00000078000000780000007800000078000000
+7800000078000000F0000001F800007FFFE0001C1F7A9E21>I<FFFC3FF80F8007C00780030007
+8003000F0002000F0002000F0002000F0002000F0002000F0002001E0004001E0004001E000400
+1E0004001E0004001E0004003C0008003C0008003C0008003C0008003C0008003C000800380010
+003800100038001000380020003C0040001C0040001C0080000E0100000706000001F800001D20
+799E22>I<FFF003FE1F8000F80F0000600F0000400F0000400F80008007800180078001000780
+02000780020007C0040003C0040003C0080003C0080003C0100003E0100001E0200001E0200001
+E0400001E0400001F0800000F1000000F1000000F2000000F2000000FC0000007C000000780000
+007800000070000000700000002000001F207A9E22>I<03FFC0FFC0007F007E00003E00380000
+1E003000001E002000000F004000000F008000000F81000000078200000007C600000003C40000
+0003E800000001F000000001F000000000F000000000F800000000F8000000017C000000023C00
+0000043C0000000C1E000000081E000000101F000000200F000000400F800000C0078000008007
+C000010003C000070003E0001F8007E000FFE01FFE00221F7F9E22>88 D<FFF003FF1F8000F80F
+0000600F8000400780008007C0018003C0010003E0020001E0040001F00C0001F0080000F01000
+00F8200000786000007C4000003C8000003F0000001F0000001E0000001E0000001E0000001C00
+00003C0000003C0000003C0000003C0000003C00000038000000780000007C00000FFFC000201F
+7A9E22>I<060308041008201020104020402080408040B85CF87CF87CF87C7038100E779F17>
+92 D<07F8000C0C001E06001E07001C070000070000070000070000FF0007C7001E07003C0E00
+780E00F00E10F00E10F00E10F01E10F02E20784F401F878014147D9317>97
+D<0700003F00000F00000700000700000E00000E00000E00000E00000E00000E00001C00001C7C
+001D87001E03801C01C01C01C03801C03801E03801E03801E03801E03801E07003C07003C07003
+80700780700700700E00E81C00C4380083E00013207B9F19>I<01FC07060E0F1C0F380E780070
+00F000F000F000F000E000E000E000E000F0027004300818300FC010147C9314>I<0000700003
+F00000F00000700000700000E00000E00000E00000E00000E00000E00001C000F9C00305C00E03
+C01C03C03801C0780380700380F00380F00380F00380F00380E00700E00700E00700E00700E007
+00700F00301E00186F000F8FE014207C9F19>I<00F800070E000E07001C070038038078038070
+0380F00380F00380FFFF80F00000E00000E00000E00000E00000F001007002003004001C180007
+E00011147D9314>I<0007800018C00031E00061E000E1C000C00001C00001C00001C00001C000
+01C0000380007FF800038000038000038000038000070000070000070000070000070000070000
+0E00000E00000E00000E00000E00000E00001C00001E0000FFE00013207E9F0E>I<00000E003E
+1100E1A301C1C20381E00780E00701E00F01E00F01E00F01E00703C007038007870004FC000800
+000800001800001C00000FFF000FFFC007FFE01800F0300030600030C00030C00030C000306000
+603000C01C070007FC00181F809417>I<00E00007E00001E00000E00000E00001C00001C00001
+C00001C00001C00001C000038000038F800390E003A0E003C0600380600780E00700E00700E007
+00E00700E00700E00E01C00E01C00E01C00E01C00E01C00E01C01C03801E03C0FFCFF815207E9F
+19>I<01C003E003E003C0018000000000000000000000000003801F8007800380038007000700
+07000700070007000E000E000E000E000E000E001C001E00FF800B1F7F9E0C>I<00E007E001E0
+00E000E001C001C001C001C001C001C00380038003800380038003800700070007000700070007
+000E000E000E000E000E000E001C001E00FFC00B207F9F0C>108 D<0387C07C001F9861860007
+A072070003C0340300038038030007807807000700700700070070070007007007000700700700
+07007007000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E001C01C01C
+001E01E01E00FFCFFCFFC022147E9326>I<038F801F90E007A0E003C0600380600780E00700E0
+0700E00700E00700E00700E00E01C00E01C00E01C00E01C00E01C00E01C01C03801E03C0FFCFF8
+15147E9319>I<00FC000387000E01801C00C03800E03800E07000F0F000F0F000F0F000F0F000
+F0E001E0E001E0E001C0E003C0F00380700700380E001C1C0007E00014147D9317>I<00E3E007
+EC3800F01C00E01E00E00E01C00E01C00F01C00F01C00F01C00F01C00F03801E03801E03801C03
+803C0380380380700740E00721C0071F000700000700000700000E00000E00000E00000E00001E
+0000FFC000181D809319>I<038E001FB38007C78003C780038300078000070000070000070000
+0700000700000E00000E00000E00000E00000E00000E00001C00001E0000FFE00011147E9312>
+114 D<01F2060E080618061802380438001E001FE00FF003F8003C401C400C400C600C6018E010
+D0608FC00F147E9312>I<0080010001000100030007000F001E00FFF80E000E000E000E001C00
+1C001C001C001C001C00380038203820382038203840384018800F000D1C7C9B12>I<1C0380FC
+1F803C07801C03801C0380380700380700380700380700380700380700700E00700E00700E0070
+0E00701E00701E00703C00305E001F9FC012147B9319>I<FF83F81E00E01C00C01C00800E0080
+0E01000E02000E02000F040007040007080007080007100003900003A00003E00003C000038000
+01800001000015147C9318>I<1FF0FF03C07801C06001C04000E08000E180007300007600003C
+00003C00001C00002E00004E000087000107000203800603800C01C03E03E0FF07FC18147F9318
+>120 D<0FF83F8001E00E0001C00C0001C0080000E0180000E0100000E0200000E0200000F040
+000070400000708000007080000071000000390000003A0000003E0000003C0000003800000018
+0000001000000010000000200000002000000040000070C00000F0800000F1000000E20000007C
+000000191D809318>I<07FFE00701E00401C00C0380080700080E00101C000038000070000070
+0000E00001C0000380800700800E00801C01001C0100380300700E00FFFE0013147F9314>I
+E /Fk 55 123 df<00FC7C0183C607078E0607040E07000E07000E07000E07000E07000E0700FF
+FFF00E07000E07000E07000E07000E07000E07000E07000E07000E07000E07000E07000E07000E
+07000E07007F0FF0171A809916>11 D<00FC000182000703000607000E02000E00000E00000E00
+000E00000E0000FFFF000E07000E07000E07000E07000E07000E07000E07000E07000E07000E07
+000E07000E07000E07000E07007F0FE0131A809915>I<60F0F0F0F0F0F0606060606060606060
+60200000000060F0F060041A7D990B>33 D<60C0F1E0F9F068D0081008100810102010202040C1
+800C0B7F9913>I<60F0F868080808101020C0050B7D990B>39 D<00800100020004000C000800
+18003000300030006000600060006000E000E000E000E000E000E000E000E000E000E000600060
+0060006000300030003000180008000C00040002000100008009267D9B0F>I<80004000200010
+00180008000C000600060006000300030003000300038003800380038003800380038003800380
+038003000300030003000600060006000C0008001800100020004000800009267E9B0F>I<60F0
+F07010101020204080040B7D830B>44 D<FFC0FFC00A0280880D>I<60F0F06004047D830B>I<01
+E006100C1818383038300070006000E000E7C0E860F030F018E018E01CE01CE01C601C601C7018
+30183030186007C00E187E9713>54 D<078018603030201860186018601870103C303E600F8007
+C019F030F86038401CC00CC00CC00CC00C6008201018600FC00E187E9713>56
+D<60F0F060000000000000000060F0F06004107D8F0B>58 D<60F0F060000000000000000060F0
+F0701010102020408004177D8F0B>I<000C0000000C0000000C0000001E0000001E0000003F00
+0000270000002700000043800000438000004380000081C0000081C0000081C0000100E0000100
+E00001FFE000020070000200700006007800040038000400380008001C0008001C001C001E00FF
+00FFC01A1A7F991D>65 D<FFFF000E01C00E00E00E00700E00780E00780E00780E00780E00780E
+00F00E00E00E03C00FFF800E01E00E00700E00780E003C0E003C0E003C0E003C0E003C0E00380E
+00780E00F00E01E0FFFF80161A7E991B>I<003F0201C0C603002E0E001E1C000E1C0006380006
+780002700002700002F00000F00000F00000F00000F00000F00000700002700002780002380004
+1C00041C00080E000803003001C0C0003F00171A7E991C>I<FFFFE00E00E00E00600E00200E00
+300E00100E00100E00100E04000E04000E04000E0C000FFC000E0C000E04000E04000E04000E00
+000E00000E00000E00000E00000E00000E00000E0000FFF000141A7E9919>70
+D<FFE7FF0E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700FFF
+F00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7
+FF181A7E991D>72 D<FFE00E000E000E000E000E000E000E000E000E000E000E000E000E000E00
+0E000E000E000E000E000E000E000E000E000E00FFE00B1A7F990E>I<FFF0000E00000E00000E
+00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E
+00000E00200E00200E00200E00600E00400E00400E00C00E03C0FFFFC0131A7E9918>76
+D<FF0003FC0F0003C00F0003C00B8005C00B8005C00B8005C009C009C009C009C009C009C008E0
+11C008E011C008E011C0087021C0087021C0083841C0083841C0083841C0081C81C0081C81C008
+1C81C0080F01C0080F01C0080F01C0080601C01C0601C0FF861FFC1E1A7E9923>I<FE01FF0F00
+380F00100B80100B801009C01008E01008E010087010087010083810081C10081C10080E10080E
+100807100803900803900801D00801D00800F00800700800700800301C0030FF8010181A7E991D
+>I<FFFF000E03C00E00E00E00700E00700E00780E00780E00780E00780E00700E00700E00E00E
+03C00FFF000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000FF
+E000151A7E991A>80 D<FFFC00000E0780000E01C0000E00E0000E00F0000E00F0000E00F0000E
+00F0000E00F0000E00E0000E01C0000E0780000FFC00000E0600000E0300000E0180000E01C000
+0E01C0000E01C0000E01E0000E01E0000E01E0000E01E0800E00F0800E007100FFE03E00191A7E
+991C>82 D<0FC21836200E6006C006C002C002C002E00070007E003FE01FF807FC003E000E0007
+0003800380038003C002C006E004D81887E0101A7E9915>I<7FFFFF00701C0700401C0100401C
+0100C01C0180801C0080801C0080801C0080001C0000001C0000001C0000001C0000001C000000
+1C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000
+001C0000001C000003FFE000191A7F991C>I<FF83FF0FF03C007801C01C007800801C00780080
+0E007801000E007801000E009C010007009C020007009C020007010E020007010E020003810E04
+000382070400038207040001C207080001C403880001C403880000E403900000E403900000E801
+D000007801E000007801E000007000E000007000E000003000C0000020004000241A7F9927>87
+D<1830204040804080810081008100B160F9F078F030600C0B7B9913>92
+D<3F8070C070E020700070007007F01C7030707070E070E071E071E0F171FB1E3C10107E8F13>
+97 D<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001CF8001F0E00
+1E07001C03801C01801C01C01C01C01C01C01C01C01C01C01C01C01C03801C03001E07001B0C00
+10F000121A7F9915>I<07F80C1C381C30087000E000E000E000E000E000E0007000300438080C
+1807E00E107F8F11>I<007E00000E00000E00000E00000E00000E00000E00000E00000E00000E
+0003CE000C3E00380E00300E00700E00E00E00E00E00E00E00E00E00E00E00E00E00600E00700E
+00381E001C2E0007CFC0121A7F9915>I<07C01C3030187018600CE00CFFFCE000E000E000E000
+6000300438080C1807E00E107F8F11>I<01F0031807380E100E000E000E000E000E000E00FFC0
+0E000E000E000E000E000E000E000E000E000E000E000E000E000E007FE00D1A80990C>I<0FCE
+187330307038703870387038303018602FC02000600070003FF03FFC1FFE600FC003C003C003C0
+036006381C07E010187F8F13>I<FC00001C00001C00001C00001C00001C00001C00001C00001C
+00001C00001CF8001D0C001E0E001E0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C
+0E001C0E001C0E001C0E00FF9FC0121A7F9915>I<18003C003C00180000000000000000000000
+0000FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80091A80990A
+>I<018003C003C001800000000000000000000000000FC001C001C001C001C001C001C001C001
+C001C001C001C001C001C001C001C001C001C001C041C0E180E3007E000A2182990C>I<FC0000
+1C00001C00001C00001C00001C00001C00001C00001C00001C00001C3F801C1E001C18001C1000
+1C20001C40001DC0001FE0001CE0001C70001C78001C38001C1C001C1E001C1F00FF3FC0121A7F
+9914>I<FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C
+001C001C001C001C001C001C001C00FF80091A80990A>I<FC7C1F001D8E63801E0781C01E0781
+C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C07
+01C01C0701C0FF9FE7F81D107F8F20>I<FCF8001D0C001E0E001E0E001C0E001C0E001C0E001C
+0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E00FF9FC012107F8F15>I<07E01C38300C
+700E6006E007E007E007E007E007E0076006700E381C1C3807E010107F8F13>I<FCF8001F0E00
+1E07001C03801C03801C01C01C01C01C01C01C01C01C01C01C01C01C03801C03001E07001F0C00
+1CF0001C00001C00001C00001C00001C00001C0000FF800012177F8F15>I<03C2000C2600381E
+00300E00700E00E00E00E00E00E00E00E00E00E00E00E00E00700E00700E00381E001C2E0007CE
+00000E00000E00000E00000E00000E00000E00007FC012177F8F14>I<FCE01D701E701E201C00
+1C001C001C001C001C001C001C001C001C001C00FFC00C107F8F0F>I<1F2060E04020C020C020
+F0007F003FC01FE000F080708030C030C020F0408F800C107F8F0F>I<0400040004000C000C00
+1C003C00FFC01C001C001C001C001C001C001C001C001C201C201C201C201C200E4003800B177F
+960F>I<FC7E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E
+001C0E001C1E000C2E0007CFC012107F8F15>I<FF1F803C06001C04001C04001E0C000E08000E
+080007100007100007900003A00003A00001C00001C00001C00000800011107F8F14>I<FF3F9F
+803C0E0700380E06001C1604001C1704001E170C000E2308000E2388000F239800074190000741
+D00003C1E0000380E0000380E0000180C0000100400019107F8F1C>I<FF3F803C1C001C18000E
+100007200007600003C00001C00001E00003E000027000043800083800181C00381E00FC3FC012
+107F8F14>I<FF1F803C06001C04001C04001E0C000E08000E080007100007100007900003A000
+03A00001C00001C00001C000008000008000010000010000E10000E20000E4000078000011177F
+8F14>I<7FF86070407040E041C041C00380070007000E081C081C08381070107030FFF00D107F
+8F11>I E /Fl 10 58 df<1F00318060C04040C060C060C060C060C060C060C060C060404060C0
+31801F000B107F8F0F>48 D<0C003C00CC000C000C000C000C000C000C000C000C000C000C000C
+000C00FF8009107E8F0F>I<1F00618040C08060C0600060006000C00180030006000C00102020
+207FC0FFC00B107F8F0F>I<1F00218060C060C000C0008001800F00008000400060C060C06080
+4060801F000B107F8F0F>I<0300030007000F000B001300330023004300C300FFE00300030003
+0003001FE00B107F8F0F>I<20803F002C002000200020002F0030802040006000600060C06080
+C061801F000B107F8F0F>I<0780184030C060C06000C000CF00F080E040C060C060C060406060
+C030801F000B107F8F0F>I<40007FE07FC08080808001000200040004000C0008000800180018
+001800180018000B117E900F>I<1F00318060C060C060C071803F000F00338061C0C060C060C0
+60404060801F000B107F8F0F>I<1F00318060C0C040C060C060C06040E021E01E600060004060
+C0608043003E000B107F8F0F>I E /Fm 11 58 df<003000003000003000003000003000003000
+003000003000003000003000003000FFFFFCFFFFFC003000003000003000003000003000003000
+00300000300000300000300000300016187E931B>43 D<07C018303018701C600C600CE00EE00E
+E00EE00EE00EE00EE00EE00EE00E600C600C701C30181C7007C00F157F9412>48
+D<03000700FF000700070007000700070007000700070007000700070007000700070007000700
+07007FF00C157E9412>I<0F8030E040708030C038E0384038003800700070006000C001800300
+06000C08080810183FF07FF0FFF00D157E9412>I<0FE030306018701C701C001C001800380060
+07E000300018000C000E000EE00EE00EC00C401830300FE00F157F9412>I<00300030007000F0
+01F001700270047008701870107020704070C070FFFE0070007000700070007003FE0F157F9412
+>I<20303FE03FC0240020002000200020002F8030E020700030003800384038E038E038803040
+6020C01F000D157E9412>I<01F00608080C181C301C70006000E000E3E0EC30F018F00CE00EE0
+0EE00E600E600E300C3018183007C00F157F9412>I<40007FFE7FFC7FF8C00880108020004000
+8000800100010003000200060006000E000E000E000E000E0004000F167E9512>I<07E0183020
+18600C600C700C78183E101F600FC00FF018F8607C601EC00EC006C006C004600C38300FE00F15
+7F9412>I<07C0183030186018E00CE00CE00EE00EE00E601E301E186E0F8E000E000C001C7018
+7018603020C01F800F157F9412>I E /Fn 9 121 df<FFFFFFC0FFFFFFC01A027C8B23>0
+D<01800180018001800180C183F18F399C0FF003C003C00FF0399CF18FC1830180018001800180
+018010147D9417>3 D<03C00FF01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7FFE3F
+FC1FF80FF003C010127D9317>15 D<FFFFFFF07FFFFFF000000000000000000000000000000000
+000000000000000000000000FFFFFFF0FFFFFFF000000000000000000000000000000000000000
+0000000000000000007FFFFFF0FFFFFFF01C147D9423>17 D<C0000000F00000003C0000000F00
+000003C0000000F0000000380000000E0000000780000001E0000000780000001E000000078000
+0001C00000078000001E00000078000001E00000078000000E00000038000000F0000003C00000
+0F0000003C00000070000000C00000000000000000000000000000000000000000000000000000
+00000000007FFFFF80FFFFFFC01A247C9C23>21 D<000002000000000300000000030000000001
+8000000000C000000000C00000000060007FFFFFF000FFFFFFFC000000000E0000000003800000
+0001F0000000007C00000000F000000003C000000007000000000C00FFFFFFF8007FFFFFF00000
+00006000000000C00000000180000000018000000003000000000300000000020000261A7D972D
+>41 D<400001C0000360000660000660000630000C30000C30000C1800181800181800180FFFF0
+0FFFF00C00300600600600600600600300C00300C001818001818001818000C30000C30000C300
+006600006600006600003C00003C00003C000018000018001821809F19>56
+D<00040000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C
+0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C000000
+0C0000000C0000000C0000000C0000000C0000000C0000000C0000FFFFFFE0FFFFFFE01B1C7C9B
+23>63 D<0F80184030207010E030E070E020E000E00060007000300018000600198030C0706060
+70E030E038E038E03860387030307018600CC0030000C000600070003000380038203870386038
+4070206010C00F800D297D9F14>120 D E /Fo 50 123 df<00003F03E00000C386700001878C
+F00003879CF00003031860000700380000070038000007003800000E003800000E007000000E00
+7000000E00700000FFFFFF80001C007000001C00E000001C00E000001C00E000001C00E0000038
+00E000003801C000003801C000003801C000003801C000007001C0000070038000007003800000
+700380000070038000006003800000E007000000E007000000E007000000E007000000C0060000
+01C00E000001C00E000031860C0000798F180000F31E100000620C6000003C07C000002429829F
+1C>11 D<00003FE00000E010000180380003807800030078000700300007000000070000000700
+00000E0000000E0000000E000000FFFFE0000E00E0001C01C0001C01C0001C01C0001C01C0001C
+03800038038000380380003803800038070000380700007007000070071000700E2000700E2000
+700E2000E00E2000E0064000E0038000E0000000C0000001C0000001C000003180000079800000
+F3000000620000003C0000001D29829F1A>I<1C3C3C3C3C040408081020204080060E7D840E>
+44 D<7FF0FFE07FE00C037D8A10>I<70F8F8F0E005057B840E>I<00000040000000C000000180
+000001800000030000000300000006000000060000000C00000018000000180000003000000030
+00000060000000C0000000C0000001800000018000000300000003000000060000000C0000000C
+0000001800000018000000300000003000000060000000C0000000C00000018000000180000003
+00000003000000060000000C0000000C0000001800000018000000300000003000000060000000
+C0000000C0000000800000001A2D7FA117>I<000F800030E000E07001C0700380300380380700
+380F00780F00780E00781E00781E00703C00F03C00F03C00F03C00F07801E07801E07801E07801
+C07003C0F003C0F00380F00780F00700700700700E00701C003038001870000FC000151F7C9D17
+>I<000200020006000E003C00DC031C001C0038003800380038007000700070007000E000E000
+E000E001C001C001C001C003800380038003800780FFF80F1E7B9D17>I<001F000061800080E0
+0100E00200700220700420700410700820F00820F00820F00840E00881E00703C0000380000700
+000C000018000060000080000300000400000800401000401000802001807E030047FF0041FE00
+80FC00807800141F7C9D17>I<070F1F1F0E0000000000000000000070F8F8F0E008147B930E>
+58 D<00000200000006000000060000000E0000001E0000001E0000003F0000002F0000004F00
+00004F0000008F0000010F0000010F0000020F0000020F0000040F00000C0F0000080F0000100F
+0000100F0000200F80003FFF800040078000C00780008007800100078001000780020007800200
+0780060007801E000F80FF807FF81D207E9F22>65 D<0000FE0200078186001C004C0038003C00
+60003C00C0001C01C0001803800018070000180F0000181E0000101E0000103C0000003C000000
+78000000780000007800000078000000F0000000F0000000F0000000F0000000F0000080700000
+8070000080700001003800010038000200180004000C001800060020000381C00000FE00001F21
+7A9F21>67 D<01FFFFFC001E0038001E0018001E0008001E0008003C0008003C0008003C000800
+3C00080078001000780800007808000078080000F0100000F0300000FFF00000F0300001E02000
+01E0200001E0200001E0200003C0000003C0000003C0000003C000000780000007800000078000
+00078000000F800000FFF800001E1F7D9E1E>70 D<0000FC040007030C001C00980030007800E0
+007801C000380380003003800030070000300E0000301E0000201E0000203C0000003C00000078
+000000780000007800000078000000F0000000F000FFF0F0000780F0000780F0000F0070000F00
+70000F0070000F0070001E0038001E0018003E001C002E000E00CC000383040000FC00001E217A
+9F23>I<01FFF3FFE0001F003E00001E003C00001E003C00001E003C00003C007800003C007800
+003C007800003C007800007800F000007800F000007800F000007800F00000F001E00000FFFFE0
+0000F001E00000F001E00001E003C00001E003C00001E003C00001E003C00003C007800003C007
+800003C007800003C007800007800F000007800F000007800F000007800F00000F801F0000FFF1
+FFE000231F7D9E22>I<01FFF0001F00001E00001E00001E00003C00003C00003C00003C000078
+0000780000780000780000F00000F00000F00000F00001E00001E00001E00001E00003C00003C0
+0003C00003C0000780000780000780000780000F8000FFF800141F7D9E12>I<01FFF800001F00
+00001E0000001E0000001E0000003C0000003C0000003C0000003C000000780000007800000078
+00000078000000F0000000F0000000F0000000F0000001E0000001E0000001E0000001E0008003
+C0010003C0010003C0030003C00200078006000780060007800C0007801C000F007800FFFFF800
+191F7D9E1D>76 D<01FE00007FC0001E0000FC00001E0000F80000170001780000170001780000
+270002F00000270004F00000270004F00000270008F00000470009E00000470011E00000470021
+E00000470021E00000870043C00000838043C00000838083C00000838083C00001038107800001
+03820780000103820780000103840780000203840F00000203880F00000203900F00000203900F
+00000401E01E00000401E01E00000401C01E00000C01801E00001C01803E0000FF8103FFC0002A
+1F7D9E29>I<01FF007FE0001F000F00001F0004000017800400001780040000278008000023C0
+08000023C008000023C008000041E010000041E010000041F010000040F010000080F020000080
+7820000080782000008078200001003C400001003C400001003C400001001E400002001E800002
+001E800002000F800002000F800004000F0000040007000004000700000C000700001C00020000
+FF80020000231F7D9E22>I<0001FC0000070700001C01C0003000E000E0006001C00070038000
+7007800038070000380E0000381E0000381C0000383C0000383C00003878000078780000787800
+007878000078F00000F0F00000F0F00000E0F00001E0F00001C0F00003C0700003807000070078
+000F0038001E0038003C001C0070000E00E0000783800001FC00001D217A9F23>I<01FFFF8000
+1E00E0001E0070001E0038001E003C003C003C003C003C003C003C003C003C0078007800780078
+007800F0007800E000F003C000F00F0000FFFC0000F0000001E0000001E0000001E0000001E000
+0003C0000003C0000003C0000003C00000078000000780000007800000078000000F800000FFF0
+00001E1F7D9E1F>I<0007E040001C18C0003005800060038000C0038001C00180018001000380
+010003800100038001000380000003C0000003C0000003F8000001FF800001FFE000007FF00000
+1FF0000001F8000000780000007800000038000000380020003800200038002000300060007000
+600060006000E0007000C000E8038000C606000081F800001A217D9F1A>83
+D<0FFFFFF01E0780E0180780201007802020078020200F0020600F0020400F0020400F0020801E
+0040001E0000001E0000001E0000003C0000003C0000003C0000003C0000007800000078000000
+7800000078000000F0000000F0000000F0000000F0000001E0000001E0000001E0000001E00000
+03E00000FFFF00001C1F789E21>I<FFF007FC0F8000E00F0000C00F0000800F0001000F000100
+0F0002000F0004000F0004000F8008000780080007801000078020000780200007804000078040
+0007808000078100000781000007C2000003C2000003C4000003C8000003C8000003D0000003D0
+000003E0000003C0000003C000000380000001800000010000001E20779E22>86
+D<00F1800389C00707800E03801C03803C0380380700780700780700780700F00E00F00E00F00E
+00F00E20F01C40F01C40703C40705C40308C800F070013147C9317>97 D<07803F800700070007
+0007000E000E000E000E001C001C001CF01D0C3A0E3C0E380F380F700F700F700F700FE01EE01E
+E01EE01CE03CE038607060E031C01F0010207B9F15>I<007E0001C1000300800E07801E07801C
+07003C0200780000780000780000F00000F00000F00000F00000F0000070010070020030040018
+380007C00011147C9315>I<0000780003F80000700000700000700000700000E00000E00000E0
+0000E00001C00001C000F1C00389C00707800E03801C03803C0380380700780700780700780700
+F00E00F00E00F00E00F00E20F01C40F01C40703C40705C40308C800F070015207C9F17>I<007C
+01C207010E011C013C013802780C7BF07C00F000F000F000F0007000700170023804183807C010
+147C9315>I<00007800019C00033C00033C000718000700000700000E00000E00000E00000E00
+000E0001FFE0001C00001C00001C00001C00003800003800003800003800003800007000007000
+00700000700000700000700000E00000E00000E00000E00000C00001C00001C000018000318000
+7B0000F300006600003C00001629829F0E>I<003C6000E27001C1E00380E00700E00F00E00E01
+C01E01C01E01C01E01C03C03803C03803C03803C03803C07003C07001C0F001C17000C2E0003CE
+00000E00000E00001C00001C00301C00783800F0700060E0003F8000141D7E9315>I<01E0000F
+E00001C00001C00001C00001C000038000038000038000038000070000070000071E000763000E
+81800F01C00E01C00E01C01C03801C03801C03801C0380380700380700380700380E10700E2070
+0C20701C20700C40E00CC060070014207D9F17>I<00C001E001E001C000000000000000000000
+000000000E003300230043804300470087000E000E000E001C001C001C00384038803080708031
+0033001C000B1F7C9E0E>I<0001800003C00003C0000380000000000000000000000000000000
+000000000000003C00004600008700008700010700010700020E00000E00000E00000E00001C00
+001C00001C00001C0000380000380000380000380000700000700000700000700000E00000E000
+30E00079C000F180006300003C00001228829E0E>I<01E0000FE00001C00001C00001C00001C0
+000380000380000380000380000700000700000703C00704200E08E00E11E00E21E00E40C01C80
+001D00001E00001FC00038E000387000387000383840707080707080707080703100E03100601E
+0013207D9F15>I<03C01FC0038003800380038007000700070007000E000E000E000E001C001C
+001C001C0038003800380038007000700070007100E200E200E200E200640038000A207C9F0C>
+I<1C0F80F0002630C318004740640C004780680E004700700E004700700E008E00E01C000E00E0
+1C000E00E01C000E00E01C001C01C038001C01C038001C01C038001C01C0708038038071003803
+806100380380E10038038062007007006600300300380021147C9325>I<1C0F802630C0474060
+4780604700704700708E00E00E00E00E00E00E00E01C01C01C01C01C01C01C0384380388380308
+3807083803107003303001C016147C931A>I<007C0001C3000301800E01C01E01C01C01E03C01
+E07801E07801E07801E0F003C0F003C0F003C0F00780F00700700F00700E0030180018700007C0
+0013147C9317>I<01C1E002621804741C04781C04701E04701E08E01E00E01E00E01E00E01E01
+C03C01C03C01C03C01C0380380780380700380E003C1C0072380071E000700000700000E00000E
+00000E00000E00001C00001C0000FFC000171D809317>I<00F0400388C00705800E03801C0380
+3C0380380700780700780700780700F00E00F00E00F00E00F00E00F01C00F01C00703C00705C00
+30B8000F380000380000380000700000700000700000700000E00000E0000FFE00121D7C9315>
+I<1C1E002661004783804787804707804703008E00000E00000E00000E00001C00001C00001C00
+001C000038000038000038000038000070000030000011147C9313>I<00FC030206010C030C07
+0C060C000F800FF007F803FC003E000E700EF00CF00CE008401020601F8010147D9313>I<0180
+01C0038003800380038007000700FFF007000E000E000E000E001C001C001C001C003800380038
+003820704070407080708031001E000C1C7C9B0F>I<0E00C03300E02301C04381C04301C04701
+C08703800E03800E03800E03801C07001C07001C07001C07101C0E20180E20180E201C1E200C26
+4007C38014147C9318>I<0E03803307802307C04383C04301C04700C08700800E00800E00800E
+00801C01001C01001C01001C02001C02001C04001C04001C08000E300003C00012147C9315>I<
+0E00C1C03300E3C02301C3E04381C1E04301C0E04701C060870380400E0380400E0380400E0380
+401C0700801C0700801C0700801C0701001C0701001C0602001C0F02000C0F04000E13080003E1
+F0001B147C931E>I<0383800CC4401068E01071E02071E02070C040E00000E00000E00000E000
+01C00001C00001C00001C040638080F38080F38100E5810084C60078780013147D9315>I<0E00
+C03300E02301C04381C04301C04701C08703800E03800E03800E03801C07001C07001C07001C07
+001C0E00180E00180E001C1E000C3C0007DC00001C00001C00003800F03800F07000E06000C0C0
+004380003E0000131D7C9316>I<01C04003E08007F1800C1F0008020000040000080000100000
+20000040000080000100000200000401000802001002003E0C0063FC0041F80080E00012147D93
+13>I E /Fp 81 125 df<001F83E000F06E3001C078780380F8780300F0300700700007007000
+0700700007007000070070000700700007007000FFFFFF80070070000700700007007000070070
+000700700007007000070070000700700007007000070070000700700007007000070070000700
+7000070070000700700007007000070070007FE3FF001D20809F1B>11 D<003F0000E0C001C0C0
+0381E00701E00701E0070000070000070000070000070000070000FFFFE00700E00700E00700E0
+0700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0
+0700E00700E07FC3FE1720809F19>I<003FE000E0E001C1E00381E00700E00700E00700E00700
+E00700E00700E00700E00700E0FFFFE00700E00700E00700E00700E00700E00700E00700E00700
+E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E07FE7FE1720809F19
+>I<001F81F80000F04F040001C07C06000380F80F000300F00F000700F00F0007007000000700
+7000000700700000070070000007007000000700700000FFFFFFFF000700700700070070070007
+007007000700700700070070070007007007000700700700070070070007007007000700700700
+070070070007007007000700700700070070070007007007000700700700070070070007007007
+007FE3FE3FF02420809F26>I<70F8F8F8F8F8F8F8707070707070707070702020202020000000
+000070F8F8F87005217CA00D>33 D<7038F87CFC7EFC7E743A0402040204020804080410081008
+201040200F0E7E9F17>I<70F8FCFC74040404080810102040060E7C9F0D>39
+D<0020004000800100020006000C000C00180018003000300030007000600060006000E000E000
+E000E000E000E000E000E000E000E000E000E0006000600060007000300030003000180018000C
+000C000600020001000080004000200B2E7DA112>I<800040002000100008000C000600060003
+00030001800180018001C000C000C000C000E000E000E000E000E000E000E000E000E000E000E0
+00E000C000C000C001C001800180018003000300060006000C00080010002000400080000B2E7D
+A112>I<70F8FCFC74040404080810102040060E7C840D>44 D<FFC0FFC00A027F8A0F>I<70F8F8
+F87005057C840D>I<000100030003000600060006000C000C000C001800180018003000300030
+00600060006000C000C000C00180018001800300030003000600060006000C000C000C00180018
+001800300030003000600060006000C000C000C000102D7DA117>I<03F0000E1C001C0E001806
+00380700700380700380700380700380F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003
+C0F003C0F003C0F003C0F003C0F003C07003807003807003807807803807001806001C0E000E1C
+0003F000121F7E9D17>I<018003800F80F3800380038003800380038003800380038003800380
+0380038003800380038003800380038003800380038003800380038007C0FFFE0F1E7C9D17>I<
+03F0000C1C00100E00200700400780800780F007C0F803C0F803C0F803C02007C00007C0000780
+000780000F00000E00001C0000380000700000600000C0000180000300000600400C0040180040
+1000803FFF807FFF80FFFF80121E7E9D17>I<03F0000C1C00100E00200F00780F807807807807
+80380F80000F80000F00000F00000E00001C0000380003F000003C00000E00000F000007800007
+800007C02007C0F807C0F807C0F807C0F00780400780400F00200E001C3C0003F000121F7E9D17
+>I<000600000600000E00000E00001E00002E00002E00004E00008E00008E00010E00020E0002
+0E00040E00080E00080E00100E00200E00200E00400E00C00E00FFFFF0000E00000E00000E0000
+0E00000E00000E00000E0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE000100000
+10000010000010000010000010000011F000161C00180E001007001007800003800003800003C0
+0003C00003C07003C0F003C0F003C0E00380400380400700200600100E000C380003E000121F7E
+9D17>I<007C000182000701000E03800C07801C0780380300380000780000700000700000F1F0
+00F21C00F40600F80700F80380F80380F003C0F003C0F003C0F003C0F003C07003C07003C07003
+803803803807001807000C0E00061C0001F000121F7E9D17>I<4000007FFFC07FFF807FFF8040
+010080020080020080040000080000080000100000200000200000400000400000C00000C00001
+C00001800003800003800003800003800007800007800007800007800007800007800007800003
+0000121F7D9D17>I<03F0000C0C00100600300300200180600180600180600180700180780300
+3E03003F06001FC8000FF00003F80007FC000C7E00103F00300F806003804001C0C001C0C000C0
+C000C0C000C0C000806001802001001002000C0C0003F000121F7E9D17>I<03F0000E18001C0C
+00380600380700700700700380F00380F00380F003C0F003C0F003C0F003C0F003C07007C07007
+C03807C0180BC00E13C003E3C0000380000380000380000700300700780600780E00700C002018
+001070000FC000121F7E9D17>I<70F8F8F8700000000000000000000070F8F8F87005147C930D>
+I<70F8F8F8700000000000000000000070F0F8F878080808101010202040051D7C930D>I<7FFF
+FFE0FFFFFFF00000000000000000000000000000000000000000000000000000000000000000FF
+FFFFF07FFFFFE01C0C7D9023>61 D<0FC0307040384038E03CF03CF03C603C0038007000E000C0
+01800180010003000200020002000200020002000000000000000000000007000F800F800F8007
+000E207D9F15>63 D<000100000003800000038000000380000007C0000007C0000007C0000009
+E0000009E0000009E0000010F0000010F0000010F00000207800002078000020780000403C0000
+403C0000403C0000801E0000801E0000FFFE0001000F0001000F0001000F000200078002000780
+02000780040003C00E0003C01F0007E0FFC03FFE1F207F9F22>65 D<FFFFE0000F80380007801E
+0007801F0007800F0007800F8007800F8007800F8007800F8007800F8007800F0007801F000780
+1E0007803C0007FFF00007803C0007801E0007800F0007800F8007800780078007C0078007C007
+8007C0078007C0078007C00780078007800F8007800F0007801F000F803C00FFFFF0001A1F7E9E
+20>I<000FC040007030C001C009C0038005C0070003C00E0001C01E0000C01C0000C03C0000C0
+7C0000407C00004078000040F8000000F8000000F8000000F8000000F8000000F8000000F80000
+00F8000000F8000000780000007C0000407C0000403C0000401C0000401E0000800E0000800700
+01000380020001C0040000703800000FC0001A217D9F21>I<FFFFE0000F803C0007801E000780
+070007800380078003C0078001E0078001E0078001F0078000F0078000F0078000F8078000F807
+8000F8078000F8078000F8078000F8078000F8078000F8078000F8078000F0078000F0078000F0
+078001E0078001E0078003C0078003800780070007800E000F803C00FFFFE0001D1F7E9E23>I<
+FFFFFF000F800F0007800300078003000780010007800180078000800780008007800080078080
+800780800007808000078080000781800007FF8000078180000780800007808000078080000780
+8000078000200780002007800020078000400780004007800040078000C0078000C0078001800F
+800F80FFFFFF801B1F7E9E1F>I<FFFFFF000F800F000780030007800300078001000780018007
+800080078000800780008007800080078080000780800007808000078080000781800007FF8000
+078180000780800007808000078080000780800007800000078000000780000007800000078000
+000780000007800000078000000FC00000FFFE0000191F7E9E1E>I<000FE0200078186000E004
+E0038002E0070001E00F0000E01E0000601E0000603C0000603C0000207C00002078000020F800
+0000F8000000F8000000F8000000F8000000F8000000F8000000F8007FFCF80003E0780001E07C
+0001E03C0001E03C0001E01E0001E01E0001E00F0001E0070001E0038002E000E0046000781820
+000FE0001E217D9F24>I<FFF8FFF80F800F8007800F0007800F0007800F0007800F0007800F00
+07800F0007800F0007800F0007800F0007800F0007800F0007800F0007FFFF0007800F0007800F
+0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F000780
+0F0007800F0007800F000F800F80FFF8FFF81D1F7E9E22>I<FFFC0FC007800780078007800780
+078007800780078007800780078007800780078007800780078007800780078007800780078007
+80078007800FC0FFFC0E1F7F9E10>I<0FFFC0007C00003C00003C00003C00003C00003C00003C
+00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C
+00003C00003C00203C00F83C00F83C00F83C00F0380040780040700030E0000F800012207E9E17
+>I<FFFC0FFC0FC003E00780018007800100078002000780040007800800078010000780200007
+80400007808000078100000783000007878000078F80000793C0000791E00007A1E00007C0F000
+0780F0000780780007803C0007803C0007801E0007801E0007800F000780078007800780078007
+C00FC007E0FFFC3FFC1E1F7E9E23>I<FFFE000FC0000780000780000780000780000780000780
+000780000780000780000780000780000780000780000780000780000780000780000780000780
+0207800207800207800207800607800407800407800C07801C0F807CFFFFFC171F7E9E1C>I<FF
+80001FF80F80001F800780001F0005C0002F0005C0002F0005C0002F0004E0004F0004E0004F00
+0470008F000470008F000470008F000438010F000438010F000438010F00041C020F00041C020F
+00041C020F00040E040F00040E040F00040E040F000407080F000407080F000407080F00040390
+0F000403900F000401E00F000401E00F000401E00F000E00C00F001F00C01F80FFE0C1FFF8251F
+7E9E2A>I<FF803FF807C007C007C0038005E0010005E0010004F001000478010004780100043C
+0100043C0100041E0100040F0100040F010004078100040781000403C1000401E1000401E10004
+00F1000400F1000400790004003D0004003D0004001F0004001F0004000F000400070004000700
+0E0003001F000300FFE001001D1F7E9E22>I<001F800000F0F00001C0380007801E000F000F00
+0E0007001E0007803C0003C03C0003C07C0003E0780001E0780001E0F80001F0F80001F0F80001
+F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0780001E07C0003E07C0003E03C00
+03C03C0003C01E0007800E0007000F000F0007801E0001C0380000F0F000001F80001C217D9F23
+>I<FFFFE0000F80780007801C0007801E0007800F0007800F8007800F8007800F8007800F8007
+800F8007800F8007800F0007801E0007801C000780780007FFE000078000000780000007800000
+078000000780000007800000078000000780000007800000078000000780000007800000078000
+000FC00000FFFC0000191F7E9E1F>I<FFFF80000F80F0000780780007803C0007801E0007801E
+0007801F0007801F0007801F0007801F0007801E0007801E0007803C00078078000780F00007FF
+80000781C0000780E0000780F0000780700007807800078078000780780007807C0007807C0007
+807C0007807C0407807E0407803E040FC01E08FFFC0F10000003E01E207E9E21>82
+D<07E0800C1980100780300380600180600180E00180E00080E00080E00080F00000F000007800
+007F00003FF0001FFC000FFE0003FF00001F800007800003C00003C00001C08001C08001C08001
+C08001C0C00180C00380E00300F00600CE0C0081F80012217D9F19>I<7FFFFFE0780F01E0600F
+0060400F0020400F0020C00F0030800F0010800F0010800F0010800F0010000F0000000F000000
+0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000
+000F0000000F0000000F0000000F0000000F0000000F0000000F0000001F800007FFFE001C1F7E
+9E21>I<FFFC3FF80FC007C0078003800780010007800100078001000780010007800100078001
+000780010007800100078001000780010007800100078001000780010007800100078001000780
+01000780010007800100078001000780010007800100038002000380020001C0020001C0040000
+E008000070180000382000000FC0001D207E9E22>I<FFF003FE1F8000F80F0000600F80006007
+8000400780004003C0008003C0008003C0008001E0010001E0010001F0010000F0020000F00200
+00F806000078040000780400003C0800003C0800003C0800001E1000001E1000001F3000000F20
+00000F20000007C0000007C0000007C000000380000003800000038000000100001F207F9E22>
+I<FFF07FF81FF01F800FC007C00F00078003800F00078001000F0007C00100078007C002000780
+07C00200078007C0020003C009E0040003C009E0040003C009E0040003E010F00C0001E010F008
+0001E010F0080001F02078080000F02078100000F02078100000F0403C10000078403C20000078
+403C20000078C03E2000003C801E4000003C801E4000003C801E4000001F000F8000001F000F80
+00001F000F8000001E00078000000E00070000000E00070000000C000300000004000200002C20
+7F9E2F>I<FFF003FF1F8000F80F8000600780004007C0004003E0008001E0008001F0010000F0
+030000F80200007C0400003C0400003E0800001E0800001F1000000FB0000007A0000007C00000
+03C0000003C0000003C0000003C0000003C0000003C0000003C0000003C0000003C0000003C000
+0003C0000007C000007FFE00201F7F9E22>89 D<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0
+C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE072D7CA10D>91
+D<080410082010201040204020804080408040B85CFC7EFC7E7C3E381C0F0E7B9F17>I<FEFE06
+060606060606060606060606060606060606060606060606060606060606060606060606060606
+06FEFE072D7FA10D>I<1FE000303000781800781C00300E00000E00000E00000E0000FE00078E
+001E0E00380E00780E00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>97
+D<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E3E
+000EC3800F01C00F00E00E00E00E00700E00700E00780E00780E00780E00780E00780E00780E00
+700E00700E00E00F00E00D01C00CC300083E0015207F9F19>I<03F80E0C1C1E381E380C700070
+00F000F000F000F000F000F00070007000380138011C020E0C03F010147E9314>I<000380003F
+8000038000038000038000038000038000038000038000038000038000038003E380061B801C07
+80380380380380700380700380F00380F00380F00380F00380F00380F003807003807003803803
+803807801C07800E1B8003E3F815207E9F19>I<03F0000E1C001C0E0038070038070070070070
+0380F00380F00380FFFF80F00000F00000F000007000007000003800801800800C010007060001
+F80011147F9314>I<007C00C6018F038F07060700070007000700070007000700FFF007000700
+07000700070007000700070007000700070007000700070007000700070007007FF01020809F0E
+>I<0000E003E3300E3C301C1C30380E00780F00780F00780F00780F00780F00380E001C1C001E
+380033E0002000002000003000003000003FFE001FFF800FFFC03001E0600070C00030C00030C0
+0030C000306000603000C01C038003FC00141F7F9417>I<0E0000FE00000E00000E00000E0000
+0E00000E00000E00000E00000E00000E00000E00000E3E000E43000E81800F01C00F01C00E01C0
+0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0
+FFE7FC16207F9F19>I<1C001E003E001E001C000000000000000000000000000E007E000E000E
+000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A1F809E0C>
+I<00E001F001F001F000E0000000000000000000000000007007F000F000700070007000700070
+00700070007000700070007000700070007000700070007000700070007000706070F060F0C061
+803F000C28829E0E>I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00
+000E00000E00000E0FF00E03C00E03000E02000E04000E08000E10000E30000E70000EF8000F38
+000E1C000E1E000E0E000E07000E07800E03800E03C00E03E0FFCFF815207F9F18>I<0E00FE00
+0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E
+000E000E000E000E000E000E000E000E000E00FFE00B20809F0C>I<0E1F01F000FE618618000E
+81C81C000F00F00E000F00F00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00
+0E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E
+000E00E00E00FFE7FE7FE023147F9326>I<0E3E00FE43000E81800F01C00F01C00E01C00E01C0
+0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC
+16147F9319>I<01F800070E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000
+F0F000F0F000F07000E07000E03801C03801C01C0380070E0001F80014147F9317>I<0E3E00FE
+C3800F01C00F00E00E00E00E00F00E00700E00780E00780E00780E00780E00780E00780E00700E
+00F00E00E00F01E00F01C00EC3000E3E000E00000E00000E00000E00000E00000E00000E00000E
+0000FFE000151D7F9319>I<03E0800619801C05803C0780380380780380700380F00380F00380
+F00380F00380F00380F003807003807803803803803807801C0B800E138003E380000380000380
+000380000380000380000380000380000380003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E
+000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00F147F9312>I<1F9030
+704030C010C010C010E00078007F803FE00FF00070803880188018C018C018E030D0608F800D14
+7E9312>I<020002000200060006000E000E003E00FFF80E000E000E000E000E000E000E000E00
+0E000E000E000E080E080E080E080E080610031001E00D1C7F9B12>I<0E01C0FE1FC00E01C00E
+01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E
+03C00603C0030DC001F1FC16147F9319>I<FF83F81E01E01C00C00E00800E00800E0080070100
+07010003820003820003820001C40001C40001EC0000E80000E800007000007000007000002000
+15147F9318>I<FF9FE1FC3C0780701C0300601C0380200E0380400E0380400E03C0400707C080
+0704C0800704E080038861000388710003C8730001D0320001D03A0000F03C0000E01C0000E01C
+0000601800004008001E147F9321>I<7FC3FC0F01E00701C007018003810001C20000E40000EC
+00007800003800003C00007C00004E000087000107000303800201C00601E01E01E0FF07FE1714
+809318>I<FF83F81E01E01C00C00E00800E00800E008007010007010003820003820003820001
+C40001C40001EC0000E80000E800007000007000007000002000002000004000004000004000F0
+8000F08000F100006200003C0000151D7F9318>I<3FFF380E200E201C40384078407000E001E0
+01C00380078007010E011E011C0338027006700EFFFE10147F9314>I<FFFFFC1601808C17>I<FF
+FFFFFFFFF02C01808C2D>I E /Fq 48 122 df<1C0038007F00FE007F00FE00FF81FF00FFC1FF
+80FFC1FF807FC0FF807FC0FF801CC0398000C0018000C001800180030001800300018003000300
+06000300060006000C000C00180018003000300060002000400019157EA924>34
+D<1C007F007F00FF80FFC0FFC07FC07FC01CC000C000C00180018001800300030006000C001800
+300020000A157B8813>44 D<00000300000007800000078000000F8000000F0000000F0000001F
+0000001E0000003E0000003C0000003C0000007C0000007800000078000000F8000000F0000001
+F0000001E0000001E0000003E0000003C0000003C0000007C00000078000000F8000000F000000
+0F0000001F0000001E0000003E0000003C0000003C0000007C0000007800000078000000F80000
+00F0000001F0000001E0000001E0000003E0000003C0000003C0000007C00000078000000F8000
+000F0000000F0000001F0000001E0000001E0000003E0000003C0000007C000000780000007800
+0000F8000000F0000000F000000060000000193C7CAC22>47 D<003F800001FFF00007E0FC000F
+C07E001F803F001F803F003F001F803F001F807F001FC07F001FC07F001FC07F001FC0FF001FE0
+FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001F
+E0FF001FE0FF001FE0FF001FE0FF001FE07F001FC07F001FC07F001FC07F001FC03F001F803F00
+1F801F803F001F803F000FC07E0007E0FC0001FFF000003F80001B277DA622>I<000E00001E00
+007E0007FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00
+00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00
+00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE007FFFFE7FFFFE7FFFFE17277BA622>
+I<00FF800003FFF0000FFFFC001F03FE003800FF007C007F80FE003FC0FF003FC0FF003FE0FF00
+1FE0FF001FE07E001FE03C003FE000003FE000003FC000003FC000007F8000007F000000FE0000
+00FC000001F8000003F0000003E00000078000000F0000001E0000003C00E0007000E000E000E0
+01C001C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF
+801B277DA622>I<007F800003FFF00007FFFC000F81FE001F00FF003F80FF003F807F803F807F
+803F807F801F807F800F007F800000FF000000FF000000FE000001FC000001F8000007F00000FF
+C00000FFF0000001FC0000007E0000007F0000007F8000003FC000003FC000003FE000003FE03C
+003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC07E007F807C007F003F01FE001FFFFC00
+07FFF00000FF80001B277DA622>I<00000E0000001E0000003E0000007E000000FE000000FE00
+0001FE000003FE0000077E00000E7E00000E7E00001C7E0000387E0000707E0000E07E0000E07E
+0001C07E0003807E0007007E000E007E000E007E001C007E0038007E0070007E00E0007E00FFFF
+FFF8FFFFFFF8FFFFFFF80000FE000000FE000000FE000000FE000000FE000000FE000000FE0000
+00FE00007FFFF8007FFFF8007FFFF81D277EA622>I<0C0003000F803F000FFFFE000FFFFC000F
+FFF8000FFFF0000FFFE0000FFFC0000FFE00000E0000000E0000000E0000000E0000000E000000
+0E0000000E7FC0000FFFF8000F80FC000E003E000C003F0000001F8000001FC000001FC000001F
+E000001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001FC078003F807800
+3F803C007F001F01FE000FFFF80003FFF00000FF80001B277DA622>I<0007F000003FFC0000FF
+FE0001FC0F0003F01F8007E03F800FC03F801FC03F801F803F803F801F003F8000007F0000007F
+0000007F000000FF000000FF0FC000FF3FF800FF707C00FFC03E00FFC03F00FF801F80FF801FC0
+FF001FC0FF001FE0FF001FE0FF001FE07F001FE07F001FE07F001FE07F001FE03F001FE03F001F
+C01F801FC01F803F800FC03F0007E07E0003FFFC0000FFF000003FC0001B277DA622>I<380000
+003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF0070000E007000
+0E0070001C00E0003800E0007000E000E0000000E0000001C00000038000000780000007800000
+0F0000000F0000001F0000001F0000003F0000003E0000003E0000007E0000007E0000007E0000
+007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007C00
+00003800001C297CA822>I<003FC00001FFF00003FFFC0007C07E000F003F001E001F001E000F
+803E000F803E000F803F000F803F000F803FC00F003FF01F001FFC1E001FFE3C000FFFF80007FF
+E00003FFF80001FFFC0001FFFE0007FFFF000F0FFF801E03FFC03C01FFC07C007FE078001FE0F8
+0007E0F80007E0F80003E0F80003E0F80003E0F80003C07C0003C07C0007803F000F001FC03E00
+0FFFFC0003FFF800007FC0001B277DA622>I<007F800001FFF00007FFF8000FE0FC001F807E00
+3F803F007F003F007F001F80FF001F80FF001FC0FF001FC0FF001FC0FF001FE0FF001FE0FF001F
+E0FF001FE07F001FE07F003FE03F003FE01F807FE00F807FE007C1DFE003FF9FE0007E1FE00000
+1FE000001FC000001FC000001FC000003F801F003F803F803F003F803F003F807E003F807C001F
+01F8001E03F0000FFFE00007FF800001FE00001B277DA622>I<000003800000000007C0000000
+0007C0000000000FE0000000000FE0000000000FE0000000001FF0000000001FF0000000003FF8
+000000003FF8000000003FF80000000073FC0000000073FC00000000F3FE00000000E1FE000000
+00E1FE00000001C0FF00000001C0FF00000003C0FF80000003807F80000007807FC0000007003F
+C0000007003FC000000E003FE000000E001FE000001E001FF000001C000FF000001FFFFFF00000
+3FFFFFF800003FFFFFF80000780007FC0000700003FC0000700003FC0000E00001FE0000E00001
+FE0001E00001FF0001C00000FF0001C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F
+297EA834>65 D<00003FF001800003FFFE0380000FFFFF8780003FF007DF8000FF8001FF8001FE
+00007F8003FC00003F8007F000001F800FF000000F801FE0000007801FE0000007803FC0000007
+803FC0000003807FC0000003807F80000003807F8000000000FF8000000000FF8000000000FF80
+00000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF80000000
+007F80000000007F80000000007FC0000003803FC0000003803FC0000003801FE0000003801FE0
+000007000FF00000070007F000000E0003FC00001E0001FE00003C0000FF8000F800003FF007E0
+00000FFFFFC0000003FFFF000000003FF8000029297CA832>67 D<FFFFFFFFE0FFFFFFFFE0FFFF
+FFFFE003FC001FE003FC0007F003FC0001F003FC0001F003FC0000F003FC00007003FC00007003
+FC00007003FC01C07803FC01C03803FC01C03803FC01C03803FC03C00003FC03C00003FC0FC000
+03FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03C00003FC03C00003FC01C00E03FC01C0
+0E03FC01C00E03FC01C01C03FC00001C03FC00001C03FC00001C03FC00003C03FC00003803FC00
+007803FC0000F803FC0001F803FC0003F803FC001FF8FFFFFFFFF0FFFFFFFFF0FFFFFFFFF02729
+7DA82D>69 D<FFFFFFFFC0FFFFFFFFC0FFFFFFFFC003FC003FC003FC000FE003FC0003E003FC00
+01E003FC0001E003FC0000E003FC0000E003FC0000E003FC0000F003FC03807003FC03807003FC
+03807003FC03800003FC07800003FC07800003FC1F800003FFFF800003FFFF800003FFFF800003
+FC1F800003FC07800003FC07800003FC03800003FC03800003FC03800003FC03800003FC000000
+03FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000
+00FFFFFC0000FFFFFC0000FFFFFC000024297DA82B>I<00007FE003000003FFFC0700001FFFFF
+0F00003FF00FFF0000FF8001FF0001FE0000FF0003F800003F0007F000003F000FF000001F001F
+E000000F001FE000000F003FC000000F003FC0000007007FC0000007007F80000007007F800000
+0000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF
+8000000000FF8000000000FF8001FFFFF87F8001FFFFF87F8001FFFFF87FC00000FF003FC00000
+FF003FC00000FF001FE00000FF001FE00000FF000FF00000FF0007F00000FF0003F80000FF0001
+FE0000FF0000FF8001FF00003FF007BF00001FFFFF1F000003FFFE0F0000007FF003002D297CA8
+36>I<FFFFFCFFFFFCFFFFFC01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00
+01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00
+01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00
+FFFFFCFFFFFCFFFFFC16297EA81A>73 D<FFFE0000001FFFC0FFFE0000001FFFC0FFFF0000003F
+FFC003FF0000003FF00003FF0000003FF00003BF80000077F00003BF80000077F000039FC00000
+E7F000039FC00000E7F000038FE00001C7F000038FE00001C7F0000387F0000387F0000387F000
+0387F0000387F0000387F0000383F8000707F0000383F8000707F0000381FC000E07F0000381FC
+000E07F0000380FE001C07F0000380FE001C07F0000380FF003807F00003807F003807F0000380
+7F003807F00003803F807007F00003803F807007F00003801FC0E007F00003801FC0E007F00003
+800FE1C007F00003800FE1C007F00003800FE1C007F000038007F38007F000038007F38007F000
+038003FF0007F000038003FF0007F000038001FE0007F000038001FE0007F000038000FC0007F0
+00038000FC0007F000FFFE00FC01FFFFC0FFFE007801FFFFC0FFFE007801FFFFC03A297DA841>
+77 D<0000FFE000000007FFFC0000003FC07F8000007F001FC00001FC0007F00003F80003F800
+07F00001FC000FF00001FE001FE00000FF001FE00000FF003FC000007F803FC000007F807FC000
+007FC07F8000003FC07F8000003FC07F8000003FC0FF8000003FE0FF8000003FE0FF8000003FE0
+FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000
+003FE07F8000003FC07FC000007FC07FC000007FC03FC000007F803FC000007F801FE00000FF00
+1FE00000FF000FF00001FE0007F00001FC0003F80003F80001FC0007F00000FF001FE000003FC0
+7F8000000FFFFE00000000FFE000002B297CA834>79 D<FFFFFFF800FFFFFFFF00FFFFFFFFC003
+FC003FE003FC000FF003FC0007F803FC0007FC03FC0003FC03FC0003FE03FC0003FE03FC0003FE
+03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FC03FC0007FC03FC0007F803FC000F
+F003FC003FE003FFFFFF8003FFFFFE0003FC00000003FC00000003FC00000003FC00000003FC00
+000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC
+00000003FC00000003FC00000003FC000000FFFFF00000FFFFF00000FFFFF0000027297DA82F>
+I<FFFFFFE00000FFFFFFFE0000FFFFFFFF800003FC007FE00003FC000FF00003FC0007F80003FC
+0007FC0003FC0003FC0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003FE
+0003FC0003FE0003FC0003FC0003FC0007F80003FC0007F80003FC001FE00003FC007FC00003FF
+FFFE000003FFFFF0000003FC00FC000003FC007F000003FC003F800003FC003F800003FC001FC0
+0003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FF00003FC
+001FF00003FC001FF00003FC001FF00703FC001FF80703FC000FF80703FC0007F80EFFFFF003FE
+1CFFFFF001FFF8FFFFF0003FF030297DA834>82 D<7FFFFFFFFFC07FFFFFFFFFC07FFFFFFFFFC0
+7F803FC03FC07E003FC007C078003FC003C078003FC003C070003FC001C0F0003FC001E0F0003F
+C001E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E000003FC00000
+00003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003F
+C0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC00000
+00003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003F
+C0000000003FC00000007FFFFFE000007FFFFFE000007FFFFFE0002B287EA730>84
+D<FFFFF0003FFF80FFFFF0003FFF80FFFFF0003FFF8003FE000001E00001FE000001C00001FF00
+0003C00000FF000003800000FF0000038000007F8000070000007F8000070000007FC0000F0000
+003FC0000E0000003FE0001E0000001FE0001C0000001FF0001C0000000FF000380000000FF000
+3800000007F8007000000007F8007000000007FC00F000000003FC00E000000003FE01E0000000
+01FE01C000000001FF01C000000000FF038000000000FF038000000000FF8780000000007F8700
+000000007FCF00000000003FCE00000000003FFE00000000001FFC00000000001FFC0000000000
+0FF800000000000FF800000000000FF8000000000007F0000000000007F0000000000003E00000
+00000003E0000000000001C000000031297FA834>86 D<010002000300060006000C000C001800
+1800300030006000300060006000C0006000C0006000C000C0018000C0018000CE019C00FF81FF
+00FF81FF00FFC1FF80FFC1FF807FC0FF803F807F003F807F000E001C00191578A924>92
+D<01FF800007FFF0000F81F8001FC07E001FC07E001FC03F000F803F8007003F8000003F800000
+3F8000003F80000FFF8000FFFF8007FC3F800FE03F803F803F803F003F807F003F80FE003F80FE
+003F80FE003F80FE003F807E007F807F00DF803F839FFC0FFF0FFC01FC03FC1E1B7E9A21>97
+D<001FF80000FFFE0003F01F0007E03F800FC03F801F803F803F801F007F800E007F0000007F00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF0000007F0000007F0000007F
+8000003F8001C01F8001C00FC0038007E0070003F01E0000FFFC00001FE0001A1B7E9A1F>99
+D<00003FF80000003FF80000003FF800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F800001F
+E3F80000FFFBF80003F03FF80007E00FF8000FC007F8001F8003F8003F8003F8007F0003F8007F
+0003F8007F0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800
+FF0003F8007F0003F8007F0003F8007F0003F8003F8003F8001F8003F8000F8007F80007C00FF8
+0003F03BFF8000FFF3FF80003FC3FF80212A7EA926>I<003FE00001FFF80003F07E0007C01F00
+0F801F801F800F803F800FC07F000FC07F0007C07F0007E0FF0007E0FF0007E0FFFFFFE0FFFFFF
+E0FF000000FF000000FF0000007F0000007F0000007F0000003F8000E01F8000E00FC001C007E0
+038003F81F0000FFFE00001FF0001B1B7E9A20>I<0007F0003FFC00FE3E01F87F03F87F03F07F
+07F07F07F03E07F00007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F000
+07F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F000
+07F00007F00007F00007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00FF
+81F003FFE7F80FC1FE7C1F80FC7C1F007C383F007E107F007F007F007F007F007F007F007F007F
+007F007F007F003F007E001F007C001F80FC000FC1F8001FFFE00018FF80003800000038000000
+3C0000003E0000003FFFF8001FFFFF001FFFFF800FFFFFC007FFFFE01FFFFFF03E0007F07C0001
+F8F80000F8F80000F8F80000F8F80000F87C0001F03C0001E01F0007C00FC01F8003FFFE00007F
+F0001E287E9A22>I<FFE0000000FFE0000000FFE00000000FE00000000FE00000000FE0000000
+0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000
+000FE00000000FE07F00000FE1FFC0000FE787E0000FEE03F0000FF803F0000FF803F8000FF003
+F8000FF003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0
+03F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000F
+E003F8000FE003F800FFFE3FFF80FFFE3FFF80FFFE3FFF80212A7DA926>I<07000F801FC03FE0
+3FE03FE01FC00F8007000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00F
+E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE
+0F2B7DAA14>I<FFE00000FFE00000FFE000000FE000000FE000000FE000000FE000000FE00000
+0FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE01FFC0FE01FFC0FE01F
+FC0FE007800FE00F000FE01E000FE03C000FE078000FE0E0000FE3C0000FE7C0000FEFE0000FFF
+E0000FFFF0000FF3F8000FE3F8000FC1FC000FC0FE000FC07F000FC07F000FC03F800FC01FC00F
+C00FC00FC00FE0FFFC3FFEFFFC3FFEFFFC3FFE1F2A7EA924>107 D<FFE0FFE0FFE00FE00FE00F
+E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0
+0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2A7DA914
+>I<FFC07F800FF000FFC1FFE03FFC00FFC383F0707E000FC603F8C07F000FCC01F9803F000FD8
+01FF003F800FF001FE003F800FF001FE003F800FE001FC003F800FE001FC003F800FE001FC003F
+800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001
+FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F80
+0FE001FC003F800FE001FC003F80FFFE1FFFC3FFF8FFFE1FFFC3FFF8FFFE1FFFC3FFF8351B7D9A
+3A>I<FFC07F0000FFC1FFC000FFC787E0000FCE03F0000FD803F0000FD803F8000FF003F8000F
+F003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F800
+0FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8
+000FE003F800FFFE3FFF80FFFE3FFF80FFFE3FFF80211B7D9A26>I<003FE00001FFFC0003F07E
+000FC01F801F800FC03F800FE03F0007E07F0007F07F0007F07F0007F0FF0007F8FF0007F8FF00
+07F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F87F0007F07F0007F03F800FE03F800FE01F
+800FC00FC01F8007F07F0001FFFC00003FE0001D1B7E9A22>I<FFE1FE0000FFE7FF8000FFFE07
+E0000FF803F0000FF001F8000FE000FC000FE000FE000FE000FF000FE0007F000FE0007F000FE0
+007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F000F
+E000FF000FE000FF000FE000FE000FE001FC000FF001F8000FF803F0000FFE0FE0000FE7FF8000
+0FE1FC00000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000
+000FE00000000FE0000000FFFE000000FFFE000000FFFE00000021277E9A26>I<FFC1F0FFC7FC
+FFCE3E0FD87F0FD87F0FF07F0FF03E0FF01C0FE0000FE0000FE0000FE0000FE0000FE0000FE000
+0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000FFFF00FFFF00FFFF00181B7E
+9A1C>114 D<03FE300FFFF01E03F03800F0700070F00070F00070F80070FC0000FFE0007FFE00
+7FFF803FFFE01FFFF007FFF800FFF80003FC0000FC60007CE0003CF0003CF00038F80038FC0070
+FF01E0F7FFC0C1FF00161B7E9A1B>I<00700000700000700000700000F00000F00000F00001F0
+0003F00003F00007F0001FFFF0FFFFF0FFFFF007F00007F00007F00007F00007F00007F00007F0
+0007F00007F00007F00007F00007F00007F00007F03807F03807F03807F03807F03807F03803F0
+3803F87001F86000FFC0001F8015267FA51B>I<FFE03FF800FFE03FF800FFE03FF8000FE003F8
+000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003
+F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0
+03F8000FE003F8000FE007F80007E007F80007E00FF80003F03BFF8001FFF3FF80003FC3FF8021
+1B7D9A26>I<FFFE03FF80FFFE03FF80FFFE03FF8007F000700007F000700007F800F00003F800
+E00003FC01E00001FC01C00001FC01C00000FE03800000FE038000007F070000007F070000007F
+8F0000003F8E0000003FDE0000001FDC0000001FDC0000000FF80000000FF80000000FF8000000
+07F000000007F000000003E000000003E000000001C00000211B7F9A24>I<FFFE7FFC0FFEFFFE
+7FFC0FFEFFFE7FFC0FFE0FE007E000E007F003F001C007F003F001C007F807F803C003F807F803
+8003F807F8038001FC0EFC070001FC0EFC070001FE1EFC0F0000FE1C7E0E0000FE1C7E0E0000FF
+383F1E00007F383F1C00007F783F3C00003FF01FB800003FF01FB800003FF01FF800001FE00FF0
+00001FE00FF000000FC007E000000FC007E000000FC007E00000078003C00000078003C0002F1B
+7F9A32>I<FFFC0FFF00FFFC0FFF00FFFC0FFF0007F003C00003F807800001FC07800000FE0F00
+0000FF1E0000007F3C0000003FF80000001FF00000000FF00000000FF000000007F000000007F8
+0000000FFC0000001FFE0000001EFE0000003C7F000000783F800000F01FC00001E01FE00001C0
+0FE00003C007F000FFF01FFF80FFF01FFF80FFF01FFF80211B7F9A24>I<FFFE03FF80FFFE03FF
+80FFFE03FF8007F000700007F000700007F800F00003F800E00003FC01E00001FC01C00001FC01
+C00000FE03800000FE038000007F070000007F070000007F8F0000003F8E0000003FDE0000001F
+DC0000001FDC0000000FF80000000FF80000000FF800000007F000000007F000000003E0000000
+03E000000001C000000001C000000003800000000380000038078000007C07000000FE0F000000
+FE0E000000FE1E000000FE3C0000007C780000003FE00000000FC000000021277F9A24>I
+E /Fr 33 122 df<70F8F8F87005057C840E>46 D<0001800000018000000180000003C0000003
+C0000003C0000005E0000005E000000DF0000008F0000008F0000010F800001078000010780000
+203C0000203C0000203C0000401E0000401E0000401E0000800F0000800F0000FFFF0001000780
+01000780030007C0020003C0020003C0040003E0040001E0040001E00C0000F00C0000F03E0001
+F8FF800FFF20237EA225>65 D<0007E0100038183000E0063001C00170038000F0070000F00E00
+00701E0000701C0000303C0000303C0000307C0000107800001078000010F8000000F8000000F8
+000000F8000000F8000000F8000000F8000000F800000078000000780000107C0000103C000010
+3C0000101C0000201E0000200E000040070000400380008001C0010000E0020000381C000007E0
+001C247DA223>67 D<FFFFF0000F801E0007800700078003C0078001C0078000E0078000F00780
+0078078000780780007C0780003C0780003C0780003C0780003E0780003E0780003E0780003E07
+80003E0780003E0780003E0780003E0780003E0780003C0780003C0780007C0780007807800078
+078000F0078000E0078001E0078003C0078007000F801E00FFFFF8001F227EA125>I<FFFFFFC0
+0F8007C0078001C0078000C0078000400780004007800060078000200780002007800020078020
+20078020000780200007802000078060000780E00007FFE0000780E00007806000078020000780
+200007802000078020000780000007800000078000000780000007800000078000000780000007
+800000078000000FC00000FFFE00001B227EA120>70 D<FFFC3FFF0FC003F0078001E0078001E0
+078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001
+E0078001E0078001E007FFFFE0078001E0078001E0078001E0078001E0078001E0078001E00780
+01E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E00FC003F0FF
+FC3FFF20227EA125>72 D<03FFF0001F00000F00000F00000F00000F00000F00000F00000F0000
+0F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F0000
+0F00000F00000F00000F00700F00F80F00F80F00F80E00F01E00401C0020380018700007C00014
+237EA119>74 D<FFFE00000FC00000078000000780000007800000078000000780000007800000
+078000000780000007800000078000000780000007800000078000000780000007800000078000
+000780000007800000078000000780000007800080078000800780008007800080078001800780
+018007800100078003000780030007800F000F803F00FFFFFF0019227EA11E>76
+D<FF8007FF07C000F807C0007005E0002004F0002004F0002004780020047C0020043C0020041E
+0020041F0020040F002004078020040780200403C0200401E0200401E0200400F0200400F82004
+00782004003C2004003E2004001E2004000F2004000F20040007A0040003E0040003E0040001E0
+040001E0040000E00E0000601F000060FFE0002020227EA125>78 D<FFFFF0000F803C0007800F
+0007800780078007C0078003C0078003E0078003E0078003E0078003E0078003E0078003E00780
+03C0078007C00780078007800F0007803C0007FFF0000780000007800000078000000780000007
+800000078000000780000007800000078000000780000007800000078000000780000007800000
+0FC00000FFFC00001B227EA121>80 D<03F0200C0C601802603001E07000E0600060E00060E000
+60E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003FF80003FC00007
+E00001E00000F00000F0000070800070800070800070800070C00060C00060E000C0F000C0C801
+80C6070081FC0014247DA21B>83 D<FFFC07FF0FC000F807800070078000200780002007800020
+078000200780002007800020078000200780002007800020078000200780002007800020078000
+200780002007800020078000200780002007800020078000200780002007800020078000200780
+00200380004003C0004003C0004001C0008000E000800060010000300600001C08000003F00020
+237EA125>85 D<FFF0007FC01F80001F000F80000C00078000080007C000180003E000100001E0
+00200001F000200000F000400000F800C000007C008000003C010000003E010000001E02000000
+1F040000000F84000000078800000007D800000003D000000003E000000001E000000001E00000
+0001E000000001E000000001E000000001E000000001E000000001E000000001E000000001E000
+000001E000000001E000000003E00000003FFF000022227FA125>89 D<0FE0001838003C0C003C
+0E0018070000070000070000070000FF0007C7001E07003C0700780700700700F00708F00708F0
+0708F00F087817083C23900FC1E015157E9418>97 D<0E0000FE00001E00000E00000E00000E00
+000E00000E00000E00000E00000E00000E00000E00000E00000E1F000E61C00E80600F00300E00
+380E003C0E001C0E001E0E001E0E001E0E001E0E001E0E001E0E001E0E001C0E003C0E00380F00
+700C80600C41C0083F0017237FA21B>I<01FE000703000C07801C0780380300780000700000F0
+0000F00000F00000F00000F00000F00000F000007000007800403800401C00800C010007060001
+F80012157E9416>I<0000E0000FE00001E00000E00000E00000E00000E00000E00000E00000E0
+0000E00000E00000E00000E001F8E00704E00C02E01C01E03800E07800E07000E0F000E0F000E0
+F000E0F000E0F000E0F000E0F000E07000E07800E03800E01801E00C02E0070CF001F0FE17237E
+A21B>I<01FC000707000C03801C01C03801C07801E07000E0F000E0FFFFE0F00000F00000F000
+00F00000F000007000007800203800201C00400E008007030000FC0013157F9416>I<003C00C6
+018F038F030F070007000700070007000700070007000700FFF807000700070007000700070007
+000700070007000700070007000700070007000700070007807FF8102380A20F>I<0E0000FE00
+001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E1F
+800E60C00E80E00F00700F00700E00700E00700E00700E00700E00700E00700E00700E00700E00
+700E00700E00700E00700E00700E00700E0070FFE7FF18237FA21B>104
+D<1C001E003E001E001C00000000000000000000000000000000000E00FE001E000E000E000E00
+0E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A227FA10E>I<0E00
+00FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00
+000E03FC0E01F00E01C00E01800E02000E04000E08000E10000E38000EF8000F1C000E1E000E0E
+000E07000E07800E03C00E01C00E01E00E00F00E00F8FFE3FE17237FA21A>107
+D<0E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00
+0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00B237FA20E>I<
+0E1FC07F00FE60E183801E807201C00F003C00E00F003C00E00E003800E00E003800E00E003800
+E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E0038
+00E00E003800E00E003800E00E003800E00E003800E0FFE3FF8FFE27157F942A>I<0E1F80FE60
+C01E80E00F00700F00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00
+700E00700E00700E00700E00700E0070FFE7FF18157F941B>I<01FC000707000C01801800C038
+00E0700070700070F00078F00078F00078F00078F00078F00078F000787000707800F03800E01C
+01C00E038007070001FC0015157F9418>I<0E1F00FE61C00E80600F00700E00380E003C0E001C
+0E001E0E001E0E001E0E001E0E001E0E001E0E001E0E003C0E003C0E00380F00700E80E00E41C0
+0E3F000E00000E00000E00000E00000E00000E00000E00000E00000E0000FFE000171F7F941B>
+I<0E3CFE461E8F0F0F0F060F000E000E000E000E000E000E000E000E000E000E000E000E000E00
+0F00FFF010157F9413>114 D<0F8830786018C018C008C008E008F0007F803FE00FF001F8003C
+801C800C800CC00CC008E018D0308FC00E157E9413>I<02000200020002000600060006000E00
+1E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E040E040E040E040E
+040708030801F00E1F7F9E13>I<0E0070FE07F01E00F00E00700E00700E00700E00700E00700E
+00700E00700E00700E00700E00700E00700E00700E00700E00F00E00F006017003827800FC7F18
+157F941B>I<FFC1FE1E00780E00300E00200E002007004007004003808003808003808001C100
+01C10000E20000E20000E20000740000740000380000380000380000100017157F941A>I<FFC1
+FE1E00780E00300E00200E002007004007004003808003808003808001C10001C10000E20000E2
+0000E200007400007400003800003800003800001000001000002000002000002000004000F040
+00F08000F180004300003C0000171F7F941A>121 D E /Fs 17 118 df<000003000000000003
+00000000000300000000000780000000000780000000000FC0000000000FC0000000000FC00000
+000017E00000000013E00000000013E00000000023F00000000021F00000000021F00000000040
+F80000000040F80000000040F800000000807C00000000807C00000001807E00000001003E0000
+0001003E00000002003F00000002001F00000002001F00000004000F80000004000F8000000400
+0F800000080007C00000080007C00000180007E000001FFFFFE000001FFFFFE00000200003F000
+00200001F00000200001F00000400001F80000400000F80000400000F800008000007C00008000
+007C00008000007C00010000003E00010000003E00030000003F00030000001F00070000001F00
+1F8000003F80FFE00003FFFCFFE00003FFFC2E327EB132>65 D<00001FE000800000FFFC018000
+07F00F0180000F80018380003E0000C38000780000278000F00000178001E000000F8003C00000
+0F800780000007800780000003800F00000003801F00000001801E00000001803E00000001803C
+00000001803C00000000807C00000000807C0000000080780000000000F80000000000F8000000
+0000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000F8
+0000000000F80000000000F800000FFFFC7800000FFFFC7C0000001FC07C0000000F803C000000
+0F803C0000000F803E0000000F801E0000000F801F0000000F800F0000000F80078000000F8007
+C000000F8003C000000F8001E000000F8000F000001780007C00001780003E00006380000F8000
+C3800007F00781800000FFFE008000001FF000002E337CB134>71 D<FFFF807FFFC0FFFF807FFF
+C007F00003F80003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E0
+0001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F0
+0003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E0
+0001F00003E00001F00003FFFFFFF00003FFFFFFF00003E00001F00003E00001F00003E00001F0
+0003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E0
+0001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F0
+0003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00007F00003F800FFFF
+807FFFC0FFFF807FFFC02A317CB032>I<FFFF80FFFF8007F00003E00003E00003E00003E00003
+E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003
+E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003
+E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00007
+F000FFFF80FFFF8011317DB017>I<00FE00000303C0000C00E00010007000100038003C003C00
+3E001C003E001E003E001E0008001E0000001E0000001E0000001E00000FFE0000FC1E0003E01E
+000F801E001F001E003E001E003C001E007C001E00F8001E04F8001E04F8001E04F8003E04F800
+3E0478003E047C005E043E008F080F0307F003FC03E01E1F7D9E21>97 D<003F8000E060038018
+0700040F00041E001E1C003E3C003E7C003E7C0008780000F80000F80000F80000F80000F80000
+F80000F80000F80000F800007800007C00007C00003C00011E00011E00020F0002070004038018
+00E060003F80181F7D9E1D>99 D<000001E000003FE000003FE0000003E0000001E0000001E000
+0001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0
+000001E0000001E0000001E0001F81E000F061E001C019E0078005E00F0003E00E0003E01E0001
+E03C0001E03C0001E07C0001E0780001E0F80001E0F80001E0F80001E0F80001E0F80001E0F800
+01E0F80001E0F80001E0F80001E0780001E0780001E03C0001E03C0001E01C0001E01E0003E00E
+0005E0070009E0038011F000E061FF003F81FF20327DB125>I<003F800000E0E0000380380007
+003C000E001E001E001E001C000F003C000F007C000F0078000F8078000780F8000780F8000780
+FFFFFF80F8000000F8000000F8000000F8000000F8000000F8000000780000007C0000003C0000
+003C0000801E0000800E0001000F0002000780020001C00C0000F03000001FC000191F7E9E1D>
+I<07000F801F801F800F800700000000000000000000000000000000000000000000000780FF80
+FF800F800780078007800780078007800780078007800780078007800780078007800780078007
+800780078007800780078007800FC0FFF8FFF80D307EAF12>105 D<07800000FF800000FF8000
+000F80000007800000078000000780000007800000078000000780000007800000078000000780
+000007800000078000000780000007800000078000000780000007801FFC07801FFC078007E007
+800780078006000780040007800800078010000780600007808000078100000783800007878000
+078FC0000793C00007A1E00007C1F0000780F0000780780007807C0007803C0007803E0007801F
+0007800F0007800F80078007C0078003C0078003E00FC007F8FFFC0FFFFFFC0FFF20327EB123>
+107 D<0780FF80FF800F8007800780078007800780078007800780078007800780078007800780
+078007800780078007800780078007800780078007800780078007800780078007800780078007
+800780078007800780078007800780078007800FC0FFFCFFFC0E327EB112>I<0780FE0000FF83
+078000FF8C03C0000F9001E00007A001E00007A000F00007C000F00007C000F000078000F00007
+8000F000078000F000078000F000078000F000078000F000078000F000078000F000078000F000
+078000F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0
+00078000F000078000F000078000F0000FC001F800FFFC1FFF80FFFC1FFF80211F7E9E25>110
+D<001FC00000F0780001C01C00070007000F0007801E0003C01C0001C03C0001E03C0001E07800
+00F0780000F0780000F0F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8F8
+0000F8780000F07C0001F03C0001E03C0001E01E0003C01E0003C00F00078007800F0001C01C00
+00F07800001FC0001D1F7E9E21>I<0783E0FF8C18FF907C0F907C07A07C07C03807C00007C000
+07C000078000078000078000078000078000078000078000078000078000078000078000078000
+0780000780000780000780000780000780000780000FC000FFFE00FFFE00161F7E9E19>114
+D<01FC100E03301800F0300070600030E00030E00010E00010E00010F00010F800007E00003FF0
+001FFF000FFFC003FFE0003FF00001F80000F880003C80003C80001CC0001CC0001CE0001CE000
+18F00038F00030CC0060C301C080FE00161F7E9E1A>I<00400000400000400000400000400000
+C00000C00000C00001C00001C00003C00007C0000FC0001FFFE0FFFFE003C00003C00003C00003
+C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003
+C01003C01003C01003C01003C01003C01003C01003C01001C02001E02000E0400078C0001F0014
+2C7FAB19>I<078000F000FF801FF000FF801FF0000F8001F000078000F000078000F000078000
+F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0000780
+00F000078000F000078000F000078000F000078000F000078000F000078000F000078000F00007
+8000F000078001F000078001F000078001F000038002F00003C004F00001C008F800007030FF80
+001FC0FF80211F7E9E25>I E end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300
+TeXDict begin @letter /letter where {pop letter} if
+%%EndSetup
+%%Page: 1 1
+bop 501 287 a Fs(A)21 b(Gen)n(tle)h(In)n(tro)r(duction)g(to)g(Hask)n(ell)432
+443 y Fr(P)o(aul)16 b(Hudak)395 501 y(Y)l(ale)g(Univ)o(ersit)o(y)203
+559 y(Departmen)o(t)e(of)j(Computer)e(Science)1228 443 y(Joseph)i(H.)f(F)l
+(asel)1145 501 y(Univ)o(ersit)o(y)e(of)i(California)1044 559
+y(Los)h(Alamos)e(National)h(Lab)q(oratory)0 788 y Fq(1)69 b(In)n(tro)r
+(duction)0 920 y Fp(Our)20 b(purp)q(ose)h(in)f(writing)g(this)h(tutorial)e
+(is)i(not)e(to)g(teac)o(h)h(programming,)g(nor)f(ev)o(en)h(to)f(teac)o(h)h
+(functional)0 977 y(programming.)j(Rather,)17 b(it)f(is)h(in)o(tended)h(to)e
+(serv)o(e)g(as)g(a)h(supplemen)o(t)g(to)f(the)h(Hask)o(ell)g(Rep)q(ort)g([3)o
+(],)f(whic)o(h)h(is)0 1033 y(otherwise)11 b(a)g(rather)g(dense)h(tec)o
+(hnical)g(exp)q(osition.)20 b(Our)11 b(goal)g(is)h(to)e(pro)o(vide)i(a)f(gen)
+o(tle)g(in)o(tro)q(duction)i(to)d(Hask)o(ell)0 1090 y(for)k(someone)g(who)g
+(has)g(exp)q(erience)j(with)e(at)f(least)g(one)h(other)f(language,)g
+(preferably)h(a)f(functional)i(language)0 1146 y(\(ev)o(en)k(if)h(only)g(an)f
+(\\almost-functional")h(language)f(suc)o(h)h(as)f(ML)g(or)g(Sc)o(heme\).)35
+b(If)21 b(the)f(reader)h(wishes)g(to)0 1202 y(learn)15 b(more)g(ab)q(out)g
+(the)g(functional)h(programming)e(st)o(yle,)h(w)o(e)f(highly)j(recommend)e
+(Bird)g(and)h(W)l(adler's)e(text)0 1259 y Fo(Intr)n(o)n(duction)k(to)g(F)m
+(unctional)f(Pr)n(o)n(gr)n(amming)g Fp([1)o(],)g(whic)o(h)i(uses)e(a)g
+(language)h(su\016cien)o(tly)h(similar)f(to)f(Hask)o(ell)0
+1315 y(to)h(mak)o(e)g(translation)h(b)q(et)o(w)o(een)f(the)h(t)o(w)o(o)e
+(quite)i(easy)l(.)30 b(F)l(or)18 b(a)h(useful)g(surv)o(ey)g(of)f(functional)i
+(programming)0 1372 y(languages)14 b(and)g(tec)o(hniques,)h(including)h(some)
+e(of)f(the)h(language)g(design)h(principals)h(used)e(in)h(Hask)o(ell,)f(see)g
+([2].)71 1457 y(Our)j(general)g(strategy)f(for)g(in)o(tro)q(ducing)i
+(language)f(features)g(is)g(this:)24 b(motiv)m(ate)17 b(the)g(idea,)g
+(de\014ne)h(some)0 1514 y(terms,)12 b(giv)o(e)i(some)e(examples,)i(and)f
+(then)g(p)q(oin)o(t)g(to)g(the)g(Rep)q(ort)g(for)f(details.)20
+b(W)l(e)13 b(suggest,)g(ho)o(w)o(ev)o(er,)f(that)g(the)0 1570
+y(reader)17 b(completely)h(ignore)f(the)g(details)g(un)o(til)h(this)f(do)q
+(cumen)o(t)g(has)g(b)q(een)h(completely)g(read.)24 b(On)18
+b(the)e(other)0 1627 y(hand,)g(Hask)o(ell's)h(Standard)f(Prelude)i(\(in)e
+(App)q(endix)i(A)f(of)e(the)i(Rep)q(ort\))f(con)o(tains)g(lots)g(of)g(useful)
+h(examples)0 1683 y(of)h(Hask)o(ell)h(co)q(de;)i(w)o(e)d(encourage)g(a)h
+(thorough)e(reading)i(once)g(this)g(tutorial)g(is)g(completed.)30
+b(This)19 b(will)h(not)0 1740 y(only)d(giv)o(e)g(the)f(reader)h(a)f(feel)i
+(for)d(what)h(real)h(Hask)o(ell)h(co)q(de)f(lo)q(oks)g(lik)o(e,)g(but)g(will)
+h(also)e(familiarize)j(her)e(with)0 1796 y(Hask)o(ell's)f(standard)e(set)h
+(of)g(prede\014ned)i(functions)f(and)f(t)o(yp)q(es.)71 1882
+y([W)l(e)e(ha)o(v)o(e)g(also)h(tak)o(en)f(the)h(course)g(of)f(not)g(la)o
+(ying)h(out)g(a)f(plethora)h(of)f(lexical)j(syn)o(tax)d(rules)h(at)f(the)h
+(outset.)0 1938 y(Rather,)i(w)o(e)g(in)o(tro)q(duce)h(them)f(incremen)o
+(tally)i(as)e(our)f(examples)i(demand,)g(and)f(enclose)h(them)f(in)h(brac)o
+(k)o(ets,)0 1995 y(as)f(with)i(this)f(paragraph.)24 b(This)18
+b(is)f(in)h(stark)e(con)o(trast)f(to)h(the)h(organization)g(of)g(the)g(Rep)q
+(ort,)g(although)g(the)0 2051 y(Rep)q(ort)h(remains)g(the)f(authoritativ)o(e)
+g(source)h(for)e(details)j(\(references)e(suc)o(h)h(as)f(\\)p
+Fn(x)p Fp(2.1")f(refer)h(to)g(sections)h(in)0 2107 y(the)d(Rep)q(ort\).])71
+2193 y(Hask)o(ell)g(is)h(a)e Fo(typ)n(eful)h Fp(programming)f(language:)922
+2177 y Fm(1)962 2193 y Fp(T)o(yp)q(es)h(are)f(p)q(erv)m(asiv)o(e,)i(and)f
+(the)g(new)o(comer)f(is)i(b)q(est)f(o\013)0 2249 y(b)q(ecoming)f(w)o(ell-a)o
+(w)o(are)e(of)h(the)f(full)i(p)q(o)o(w)o(er)f(and)f(complexit)o(y)i(of)e
+(Hask)o(ell's)h(t)o(yp)q(e)g(system)f(from)g(the)h(outset.)19
+b(F)l(or)0 2306 y(those)12 b(whose)g(only)g(exp)q(erience)i(is)f(with)f
+(relativ)o(ely)h(\\un)o(t)o(yp)q(eful")g(languages)f(suc)o(h)g(as)g(Basic)g
+(or)g(Lisp,)h(this)g(ma)o(y)0 2362 y(b)q(e)f(a)e(di\016cult)i(adjustmen)o(t;)
+g(for)e(those)h(familiar)g(with)h(P)o(ascal,)f(Mo)q(dula,)h(or)e(ev)o(en)h
+(ML,)g(the)g(adjustmen)o(t)f(should)0 2419 y(b)q(e)19 b(easier)h(but)e(still)
+j(not)d(insigni\014can)o(t,)j(since)f(Hask)o(ell's)f(t)o(yp)q(e)g(system)f
+(is)i(di\013eren)o(t)f(and)f(somewhat)g(ric)o(her)0 2475 y(than)g(most.)29
+b(In)19 b(an)o(y)g(case,)g(\\t)o(yp)q(eful)g(programming")e(is)i(part)f(of)g
+(the)h(Hask)o(ell)g(programming)f(exp)q(erience,)0 2532 y(and)d(cannot)g(b)q
+(e)h(a)o(v)o(oided.)p 0 2571 780 2 v 52 2598 a Fl(1)69 2614
+y Fk(A)d(phrase)h(due)f(to)g(Luca)g(Cardelli.)940 2738 y Fp(T-1)p
+eop
+%%Page: 2 2
+bop 0 -40 a Fp(T-2)906 b Fj(2)45 b(V)-5 b(ALUES,)16 b(TYPES,)e(AND)h(OTHER)h
+(GOODIES)0 105 y Fq(2)69 b(V)-6 b(alues,)23 b(T)n(yp)r(es,)g(and)g(Other)g
+(Go)r(o)r(dies)0 228 y Fp(Because)g(Hask)o(ell)g(is)f(a)g(purely)i
+(functional)f(language,)h(all)f(computations)f(are)g(done)g(via)g(the)h(ev)m
+(aluation)0 285 y(of)18 b Fo(expr)n(essions)e Fp(\(syn)o(tactic)i(terms\))f
+(to)g(yield)j Fo(values)e Fp(\(abstract)f(en)o(tities)h(that)g(w)o(e)g
+(regard)f(as)h(answ)o(ers\).)27 b(In)0 341 y(particular,)12
+b(there)g(are)f(no)g Fo(c)n(ommands)g Fp(that)f(op)q(erate)h(b)o(y)g
+(implicit)j(side)e(e\013ects)f(to)g(a)g(global)h(store.)17
+b(In)12 b(addition,)0 398 y(ev)o(ery)j(v)m(alue)g(has)g(an)f(asso)q(ciated)h
+Fo(typ)n(e)p Fp(.)20 b(\(In)o(tuitiv)o(ely)l(,)c(w)o(e)e(can)h(think)g(of)g
+(t)o(yp)q(es)f(as)g(sets)h(of)f(v)m(alues.\))20 b(Examples)0
+454 y(of)f(expressions)g(include)j(atomic)c(v)m(alues)j(suc)o(h)e(as)g(the)g
+(in)o(teger)g Fi(5)p Fp(,)g(the)g(c)o(haracter)f Fi('a')p Fp(,)i(and)f(the)g
+(successor)0 511 y(function)d Fi(succ)o Fp(,)f(as)g(w)o(ell)h(as)f
+(structured)g(v)m(alues)i(suc)o(h)e(as)g(the)g(list)h Fi([1,2,3])e
+Fp(and)i(the)f(pair)h Fi(\('b',4\))o Fp(.)71 589 y(Just)f(as)h(expressions)g
+(denote)g(v)m(alues,)h Fo(typ)n(e)f(expr)n(essions)f Fp(are)g(syn)o(tactic)h
+(terms)f(that)g(denote)h Fo(typ)n(e)g(values)0 645 y Fp(\(or)10
+b(just)h Fo(typ)n(es)p Fp(\).)18 b(Examples)11 b(of)g(t)o(yp)q(e)g
+(expressions)h(include)i(the)d(atomic)g(t)o(yp)q(es)g Fi(Int)f
+Fp(\(\014xed-precision)k(in)o(tegers\),)0 702 y Fi(Char)h Fp(\(ascii)h(c)o
+(haracters\),)d Fi(Int->Int)h Fp(\(functions)i(mapping)g Fi(Int)f
+Fp(to)f Fi(Int)p Fp(\),)h(as)f(w)o(ell)j(as)d(the)i(structured)f(t)o(yp)q(es)
+0 758 y Fi([Int])f Fp(\(homogeneous)h(lists)h(of)f(in)o(tegers\))g(and)g
+Fi(\(Char,Int\))f Fp(\(c)o(haracter/in)o(teger)g(pairs\).)71
+837 y(All)h(Hask)o(ell)g(v)m(alues)g(are)f(\\\014rst-class"|they)g(ma)o(y)g
+(b)q(e)g(passed)h(as)e(argumen)o(ts)h(to)f(functions,)i(returned)f(as)0
+893 y(results,)i(placed)g(in)h(data)e(structures,)g(etc.)21
+b(Hask)o(ell)16 b(t)o(yp)q(es,)g(on)f(the)h(other)f(hand,)h(are)f
+Fo(not)h Fp(\014rst-class.)21 b(T)o(yp)q(es)0 949 y(in)16 b(a)e(sense)h
+Fo(describ)n(e)f Fp(v)m(alues,)i(and)f(the)f(asso)q(ciation)i(of)e(a)g(v)m
+(alue)i(with)f(its)g(t)o(yp)q(e)g(is)g(called)i(a)d Fo(typing)p
+Fp(.)20 b(Using)15 b(the)0 1006 y(examples)h(of)f(v)m(alues)h(and)f(t)o(yp)q
+(es)h(ab)q(o)o(v)o(e,)e(w)o(e)h(write)g(t)o(ypings)h(as)e(follo)o(ws:)691
+1115 y Fi(5)48 b(::)23 b(Int)667 1171 y('a')h(::)f(Char)643
+1228 y(succ)h(::)f(Int)h(->)f(Int)572 1284 y([1,2,3])g(::)g([Int])572
+1341 y(\('b',4\))g(::)g(\(Char,Int\))0 1450 y Fp(The)15 b Fi(::)g
+Fp(can)h(b)q(e)g(read)f(\\has)f(t)o(yp)q(e.")71 1528 y(F)l(unctions)i(in)h
+(Hask)o(ell)g(are)f(normally)h(de\014ned)h(b)o(y)e(a)f(series)i(of)f
+Fo(e)n(quations)p Fp(.)22 b(F)l(or)16 b(example,)h(the)f(successor)0
+1585 y(function)g Fi(succ)f Fp(can)g(b)q(e)h(de\014ned)g(b)o(y)g(the)f
+(single)h(equation:)71 1694 y Fi(succ)23 b(n)238 b(=)24 b(n+1)0
+1803 y Fp(An)16 b(equation)g(is)g(an)g(example)h(of)e(a)g Fo(de)n(clar)n
+(ation)p Fp(.)21 b(Another)16 b(kind)h(of)e(declaration)i(is)f(a)f
+Fo(typ)n(e)i(signatur)n(e)f(de)n(cla-)0 1859 y(r)n(ation)f
+Fp(\()p Fn(x)p Fp(4.4.1\),)e(with)i(whic)o(h)h(w)o(e)f(can)h(declare)g(an)f
+(explicit)i(t)o(yping)f(for)e Fi(succ)p Fp(:)71 1971 y Fi(succ)285
+b(::)24 b(Int)f(->)h(Int)0 2080 y Fp(W)l(e)15 b(will)i(ha)o(v)o(e)e(m)o(uc)o
+(h)g(more)g(to)f(sa)o(y)h(ab)q(out)g(function)h(de\014nitions)h(in)f(Section)
+g(3.)71 2158 y(F)l(or)i(p)q(edagogical)i(purp)q(oses,)g(when)g(w)o(e)f(wish)h
+(to)e(indicate)j(that)d(an)h(expression)h Fh(e)1562 2165 y
+Fm(1)1601 2158 y Fp(ev)m(aluates,)h(or)d(\\re-)0 2214 y(duces,")d(to)g
+(another)g(expression)h(or)e(v)m(alue)j Fh(e)795 2221 y Fm(2)815
+2214 y Fp(,)e(w)o(e)f(will)j(write:)838 2307 y Fh(e)859 2314
+y Fm(1)952 2307 y Fn(\))74 b Fh(e)1092 2314 y Fm(2)0 2400 y
+Fp(F)l(or)15 b(example,)g(note)g(that:)712 2457 y Fi(succ)23
+b(\(succ)g(3\))73 b Fn(\))h Fi(5)71 2557 y Fp(Hask)o(ell's)17
+b Fo(static)h(typ)n(e)h(system)d Fp(de\014nes)j(the)e(formal)g(relationship)i
+(b)q(et)o(w)o(een)f(t)o(yp)q(es)f(and)h(v)m(alues)g(\()p Fn(x)p
+Fp(4.1.3\).)0 2614 y(The)11 b(static)f(t)o(yp)q(e)h(system)f(ensures)i(that)d
+(Hask)o(ell)j(programs)d(are)i Fo(typ)n(e)h(safe)p Fp(;)f(that)f(is,)i(that)e
+(the)h(programmer)e(has)p eop
+%%Page: 3 3
+bop 0 -40 a Fj(2.1)45 b(P)o(olymorphic)15 b(T)o(yp)q(es)1390
+b Fp(T-3)0 105 y(not)13 b(mismatc)o(hed)h(t)o(yp)q(es)f(in)h(some)f(w)o(a)o
+(y)l(.)19 b(F)l(or)12 b(example,)i(w)o(e)f(cannot)h(generally)g(add)g
+(together)e(t)o(w)o(o)g(c)o(haracters,)0 162 y(so)17 b(the)g(expression)h
+Fi('a'+'b')d Fp(is)j(ill-t)o(yp)q(ed.)28 b(The)17 b(main)g(adv)m(an)o(tage)g
+(of)f(statically)i(t)o(yp)q(ed)f(languages)g(is)h(w)o(ell-)0
+218 y(kno)o(wn:)g(All)c(t)o(yp)q(e)e(errors)g(are)g(detected)h(at)f
+(compile-time.)21 b(This)13 b(not)f(only)g(aids)h(the)g(user)f(in)i
+(reasoning)e(ab)q(out)0 274 y(programs,)17 b(but)h(also)g(p)q(ermits)g(a)f
+(compiler)j(to)d(generate)g(more)h(e\016cien)o(t)g(co)q(de)h(\(for)d
+(example,)j(no)f(run-time)0 331 y(t)o(yp)q(e)d(tags)f(or)h(tests)g(are)g
+(required\).)71 410 y(The)h(t)o(yp)q(e)g(system)f(also)h(ensures)h(that)e
+(user-supplied)k(t)o(yp)q(e)d(signatures)g(are)g(correct.)22
+b(In)16 b(fact,)g(Hask)o(ell's)0 467 y(t)o(yp)q(e)h(system)f(is)h(p)q(o)o(w)o
+(erful)g(enough)g(to)f(allo)o(w)h(us)f(to)g(a)o(v)o(oid)h(writing)g(an)o(y)f
+(t)o(yp)q(e)h(signatures)f(at)g(all,)1743 450 y Fm(2)1781 467
+y Fp(in)h(whic)o(h)0 523 y(case)d(w)o(e)h(sa)o(y)e(that)h(the)h(t)o(yp)q(e)f
+(system)g Fo(infers)g Fp(the)g(correct)g(t)o(yp)q(es)h(for)e(us.)20
+b(Nev)o(ertheless,)15 b(judicious)h(placemen)o(t)0 580 y(of)f(t)o(yp)q(e)g
+(signatures)g(is)h(a)f(go)q(o)q(d)g(idea,)h(as)e(w)o(e)h(did)i(for)d
+Fi(succ)p Fp(,)g(since)j(it)e(impro)o(v)o(es)g(readabilit)o(y)i(and)e(helps)h
+(bring)0 636 y(programming)f(errors)f(to)h(ligh)o(t.)71 715
+y([The)e(reader)g(will)j(note)d(that)g(w)o(e)g(ha)o(v)o(e)g(capitalized)j
+(iden)o(ti\014ers)f(that)e(denote)g(sp)q(eci\014c)j(t)o(yp)q(es,)d(suc)o(h)h
+(as)f Fi(Int)0 772 y Fp(and)18 b Fi(Char)o Fp(,)g(but)g(not)g(iden)o
+(ti\014ers)h(that)e(denote)h(v)m(alues,)h(suc)o(h)f(as)g Fi(succ)o
+Fp(.)28 b(This)18 b(is)g(not)g(just)f(a)h(con)o(v)o(en)o(tion:)25
+b(it)0 828 y(is)16 b(enforced)g(b)o(y)g(Hask)o(ell's)g(lexical)i(syn)o(tax.)i
+(In)c(fact,)f(the)h(case)f(of)h(the)f(other)h(c)o(haracters)e(matters,)h(to)q
+(o:)20 b Fi(foo)o Fp(,)0 885 y Fi(fOo)p Fp(,)14 b(and)i Fi(fOO)e
+Fp(are)h(all)i(distinct)f(iden)o(ti\014ers.])0 1028 y Fg(2.1)56
+b(P)n(olymorphic)17 b(T)n(yp)r(es)0 1137 y Fp(Hask)o(ell)k(also)g(incorp)q
+(orates)f Fo(p)n(olymorphic)h Fp(t)o(yp)q(es|t)o(yp)q(es)g(that)f(are)g(univ)
+o(ersally)i(quan)o(ti\014ed)g(in)f(some)f(w)o(a)o(y)0 1194
+y(o)o(v)o(er)d Fo(al)r(l)g Fp(t)o(yp)q(es.)27 b(P)o(olymorphic)18
+b(t)o(yp)q(e)f(expressions)i(essen)o(tially)g(describ)q(e)g
+Fo(families)e Fp(of)g(t)o(yp)q(es.)27 b(F)l(or)16 b(example,)0
+1250 y(\()p Fn(8)p Fi(a)p Fp(\))p Fi([a])21 b Fp(is)h(the)g(family)h(of)f(t)o
+(yp)q(es)f(consisting)i(of,)g(for)e(ev)o(ery)h(t)o(yp)q(e)g
+Fi(a)p Fp(,)h(the)f(t)o(yp)q(e)g(of)g(lists)h(of)e Fi(a)p Fp(.)40
+b(Lists)22 b(of)0 1306 y(in)o(tegers)15 b(\(e.g.)f Fi([1,2,3])o
+Fp(\),)g(lists)i(of)f(c)o(haracters)f(\()p Fi(['a','b','c'])n
+Fp(\),)g(ev)o(en)h(lists)h(of)f(lists)h(of)e(in)o(tegers,)h(etc.,)f(are)0
+1363 y(all)j(mem)o(b)q(ers)e(of)h(this)g(family)l(.)22 b(\(Note,)15
+b(ho)o(w)o(ev)o(er,)f(that)h Fi([2,'b'])g Fp(is)h Fo(not)f
+Fp(a)h(v)m(alid)h(example,)f(since)h(there)f(is)g(no)0 1419
+y(single)h(t)o(yp)q(e)e(that)f(con)o(tains)i(b)q(oth)f Fi(2)g
+Fp(and)g Fi('b')p Fp(.\))71 1499 y([Iden)o(ti\014ers)21 b(suc)o(h)f(as)44
+b Fi(a)g Fp(ab)q(o)o(v)o(e)20 b(are)g(called)i Fo(typ)n(e)f(variables)p
+Fp(,)g(and)f(are)g(uncapitalized)j(to)d(distinguish)0 1555
+y(them)d(from)g(sp)q(eci\014c)i(t)o(yp)q(es)f(suc)o(h)f(as)g
+Fi(Int)p Fp(.)26 b(F)l(urthermore,)17 b(since)i(Hask)o(ell)f(has)f(only)h
+(univ)o(ersally)h(quan)o(ti\014ed)0 1612 y(t)o(yp)q(es,)c(there)g(is)h(no)f
+(need)h(to)f(explicitly)j(write)d(out)g(the)g(sym)o(b)q(ol)g(for)g(univ)o
+(ersal)h(quan)o(ti\014cation,)g(and)f(th)o(us)g(w)o(e)0 1668
+y(simply)g(write)f Fi([a])f Fp(in)i(the)f(example)g(ab)q(o)o(v)o(e.)19
+b(In)c(other)e(w)o(ords,)g(all)i(t)o(yp)q(e)f(v)m(ariables)h(are)e
+(implicitly)k(univ)o(ersally)0 1725 y(quan)o(ti\014ed.])71
+1804 y(Lists)g(are)g(a)g(commonly)h(used)g(data)e(structure)i(in)g
+(functional)g(languages,)g(and)f(are)g(a)g(go)q(o)q(d)g(v)o(ehicle)j(for)0
+1860 y(explaining)f(the)e(principals)j(of)c(p)q(olymorphism.)27
+b(The)17 b(list)h Fi([1,2,3])e Fp(in)i(Hask)o(ell)f(is)h(actually)g
+(shorthand)f(for)0 1917 y(the)i(list)g Fi(1:\(2:\(3:[]\)\))o
+Fp(,)g(where)g Fi([])f Fp(is)i(the)e(empt)o(y)h(list)g(and)g
+Fi(:)g Fp(is)g(the)g(in\014x)h(op)q(erator)e(that)g(adds)g(its)h(\014rst)0
+1973 y(argumen)o(t)f(to)g(the)h(fron)o(t)f(of)h(its)g(second)g(argumen)o(t)f
+(\(a)g(list\).)1093 1957 y Fm(3)1145 1973 y Fp(Since)i Fi(:)f
+Fp(is)g(righ)o(t)g(asso)q(ciativ)o(e,)g(w)o(e)g(can)g(also)0
+2030 y(write)c(this)h(list)g(as)f Fi(1:2:3:[])o Fp(.)71 2109
+y(As)c(an)h(example)g(of)f(a)h(user-de\014ned)h(function)f(that)f(op)q
+(erates)h(on)f(lists,)i(consider)f(the)g(problem)g(of)g(coun)o(ting)0
+2165 y(the)j(n)o(um)o(b)q(er)h(of)f(elemen)o(ts)g(in)h(a)f(list:)71
+2266 y Fi(length)428 b(::)24 b([a])f(->)h(Int)71 2322 y(length)46
+b([])334 b(=)24 b(0)71 2379 y(length)f(\(x:xs\))261 b(=)24
+b(1)g(+)f(length)h(xs)0 2488 y Fp(This)14 b(de\014nition)i(is)e(almost)g
+(self-explanatory)l(.)20 b(W)l(e)14 b(can)g(read)g(the)g(equations)g(as)f(sa)
+o(ying:)19 b(\\The)14 b(length)g(of)g(the)p 0 2525 780 2 v
+52 2552 a Fl(2)69 2568 y Fk(With)g(a)f(few)g(exceptions)i(to)d(b)q(e)i
+(describ)q(ed)h(later.)52 2598 y Fl(3)69 2614 y Ff(:)e Fk(and)g
+Ff([])f Fk(are)h(lik)o(e)i(Lisp's)e Ff(cons)f Fk(and)h Ff(nil)o
+Fk(,)g(resp)q(ectiv)o(ely)m(.)p eop
+%%Page: 4 4
+bop 0 -40 a Fp(T-4)906 b Fj(2)45 b(V)-5 b(ALUES,)16 b(TYPES,)e(AND)h(OTHER)h
+(GOODIES)0 105 y Fp(empt)o(y)g(list)i(is)f(0,)f(and)h(the)g(length)g(of)f(a)h
+(list)g(whose)g(\014rst)f(elemen)o(t)h(is)h Fi(x)e Fp(and)h(remainder)g(is)g
+Fi(xs)g Fp(is)g(1)f(plus)i(the)0 162 y(length)g(of)f Fi(xs)p
+Fp(.")26 b(\(Note)16 b(the)i(naming)f(con)o(v)o(en)o(tion)h(used)g(here;)g
+Fi(xs)f Fp(is)h(the)f(plural)i(of)e Fi(x)p Fp(,)g(and)h(should)g(b)q(e)g
+(read)0 218 y(that)c(w)o(a)o(y)l(.\))71 300 y(Although)20 b(in)o(tuitiv)o(e,)
+h(this)f(example)g(highligh)o(ts)h(an)e(imp)q(ortan)o(t)g(asp)q(ect)h(of)f
+(Hask)o(ell)h(that)f(is)h(y)o(et)f(to)f(b)q(e)0 357 y(explained:)k
+Fo(p)n(attern)17 b(matching)p Fp(.)j(The)15 b(left-hand)i(sides)f(of)f(the)g
+(equations)h(con)o(tain)f Fo(p)n(atterns)g Fp(suc)o(h)h(as)f
+Fi([])g Fp(and)0 413 y Fi(x:xs)o Fp(.)28 b(In)19 b(a)e(function)i
+(application)g(these)f(patterns)g(are)f Fo(matche)n(d)i Fp(against)e(actual)h
+(parameters)f(in)i(a)e(fairly)0 469 y(in)o(tuitiv)o(e)c(w)o(a)o(y)d(\()p
+Fi([])h Fp(only)h(matc)o(hes)f(the)h(empt)o(y)f(list,)i(and)e
+Fi(x:xs)g Fp(will)i(successfully)h(matc)o(h)d(an)o(y)g(list)h(with)g(at)f
+(least)0 526 y(one)17 b(elemen)o(t,)g(binding)i Fi(x)d Fp(to)g(the)h(\014rst)
+f(elemen)o(t)i(and)e Fi(xs)h Fp(to)f(the)h(rest)f(of)g(the)h(list\).)24
+b(If)17 b(the)g(matc)o(h)f(succeeds,)0 582 y(the)h(righ)o(t-hand)g(side)g(is)
+h(ev)m(aluated)f(and)g(returned)g(as)f(the)h(result)g(of)f(the)h
+(application.)26 b(If)17 b(it)g(fails,)g(the)g(next)0 639 y(equation)f(is)f
+(tried,)h(and)f(if)h(all)g(equations)f(fail,)h(an)f(error)g(results.)71
+721 y(De\014ning)e(functions)g(b)o(y)f(pattern)f(matc)o(hing)i(is)f(quite)h
+(common)f(in)h(Hask)o(ell,)g(and)g(the)f(user)g(should)h(b)q(ecome)0
+777 y(familiar)j(with)g(the)f(v)m(arious)h(kinds)g(of)f(patterns)g(that)g
+(are)g(allo)o(w)o(ed;)g(w)o(e)g(will)i(return)e(to)g(this)h(issue)g(in)g
+(Section)0 834 y(3.14.)71 916 y Fi(length)i Fp(is)i(also)f(an)g(example)i(of)
+e(a)g Fo(p)n(olymorphic)h(function)p Fp(.)32 b(It)20 b(can)f(b)q(e)h(applied)
+h(to)e(a)g(list)h(con)o(taining)0 972 y(elemen)o(ts)c(of)f(an)o(y)f(t)o(yp)q
+(e.)20 b(F)l(or)15 b(example:)600 1071 y Fi(length)23 b([1,2,3])245
+b Fn(\))102 b Fp(3)600 1128 y Fi(length)23 b(['a','b','c'])101
+b Fn(\))h Fp(3)600 1184 y Fi(length)23 b([[],[],[]])173 b Fn(\))102
+b Fp(3)71 1309 y(Here)15 b(are)g(t)o(w)o(o)f(other)h(useful)h(p)q(olymorphic)
+h(functions)f(on)f(lists)h(that)e(will)j(b)q(e)f(used)g(later:)71
+1418 y Fi(head)476 b(::)24 b([a])f(->)h(a)71 1475 y(head)f(\(x:xs\))309
+b(=)48 b(x)71 1554 y(tail)476 b(::)24 b([a])f(->)h([a])71 1611
+y(tail)f(\(x:xs\))309 b(=)48 b(xs)71 1770 y Fp(With)10 b(p)q(olymorphic)i(t)o
+(yp)q(es,)g(w)o(e)e(\014nd)h(that)f(some)g(t)o(yp)q(es)h(are)f(in)h(a)g
+(sense)g(strictly)g Fo(mor)n(e)h(gener)n(al)d Fp(than)i(others.)0
+1827 y(F)l(or)18 b(example,)h(the)f(t)o(yp)q(e)h Fi([a])e Fp(is)i(more)f
+(general)h(than)f Fi([Char])o Fp(.)29 b(In)19 b(other)f(w)o(ords,)f(the)i
+(latter)f(t)o(yp)q(e)g(can)g(b)q(e)0 1883 y(deriv)o(ed)12 b(from)e(the)h
+(former)f(b)o(y)h(a)g(suitable)h(substitution)g(for)e Fi(a)p
+Fp(.)18 b(With)12 b(regard)e(to)g(this)i(generalization)g(ordering,)0
+1940 y(Hask)o(ell's)21 b(t)o(yp)q(e)g(system)g(p)q(ossesses)g(t)o(w)o(o)e
+(imp)q(ortan)o(t)h(prop)q(erties:)32 b(First,)22 b(ev)o(ery)e(w)o(ell-t)o(yp)
+q(ed)j(expression)e(is)0 1996 y(guaran)o(teed)16 b(to)f(ha)o(v)o(e)h(a)g
+(unique)i Fo(princip)n(al)d Fp(t)o(yp)q(e)i(\(explained)g(b)q(elo)o(w\),)g
+(and)f(second,)h(the)f(principal)j(t)o(yp)q(e)d(can)0 2053
+y(b)q(e)k Fo(inferr)n(e)n(d)f Fp(automatically)h(\()p Fn(x)o
+Fp(4.1.3\).)31 b(In)20 b(comparison)g(to)f(a)g Fo(monomorphic)n(al)r(ly)i
+(typ)n(e)n(d)e Fp(language)h(suc)o(h)f(as)0 2109 y(P)o(ascal,)c(the)h(reader)
+g(will)i(\014nd)e(that)f Fo(p)n(olymorphism)i Fp(impro)o(v)o(es)e(expressiv)o
+(eness,)i(and)f Fo(typ)n(e)h(infer)n(enc)n(e)d Fp(lessens)0
+2166 y(the)h(burden)h(of)f(t)o(yp)q(es)g(on)h(the)f(programmer.)71
+2248 y(An)f(expression's)h(or)e(function's)i(principal)h(t)o(yp)q(e)f(is)f
+(the)g(least)h(general)f(t)o(yp)q(e)h(that,)e(in)o(tuitiv)o(ely)l(,)j(\\con)o
+(tains)0 2304 y(all)22 b(instances)f(of)f(the)h(expression.")37
+b(F)l(or)20 b(example,)j(the)e(principal)i(t)o(yp)q(e)d(of)h
+Fi(head)f Fp(is)h Fi([a]->a)o Fp(;)i(the)e(t)o(yp)q(es)0 2361
+y Fi([b]->a)o Fp(,)15 b Fi(a->a)o Fp(,)f(or)g(ev)o(en)39 b
+Fi(a)g Fp(are)14 b Fo(to)n(o)i(gener)n(al)p Fp(,)d(whereas)i(something)g(lik)
+o(e)g Fi([Int]->Int)f Fp(is)h Fo(to)n(o)h(sp)n(e)n(ci\014c)p
+Fp(.)i(The)0 2417 y(existence)c(of)e(unique)h(principal)i(t)o(yp)q(es)d(is)h
+(the)g(hallmark)g(feature)f(of)g(the)g Fo(Hind)r(ley-Milner)h(typ)n(e)g
+(system)p Fp(,)f(whic)o(h)0 2473 y(forms)g(the)g(basis)h(of)f(the)h(t)o(yp)q
+(e)f(systems)g(of)g(Hask)o(ell,)h(ML,)g(Miranda,)1191 2457
+y Fm(4)1223 2473 y Fp(and)g(sev)o(eral)f(other)g(\(mostly)g(functional\))0
+2530 y(languages.)p 0 2571 780 2 v 52 2598 a Fl(4)69 2614 y
+Fk(\\Miranda")j(is)f(a)f(trademark)h(of)e(Researc)o(h)i(Soft)o(w)o(are,)f
+(Ltd.)p eop
+%%Page: 5 5
+bop 0 -40 a Fj(2.2)45 b(User-De\014ned)16 b(T)o(yp)q(es)1384
+b Fp(T-5)0 105 y Fg(2.2)56 b(User-De\014ned)17 b(T)n(yp)r(es)0
+217 y Fp(W)l(e)f(can)h(de\014ne)g(our)f(o)o(wn)f(t)o(yp)q(es)i(in)g(Hask)o
+(ell)g(using)g(a)f Fi(data)f Fp(declaration,)i(whic)o(h)g(w)o(e)f(in)o(tro)q
+(duce)h(via)f(a)g(series)0 273 y(of)f(examples)h(\()p Fn(x)p
+Fp(4.2.1\).)71 355 y(An)f(imp)q(ortan)o(t)g(prede\014ned)i(t)o(yp)q(e)e(in)h
+(Hask)o(ell)g(is)g(that)e(of)h(truth)g(v)m(alues:)71 464 y
+Fi(data)23 b(Bool)357 b(=)24 b(False)f(|)h(True)0 573 y Fp(The)17
+b(t)o(yp)q(e)h(b)q(eing)g(de\014ned)h(here)e(is)h Fi(Bool)o
+Fp(,)g(and)f(it)g(has)g(exactly)h(t)o(w)o(o)e(v)m(alues:)25
+b Fi(True)16 b Fp(and)i Fi(False)o Fp(.)26 b Fi(Bool)16 b Fp(is)i(an)0
+630 y(example)g(of)e(a)h(\(n)o(ullary\))g Fo(typ)n(e)h(c)n(onstructor)p
+Fp(,)f(and)h Fi(True)e Fp(and)h Fi(False)g Fp(are)f(\(also)h(n)o(ullary\))h
+Fo(data)g(c)n(onstructors)0 686 y Fp(\(or)c(just)h Fo(c)n(onstructors)p
+Fp(,)g(for)f(short\).)71 768 y(Similarly)l(,)j(w)o(e)e(migh)o(t)g(wish)g(to)g
+(de\014ne)h(a)f(color)g(t)o(yp)q(e:)71 877 y Fi(data)23 b(Color)333
+b(=)24 b(Red)f(|)h(Green)f(|)h(Blue)f(|)h(Indigo)f(|)h(Violet)0
+986 y Fp(Both)18 b Fi(Bool)f Fp(and)h Fi(Color)f Fp(are)g(examples)i(of)e
+Fo(enumer)n(ate)n(d)h(typ)n(es)p Fp(,)g(since)h(they)f(consist)g(of)f(a)h
+(\014nite)g(n)o(um)o(b)q(er)g(of)0 1043 y(n)o(ullary)e(data)f(constructors.)
+71 1125 y(Here)g(is)h(an)f(example)h(of)f(a)g(t)o(yp)q(e)g(with)g(just)g(one)
+h(data)e(constructor:)71 1234 y Fi(data)23 b(Point)g(a)286
+b(=)24 b(Pt)g(a)f(a)0 1343 y Fp(Because)13 b(of)g(the)g(single)h
+(constructor,)e(a)g(t)o(yp)q(e)h(lik)o(e)h Fi(Point)e Fp(is)i(often)e(called)
+j(a)d Fo(tuple)i(typ)n(e)p Fp(,)f(since)h(it)f(is)g(essen)o(tially)0
+1399 y(just)h(a)h(cartesian)f(pro)q(duct)h(\(in)g(this)g(case)g(binary\))g
+(of)f(other)g(t)o(yp)q(es.)1189 1383 y Fm(5)1228 1399 y Fp(In)i(con)o(trast,)
+d(m)o(ulti-constructor)h(t)o(yp)q(es,)0 1456 y(suc)o(h)i(as)e
+Fi(Bool)h Fp(and)g Fi(Color)p Fp(,)f(are)h(called)i(\(disjoin)o(t\))e
+Fo(union)g Fp(t)o(yp)q(es.)71 1538 y(More)c(imp)q(ortan)o(tly)l(,)h(ho)o(w)o
+(ev)o(er,)f Fi(Point)g Fp(is)i(an)e(example)i(of)e(a)h Fo(p)n(olymorphic)g
+Fp(t)o(yp)q(e:)18 b(for)11 b(an)o(y)h(t)o(yp)q(e)f Fh(t)p Fp(,)i(it)f
+(de\014nes)0 1594 y(the)17 b(t)o(yp)q(e)h(of)f(cartesian)g(p)q(oin)o(ts)h
+(that)f(use)g Fh(t)h Fp(as)f(the)h(co)q(ordinate)f(t)o(yp)q(e.)27
+b Fi(Point)17 b Fp(can)g(no)o(w)g(b)q(e)h(seen)g(clearly)g(as)0
+1651 y(a)g(unary)g(t)o(yp)q(e)g(constructor,)f(since)j(from)d(the)h(t)o(yp)q
+(e)g Fh(t)h Fp(it)f(constructs)g(a)f(new)i(t)o(yp)q(e)f Fi(Point)23
+b Fh(t)p Fp(.)29 b(\(In)18 b(the)g(same)0 1707 y(sense,)e(using)h(the)f(list)
+h(example)g(giv)o(en)g(earlier,)g Fi([)p 884 1707 14 2 v 16
+w(])f Fp(is)h(also)f(a)f(t)o(yp)q(e)i(constructor)e(\(where)h(w)o(e)g(ha)o(v)
+o(e)f(used)i(\\)p 1914 1707 V 16 w(")0 1764 y(to)g(denote)i(the)f(missing)h
+(argumen)o(t\):)24 b(giv)o(en)19 b(an)o(y)f(t)o(yp)q(e)g Fh(t)g
+Fp(w)o(e)g(can)g(\\apply")h Fi([)p 1404 1764 V 16 w(])f Fp(to)f(yield)j(a)e
+(new)g(t)o(yp)q(e)g Fi([)p Fh(t)p Fi(])p Fp(.)0 1820 y(Similarly)l(,)p
+203 1820 V 32 w Fi(->)p 267 1820 V 28 w Fp(is)c(a)e(t)o(yp)q(e)h
+(constructor:)18 b(giv)o(en)13 b(t)o(w)o(o)f(t)o(yp)q(es)g
+Fh(t)i Fp(and)f Fh(u)p Fp(,)f Fh(t)p Fi(->)q Fh(u)g Fp(is)i(the)f(t)o(yp)q(e)
+f(of)h(functions)g(mapping)0 1876 y(elemen)o(ts)j(of)f(t)o(yp)q(e)g
+Fh(t)g Fp(to)g(elemen)o(ts)h(of)f(t)o(yp)q(e)g Fh(u)p Fp(.\))71
+1958 y(Note)f(that)g(the)g(t)o(yp)q(e)h(of)f(the)h(binary)g(constructor)f
+Fi(Pt)g Fp(is)h Fi(a)24 b(->)g(a)f(->)h(Point)f(a)p Fp(,)14
+b(and)h(th)o(us)g(the)f(follo)o(wing)0 2015 y(t)o(ypings)h(are)g(v)m(alid:)71
+2124 y Fi(Pt)47 b(2.0)g(3.0)286 b(::)24 b(Point)f(Float)71
+2180 y(Pt)47 b('a')g('b')286 b(::)24 b(Point)f(Char)71 2237
+y(Pt)g(True)g(False)262 b(::)24 b(Point)f(Bool)0 2346 y Fp(On)16
+b(the)f(other)g(hand,)g(an)g(expression)h(suc)o(h)g(as)f Fi(Pt)23
+b('a')h(1)15 b Fp(is)g(ill-t)o(yp)q(ed.)71 2428 y(It)h(is)h(imp)q(ortan)o(t)f
+(to)g(distinguish)i(b)q(et)o(w)o(een)f(applying)g(a)f Fo(c)n(onstructor)h
+Fp(to)f(yield)i(a)e Fo(value)p Fp(,)g(and)g(applying)i(a)0
+2484 y Fo(typ)n(e)i(c)n(onstructor)e Fp(to)h(yield)h(a)f Fo(typ)n(e)p
+Fp(;)h(the)f(former)f(happ)q(ens)i(at)e(run-time)i(and)f(is)h(ho)o(w)e(w)o(e)
+h(compute)g(things)p 0 2525 780 2 v 52 2552 a Fl(5)69 2568
+y Fk(T)m(uples)13 b(are)g(somewhat)g(lik)o(e)h Fe(r)n(e)n(c)n(or)n(ds)d
+Fk(in)i(other)g(languages,)h(except)f(that)g(the)g(elemen)o(ts)g(are)g(p)q
+(ositional,)i(rather)e(than)g(ha)o(ving)0 2614 y(names)h(\(lab)q(els\))g
+(asso)q(ciated)h(with)f(them.)p eop
+%%Page: 6 6
+bop 0 -40 a Fp(T-6)906 b Fj(2)45 b(V)-5 b(ALUES,)16 b(TYPES,)e(AND)h(OTHER)h
+(GOODIES)0 105 y Fp(in)g(Hask)o(ell,)h(whereas)e(the)h(latter)f(happ)q(ens)i
+(at)e(compile-time)i(and)f(is)g(part)f(of)g(the)h(t)o(yp)q(e)g(system's)f
+(pro)q(cess)g(of)0 162 y(ensuring)h(t)o(yp)q(e)f(safet)o(y)l(.)0
+298 y Fg(2.3)56 b(Recursiv)n(e)17 b(T)n(yp)r(es)0 402 y Fp(T)o(yp)q(es)e(can)
+h(also)f(b)q(e)h(recursiv)o(e,)f(as)g(in:)71 511 y Fi(data)23
+b(Tree)g(a)310 b(=)24 b(Leaf)f(a)h(|)g(Branch)f(\(Tree)g(a\))h(\(Tree)f(a\))0
+620 y Fp(Here)11 b(w)o(e)g(ha)o(v)o(e)f(de\014ned)i(a)f(p)q(olymorphic)h
+(binary)g(tree)e(t)o(yp)q(e)h(whose)g(elemen)o(ts)g(are)g(either)h(leaf)f(no)
+q(des)g(con)o(taining)0 677 y(a)k(v)m(alue)h(of)f(t)o(yp)q(e)g
+Fi(a)p Fp(,)g(or)g(in)o(ternal)h(no)q(des)g(\(\\branc)o(hes"\))e(con)o
+(taining)i(\(recursiv)o(ely\))g(t)o(w)o(o)e(sub-trees.)71 751
+y(When)e(reading)g(data)f(declarations)h(suc)o(h)g(as)f(this,)i(remem)o(b)q
+(er)f(that)f Fi(Tree)g Fp(is)h(a)f(t)o(yp)q(e)h(constructor,)f(whereas)0
+808 y Fi(Branch)k Fp(and)i Fi(Leaf)f Fp(are)g(data)f(constructors.)22
+b(Aside)c(from)d(establishing)j(a)e(connection)i(b)q(et)o(w)o(een)e(these)h
+(con-)0 864 y(structors,)d(the)h(ab)q(o)o(v)o(e)g(declaration)h(is)g(essen)o
+(tially)g(de\014ning)h(the)e(follo)o(wing)h(t)o(yp)q(es)f(for)g
+Fi(Branch)f Fp(and)i Fi(Leaf)o Fp(:)71 973 y Fi(Branch)428
+b(::)24 b(Tree)f(a)h(->)g(Tree)f(a)h(->)f(Tree)g(a)71 1030
+y(Leaf)476 b(::)24 b(a)g(->)f(Tree)h(a)71 1182 y Fp(With)18
+b(this)h(example)g(w)o(e)f(ha)o(v)o(e)f(de\014ned)j(a)e(t)o(yp)q(e)g
+(su\016cien)o(tly)i(ric)o(h)f(to)e(allo)o(w)i(de\014ning)g(some)f(in)o
+(teresting)0 1238 y(\(recursiv)o(e\))f(functions)h(that)e(use)h(it.)26
+b(F)l(or)16 b(example,)i(supp)q(ose)g(w)o(e)e(wish)i(to)e(de\014ne)i(a)f
+(function)h Fi(fringe)e Fp(that)0 1295 y(returns)c(a)h(list)g(of)f(all)h(the)
+g(elemen)o(ts)g(in)g(the)g(lea)o(v)o(es)g(of)f(a)g(tree)g(from)g(left)h(to)f
+(righ)o(t.)18 b(It's)13 b(usually)g(helpful)i(to)d(write)0
+1351 y(do)o(wn)k(the)g(t)o(yp)q(e)g(of)g(new)g(functions)h(\014rst;)f(in)h
+(this)f(case)g(w)o(e)g(see)h(that)e(the)h(t)o(yp)q(e)g(should)h(b)q(e)g
+Fi(Tree)23 b(a)h(->)g([a])o Fp(.)0 1408 y(That)16 b(is,)h Fi(fringe)e
+Fp(is)i(a)f(p)q(olymorphic)i(function)f(that,)f(for)g(an)o(y)g(t)o(yp)q(e)g
+Fi(a)p Fp(,)h(maps)f(trees)g(of)g Fi(a)g Fp(in)o(to)g(lists)i(of)e
+Fi(a)o Fp(.)24 b(A)0 1464 y(suitable)16 b(de\014nition)h(follo)o(ws:)71
+1564 y Fi(fringe)23 b(::)g(Tree)h(a)f(->)h([a])71 1621 y(fringe)f(\(Leaf)g
+(x\))286 b(=)24 b([x])71 1677 y(fringe)f(\(Branch)g(left)g(right\))g(=)h
+(fringe)f(left)g(++)h(fringe)f(right)0 1789 y Fp(Where)13 b
+Fi(++)f Fp(is)i(the)f(in\014x)h(op)q(erator)e(that)g(concatenates)g(t)o(w)o
+(o)g(lists)h(\(its)g(full)h(de\014nition)h(will)g(b)q(e)e(giv)o(en)g(in)h
+(Section)0 1845 y(3.2\).)20 b(As)15 b(with)h(the)g Fi(length)e
+Fp(example)j(giv)o(en)f(earlier,)g Fi(fringe)f Fp(is)h(de\014ned)h(using)f
+(pattern)f(matc)o(hing,)g(except)0 1902 y(that)j(here)g(w)o(e)g(see)h
+(patterns)f(in)o(v)o(olving)i(user-de\014ned)g(constructors:)25
+b Fi(Leaf)18 b Fp(and)g Fi(Branch)o Fp(.)30 b([Note)17 b(that)h(the)0
+1958 y(formal)d(parameters)f(are)h(easily)h(iden)o(ti\014ed)i(as)c(the)i
+(ones)f(b)q(eginning)i(with)f(lo)o(w)o(er-case)f(letters.])0
+2095 y Fg(2.4)56 b(T)n(yp)r(e)18 b(Synon)n(yms)0 2199 y Fp(F)l(or)g(con)o(v)o
+(enience,)i(Hask)o(ell)g(pro)o(vides)e(a)h(w)o(a)o(y)e(to)h(de\014ne)h
+Fo(typ)n(e)h(synonyms)p Fp(;)e(i.e.)g(names)h(for)f(commonly)g(used)0
+2255 y(t)o(yp)q(es.)i(T)o(yp)q(e)15 b(synon)o(yms)g(are)g(created)g(using)h
+(a)f Fi(type)g Fp(declaration)h(\()p Fn(x)p Fp(4.2.2\).)h(Here)f(are)f(sev)o
+(eral)g(examples:)71 2367 y Fi(type)23 b(String)309 b(=)24
+b([Char])71 2423 y(type)f(Person)309 b(=)24 b(\(Name,Address\))71
+2480 y(type)f(Name)357 b(=)24 b(String)71 2536 y(data)f(Address)285
+b(=)24 b(None)f(|)h(Addr)f(String)p eop
+%%Page: 7 7
+bop 0 -40 a Fj(2.5)45 b(Built-in)17 b(T)o(yp)q(es)e(Are)h(Not)e(Sp)q(ecial)
+1157 b Fp(T-7)71 105 y(T)o(yp)q(e)18 b(synon)o(yms)g(do)g(not)g(de\014ne)i
+(new)f(t)o(yp)q(es,)f(but)h(simply)h(giv)o(e)e(new)h(names)f(for)g(existing)h
+(t)o(yp)q(es.)30 b(F)l(or)0 162 y(example,)15 b(the)g(t)o(yp)q(e)f
+Fi(Person)23 b(->)h(Name)14 b Fp(is)h(precisely)h(equiv)m(alen)o(t)h(to)d
+Fi(\(String,Address\))21 b(->)j(String)o Fp(.)c(The)0 218 y(new)f(names)f
+(are)g(often)g(shorter)g(than)g(the)h(t)o(yp)q(es)f(they)g(are)h(synon)o
+(ymous)f(with,)h(but)f(this)h(is)g(not)f(the)g(only)0 274 y(purp)q(ose)13
+b(of)e(t)o(yp)q(e)h(synon)o(yms:)18 b(they)12 b(can)g(also)g(impro)o(v)o(e)g
+(readabilit)o(y)h(of)e(programs)g(b)o(y)h(b)q(eing)h(more)e(mnemonic;)0
+331 y(indeed,)17 b(the)e(ab)q(o)o(v)o(e)g(examples)h(highligh)o(t)g(this.)21
+b(W)l(e)15 b(can)g(ev)o(en)h(giv)o(e)f(new)h(names)f(to)f(p)q(olymorphic)j(t)
+o(yp)q(es:)71 440 y Fi(type)23 b(AssocList)g(a)g(b)334 b(=)24
+b([\(a,b\)])0 549 y Fp(This)16 b(is)f(the)h(t)o(yp)q(e)f(of)g(\\asso)q
+(ciation)g(lists")h(whic)o(h)g(asso)q(ciate)f(v)m(alues)h(of)f(t)o(yp)q(e)g
+Fi(a)g Fp(with)h(those)f(of)g(t)o(yp)q(e)g Fi(b)p Fp(.)0 723
+y Fg(2.5)56 b(Built-in)17 b(T)n(yp)r(es)h(Are)g(Not)g(Sp)r(ecial)0
+845 y Fp(Earlier)12 b(w)o(e)e(in)o(tro)q(duced)j(sev)o(eral)e(\\built-in")i
+(t)o(yp)q(es)d(suc)o(h)i(as)e(lists,)j(tuples,)f(in)o(tegers,)f(and)h(c)o
+(haracters.)17 b(W)l(e)11 b(ha)o(v)o(e)0 902 y(also)k(sho)o(wn)g(ho)o(w)g
+(new)g(user-de\014ned)i(t)o(yp)q(es)f(can)f(b)q(e)h(de\014ned.)21
+b(Aside)c(from)d(sp)q(ecial)j(syn)o(tax,)d(are)h(the)h(built-in)0
+958 y(t)o(yp)q(es)e(in)h(an)o(y)f(w)o(a)o(y)f(more)h(sp)q(ecial)i(than)e(the)
+g(user-de\014ned)i(ones?)k(The)14 b(answ)o(er)g(is)h Fo(no)p
+Fp(.)k(The)14 b(sp)q(ecial)i(syn)o(tax)d(is)0 1015 y(for)i(con)o(v)o(enience)
+h(and)g(for)e(consistency)i(with)g(historical)g(con)o(v)o(en)o(tion,)f(but)h
+(has)f(no)g(seman)o(tic)g(consequence.)71 1104 y(W)l(e)d(can)h(emphasize)h
+(this)f(p)q(oin)o(t)g(b)o(y)f(considering)i(what)e(the)h(t)o(yp)q(e)f
+(declarations)h(w)o(ould)g(lo)q(ok)g(lik)o(e)h(for)e(these)0
+1161 y(built-in)19 b(t)o(yp)q(es)e(if)g(in)h(fact)e(w)o(e)g(w)o(ere)h(allo)o
+(w)o(ed)g(to)f(use)h(the)g(sp)q(ecial)h(syn)o(tax)e(in)i(de\014ning)g(them.)
+24 b(F)l(or)16 b(example,)0 1217 y(the)f Fi(Char)g Fp(t)o(yp)q(e)g(migh)o(t)g
+(b)q(e)h(written)f(as:)71 1326 y Fi(data)23 b(Char)166 b(=)24
+b('a')g(|)f('b')h(|)f('c')h(|)g(...)214 b(--)24 b(This)f(is)h(not)f(valid)452
+1382 y(|)h('A')g(|)f('B')h(|)f('C')h(|)g(...)214 b(--)24 b(Haskell)f(code!)
+452 1439 y(|)h('1')g(|)f('2')h(|)f('3')h(|)g(...)452 1495 y(...)0
+1604 y Fp(These)14 b(constructor)f(names)h(are)g(not)f(syn)o(tactically)i(v)m
+(alid;)h(to)d(\014x)h(them)g(w)o(e)g(w)o(ould)g(ha)o(v)o(e)f(to)h(write)g
+(something)0 1661 y(lik)o(e:)71 1761 y Fi(data)23 b(Char)166
+b(=)24 b(Ca)g(|)f(Cb)h(|)g(Cc)f(|)h(...)452 1818 y(|)g(CA)g(|)f(CB)h(|)g(CC)f
+(|)h(...)452 1874 y(|)g(C1)g(|)f(C2)h(|)g(C3)f(|)h(...)452
+1930 y(...)0 2040 y Fp(Ev)o(en)18 b(though)g(these)g(constructors)f(are)g
+(more)h(concise,)h(they)f(are)g(quite)g(uncon)o(v)o(en)o(tional)h(for)e
+(represen)o(ting)0 2096 y(c)o(haracters.)71 2185 y(In)k(an)o(y)g(case,)h
+(writing)g(\\pseudo-Hask)o(ell")g(co)q(de)g(in)g(this)g(w)o(a)o(y)e(helps)i
+(us)f(to)g(see)g(through)g(the)g(sp)q(ecial)0 2242 y(syn)o(tax.)h(W)l(e)16
+b(see)g(no)o(w)g(that)f Fi(Char)h Fp(is)g(just)g(an)g(en)o(umerated)g(t)o(yp)
+q(e)g(consisting)h(of)f(a)g(large)g(n)o(um)o(b)q(er)g(of)g(n)o(ullary)0
+2298 y(constructors.)j(Thinking)d(of)e Fi(Char)g Fp(in)i(this)f(w)o(a)o(y)e
+(mak)o(es)h(it)h(clear)g(wh)o(y)l(,)g(for)f(example,)h(w)o(e)f(can)h
+(pattern-matc)o(h)0 2355 y(against)j(c)o(haracters)g(in)i(function)f
+(de\014nitions;)j(i.e.,)e(w)o(e)e(w)o(ould)h(exp)q(ect)h(to)e(b)q(e)h(able)g
+(to)g(do)f(so)h(for)f(an)o(y)g(of)g(a)0 2411 y(t)o(yp)q(e's)d(constructors.)
+71 2501 y([This)20 b(example)i(also)e(demonstrates)g(the)h(use)g(of)f
+Fo(c)n(omments)f Fp(in)j(Hask)o(ell;)i(the)c(c)o(haracters)g
+Fi(--)g Fp(and)h(all)0 2557 y(subsequen)o(t)f(c)o(haracters)e(to)g(the)h(end)
+g(of)g(the)g(line)h(are)f(ignored.)32 b(Hask)o(ell)19 b(also)g(p)q(ermits)h
+Fo(neste)n(d)e Fp(commen)o(ts)0 2614 y(whic)o(h)e(ha)o(v)o(e)f(the)g(form)g
+Fi({-)o Fh(:)8 b(:)g(:)n Fi(-})15 b Fp(and)h(can)f(app)q(ear)g(an)o(ywhere)g
+(\()p Fn(x)p Fp(2.2\).])p eop
+%%Page: 8 8
+bop 0 -40 a Fp(T-8)906 b Fj(2)45 b(V)-5 b(ALUES,)16 b(TYPES,)e(AND)h(OTHER)h
+(GOODIES)71 105 y Fp(Similarly)l(,)h(w)o(e)e(could)h(de\014ne)g
+Fi(Int)f Fp(and)g Fi(Integer)f Fp(b)o(y:)71 215 y Fi(data)23
+b(Int)119 b(=)24 b(-65532)f(|)g(...)h(|)f(-1)h(|)g(0)g(|)f(1)h(|)g(...)f(|)h
+(65532)47 b(--)24 b(more)f(pseudo-code)71 272 y(data)g(Integer)g(=)167
+b(...)23 b(-2)h(|)f(-1)h(|)g(0)g(|)f(1)h(|)g(2)f(...)0 381
+y Fp(where)15 b Fi(-65532)g Fp(and)g Fi(65532)p Fp(,)f(sa)o(y)l(,)h(are)g
+(the)g(maxim)o(um)g(and)h(minim)o(um)g(\014xed)g(precision)h(in)o(tegers)e
+(for)g(a)f(giv)o(en)0 437 y(implemen)o(tation.)22 b Fi(Int)15
+b Fp(is)h(a)f(m)o(uc)o(h)h(larger)f(en)o(umeration)h(than)f
+Fi(Char)p Fp(,)g(but)h(it's)f(still)i(\014nite!)22 b(In)16
+b(con)o(trast,)e(the)0 494 y(pseudo-co)q(de)h(for)f Fi(Integer)f
+Fp(\(the)g(t)o(yp)q(e)h(of)g(arbitrary)f(precision)j(in)o(tegers\))e(is)g(in)
+o(tended)h(to)f(con)o(v)o(ey)g(an)f Fo(in\014nite)0 550 y Fp(en)o(umeration.)
+71 671 y(T)l(uples)j(are)f(also)g(easy)g(to)g(de\014ne)h(pla)o(ying)g(this)g
+(game:)71 780 y Fi(data)23 b(\(a,b\))333 b(=)24 b(\(a,b\))596
+b(--)24 b(more)f(pseudo-code)71 836 y(data)g(\(a,b,c\))285
+b(=)24 b(\(a,b,c\))71 893 y(data)f(\(a,b,c,d\))237 b(=)24 b(\(a,b,c,d\))94
+949 y(.)597 b(.)94 1006 y(.)g(.)94 1062 y(.)g(.)0 1171 y Fp(Eac)o(h)12
+b(declaration)h(ab)q(o)o(v)o(e)e(de\014nes)j(a)d(tuple)i(t)o(yp)q(e)g(of)e(a)
+h(particular)h(length,)g(with)f Fi(\(...\))g Fp(pla)o(ying)h(a)e(role)i(in)g
+(b)q(oth)0 1228 y(the)g(expresssion)g(syn)o(tax)f(\(as)f(data)h
+(constructor\))g(and)g(t)o(yp)q(e-expression)i(syn)o(tax)e(\(as)f(t)o(yp)q(e)
+i(constructor\).)18 b(The)0 1284 y(v)o(ertical)11 b(dots)f(after)g(the)g
+(last)h(declaration)g(are)f(in)o(tended)i(to)e(con)o(v)o(ey)g(an)h
+(in\014nite)h(n)o(um)o(b)q(er)f(of)f(suc)o(h)h(declarations,)0
+1341 y(re\015ecting)16 b(the)f(fact)g(that)g(tuples)h(of)e(all)j(lengths)e
+(are)g(allo)o(w)o(ed)h(in)g(Hask)o(ell.)71 1461 y(Lists)f(are)g(also)g
+(easily)i(handled,)f(and)f(more)g(in)o(terestingly)l(,)h(they)g(are)f
+(recursiv)o(e:)94 1570 y Fi(data)24 b([a])357 b(=)24 b([])g(|)f(a)h(:)g([a])
+429 b(--)24 b(more)f(pseudo-code)0 1679 y Fp(W)l(e)13 b(can)g(no)o(w)g(see)g
+(clearly)i(what)d(w)o(e)h(describ)q(ed)i(ab)q(out)e(lists)h(earlier:)20
+b Fi([])12 b Fp(is)i(the)f(empt)o(y)g(list,)h(and)f Fi(:)g
+Fp(is)h(the)f(in\014x)0 1736 y(list)20 b(constructor;)f(th)o(us)g
+Fi([1,2,3])f Fp(m)o(ust)g(b)q(e)i(equiv)m(alen)o(t)g(to)e(the)h(list)h
+Fi(1:2:3:[])o Fp(.)31 b(\()p Fi(:)18 b Fp(is)i(righ)o(t)e(asso)q(ciativ)o
+(e.\))0 1792 y(The)d(t)o(yp)q(e)h(of)e Fi([])h Fp(is)h Fi([a])p
+Fp(,)e(and)i(the)f(t)o(yp)q(e)g(of)g Fi(:)g Fp(is)h Fi(a->[a]->[a])n
+Fp(.)71 1913 y([The)i(w)o(a)o(y)f Fi(:)h Fp(is)h(de\014ned)h(here)f(is)g
+(actually)g(legal)g(syn)o(tax|in\014x)h(constructors)d(are)h(p)q(ermitted)h
+(in)h Fi(data)0 1969 y Fp(declarations,)13 b(and)f(are)g(distinguished)j
+(from)c(in\014x)j(op)q(erators)d(\(for)g(pattern-matc)o(hing)h(purp)q(oses\))
+g(b)o(y)g(the)h(fact)0 2026 y(that)h(they)i(m)o(ust)e(b)q(egin)j(with)e(a)g
+Fi(:)g Fp(\(a)g(prop)q(ert)o(y)g(trivially)i(satis\014ed)e(b)o(y)g
+Fi(:)p Fp(\).])71 2146 y(A)o(t)i(this)i(p)q(oin)o(t)f(the)g(reader)g(should)h
+(note)f(carefully)h(the)f(di\013erences)i(b)q(et)o(w)o(een)e(tuples)h(and)f
+(lists,)h(whic)o(h)0 2203 y(the)g(ab)q(o)o(v)o(e)f(de\014nitions)i(mak)o(e)e
+(abundan)o(tly)h(clear.)31 b(In)19 b(particular,)h(note)e(the)h(recursiv)o(e)
+g(nature)f(of)h(the)f(list)0 2259 y(t)o(yp)q(e)f(whose)g(elemen)o(ts)h(are)e
+(homogeneous)h(and)g(of)g(arbitrary)f(length,)i(and)f(the)g(non-recursiv)o(e)
+h(nature)f(of)f(a)0 2316 y(\(particular\))g(tuple)h(t)o(yp)q(e)f(whose)g
+(elemen)o(ts)h(are)e(heterogenous)h(and)g(of)g(\014xed)g(length.)23
+b(The)17 b(t)o(yping)f(rules)h(for)0 2372 y(tuples)f(and)f(lists)h(should)h
+(no)o(w)d(also)h(b)q(e)h(clear:)71 2493 y(F)l(or)e Fi(\()p
+Fh(e)197 2500 y Fm(1)216 2493 y Fi(,)p Fh(e)261 2500 y Fm(2)281
+2493 y Fi(,)8 b Fh(:)g(:)g(:)d Fi(,)p Fh(e)418 2500 y Fd(n)442
+2493 y Fi(\))p Fh(;)22 b(n)13 b Fn(\025)g Fp(2,)h(if)h Fh(t)696
+2500 y Fd(i)725 2493 y Fp(is)h(the)e(t)o(yp)q(e)h(of)g Fh(e)1023
+2500 y Fd(i)1037 2493 y Fp(,)f(then)i(the)e(t)o(yp)q(e)h(of)g(the)g(tuple)g
+(is)h Fi(\()p Fh(t)1678 2500 y Fm(1)1698 2493 y Fi(,)p Fh(t)1738
+2500 y Fm(2)1758 2493 y Fi(,)7 b Fh(:)h(:)g(:)e Fi(,)p Fh(t)1890
+2500 y Fd(n)1914 2493 y Fi(\))o Fp(.)71 2614 y(F)l(or)14 b
+Fi([)p Fh(e)197 2621 y Fm(1)217 2614 y Fi(,)p Fh(e)262 2621
+y Fm(2)282 2614 y Fi(,)7 b Fh(:)h(:)g(:)e Fi(,)p Fh(e)419 2621
+y Fd(n)442 2614 y Fi(])p Fh(;)22 b(n)13 b Fn(\025)g Fp(0,)i(eac)o(h)g
+Fh(e)763 2621 y Fd(i)792 2614 y Fp(m)o(ust)g(ha)o(v)o(e)g(the)g(same)g(t)o
+(yp)q(e)g Fh(t)p Fp(,)h(and)f(the)g(t)o(yp)q(e)g(of)g(the)h(list)g(is)f
+Fi([)p Fh(t)p Fi(])p Fp(.)p eop
+%%Page: 9 9
+bop 0 -40 a Fj(2.5)45 b(Built-in)17 b(T)o(yp)q(es)e(Are)h(Not)e(Sp)q(ecial)
+1157 b Fp(T-9)0 105 y Fc(2.5.1)52 b(List)18 b(Comprehensions)e(and)i
+(Arithmetic)g(Sequences)0 211 y Fp(As)13 b(with)g(Lisp)h(dialects,)h(lists)e
+(are)g(p)q(erv)m(asiv)o(e)h(in)g(Hask)o(ell,)g(and)f(as)f(with)i(other)e
+(functional)i(languages,)f(there)g(is)0 268 y(y)o(et)e(more)g(syn)o(tactic)h
+(sugar)f(to)f(aid)j(in)f(their)g(creation.)19 b(Aside)12 b(from)f(the)h
+(constructors)e(for)h(lists)i(just)e(discussed,)0 324 y(Hask)o(ell)16
+b(pro)o(vides)g(an)f(expression)h(kno)o(wn)f(as)g(a)g Fo(list)g(c)n(ompr)n
+(ehension)f Fp(that)h(is)g(b)q(est)h(explained)h(b)o(y)e(example:)71
+433 y Fi([)23 b(f)h(x)g(|)f(x)h(<-)g(xs)f(])0 542 y Fp(This)17
+b(expression)f(can)h(in)o(tuitiv)o(ely)h(b)q(e)e(read)g(as)g(\\the)g(list)g
+(of)g(all)h Fi(f)24 b(x)15 b Fp(suc)o(h)i(that)e Fi(x)h Fp(is)g(dra)o(wn)g
+(from)f Fi(xs)p Fp(.")22 b(The)0 599 y(similarit)o(y)d(to)f(set)g(notation)f
+(is)i(not)e(a)h(coincidence.)31 b(The)19 b(phrase)f Fi(x<-xs)f
+Fp(is)i(called)g(a)f Fo(gener)n(ator)p Fp(,)g(of)g(whic)o(h)0
+655 y(more)d(than)g(one)g(is)h(allo)o(w)o(ed,)f(as)g(in:)71
+764 y Fi([)23 b(\(x,y\))g(|)h(x<-xs,)f(y<-ys)g(])0 873 y Fp(This)17
+b(list)f(comprehension)i(forms)d(the)h(cartesian)g(pro)q(duct)g(of)g(the)g(t)
+o(w)o(o)e(lists)j Fi(xs)f Fp(and)g Fi(ys)o Fp(.)22 b(The)17
+b(elemen)o(ts)f(are)0 930 y(selected)f(as)f(if)h(the)f(generators)g(w)o(ere)g
+(\\nested")g(from)f(left)i(to)e(righ)o(t)h(\(with)h(the)f(righ)o(tmost)f
+(generator)g(v)m(arying)0 986 y(fastest\);)g(th)o(us,)i(if)h
+Fi(xs)f Fp(is)g Fi([1,2])g Fp(and)g Fi(ys)g Fp(is)h Fi([3,4])o
+Fp(,)f(the)g(result)h(is)g Fi([\(1,3\),\(1,4\),\(2,3\),\(2,4)o(\)])m
+Fp(.)71 1063 y(Besides)h(generators,)e(b)q(o)q(olean)i(expressions)g(called)g
+Fo(guar)n(ds)g Fp(are)e(p)q(ermitted.)24 b(Guards)15 b(place)i(constrain)o
+(ts)0 1119 y(on)d(the)g(elemen)o(ts)h(generated.)k(F)l(or)13
+b(example,)i(here)f(is)h(a)f(concise)h(de\014nition)h(of)d(ev)o(eryb)q(o)q
+(dy's)h(fa)o(v)o(orite)f(sorting)0 1176 y(algorithm:)71 1285
+y Fi(quicksort)46 b([])262 b(=)48 b([])71 1341 y(quicksort)22
+b(\(x:xs\))190 b(=)48 b(quicksort)23 b([y)g(|)h(y)g(<-)f(xs,)h(y<x)f(])643
+1398 y(++)h([x])643 1454 y(++)g(quicksort)f([y)g(|)h(y)g(<-)f(xs,)h(y>=x])71
+1609 y Fp(T)l(o)16 b(further)h(supp)q(ort)g(the)g(use)g(of)g(lists,)h(Hask)o
+(ell)f(has)g(sp)q(ecial)i(syn)o(tax)d(for)h Fo(arithmetic)h(se)n(quenc)n(es)p
+Fp(,)d(whic)o(h)0 1665 y(are)g(b)q(est)g(explained)j(b)o(y)d(a)g(series)g(of)
+g(examples:)360 1750 y Fi([1..10])133 b Fn(\))88 b Fi([1,2,3,4,5,6,7,8,9,10])
+360 1806 y([1,3..10])d Fn(\))j Fi([1,3,5,7,9])360 1862 y([1,3..])133
+b Fn(\))88 b Fi([1,3,5,7,9,)22 b(...)76 b Fp(\(in\014nite)16
+b(sequence\))0 1947 y(More)f(will)h(b)q(e)g(said)g(ab)q(out)f(arithmetic)h
+(sequences)g(in)g(Section)g(5.2,)e(and)i(\\in\014nite)g(lists")g(in)g
+(Section)g(3.4.)0 2085 y Fc(2.5.2)52 b(Strings)0 2192 y Fp(As)15
+b(another)f(example)h(of)f(syn)o(tactic)h(sugar)f(for)g(built-in)j(t)o(yp)q
+(es,)d(w)o(e)h(note)f(that)g(the)g(literal)i(string)f Fi("hello")e
+Fp(is)0 2248 y(actually)h(shorthand)f(for)f(the)h(list)h(of)f(c)o(haracters)f
+Fi(['h','e','l','l','o'])m Fp(.)19 b(Indeed,)c(the)e(t)o(yp)q(e)g(of)g
+Fi("hello")0 2305 y Fp(is)j Fi(String)o Fp(,)f(where)g Fi(String)f
+Fp(is)i(a)f(prede\014ned)i(t)o(yp)q(e)e(synon)o(ym)g(\(that)f(w)o(e)h(ga)o(v)
+o(e)f(as)h(an)g(earlier)h(example\):)71 2416 y Fi(type)23 b(String)309
+b(=)24 b([Char])0 2525 y Fp(This)16 b(means)f(w)o(e)g(can)g(use)h
+(prede\014ned)h(p)q(olymorphic)f(list)g(functions)g(to)f(op)q(erate)g(on)g
+(strings.)20 b(F)l(or)14 b(example:)497 2614 y Fi("hello")23
+b(++)h(")f(world")73 b Fn(\))h Fi("hello)23 b(world")p eop
+%%Page: 10 10
+bop 0 -40 a Fp(T-10)1513 b Fj(3)45 b(FUNCTIONS)0 105 y Fq(3)69
+b(F)-6 b(unctions)0 266 y Fp(Since)15 b(Hask)o(ell)g(is)f(a)f(functional)i
+(language,)f(one)f(w)o(ould)h(exp)q(ect)h(functions)f(to)f(pla)o(y)h(a)f(ma)s
+(jor)g(role,)g(and)h(indeed)0 323 y(they)h(do.)20 b(In)c(this)g(section,)f(w)
+o(e)g(lo)q(ok)g(at)g(sev)o(eral)g(asp)q(ects)h(of)e(functions)i(in)g(Hask)o
+(ell.)71 428 y(First,)e(consider)i(this)g(de\014nition)h(of)e(a)g(function)h
+(whic)o(h)g(adds)f(its)g(t)o(w)o(o)f(argumen)o(ts:)71 537 y
+Fi(add)500 b(::)24 b(Int)f(->)h(Int)f(->)h(Int)71 593 y(add)f(x)h(y)405
+b(=)24 b(x)g(+)f(y)0 709 y Fp(This)18 b(is)g(an)f(example)i(of)e(a)g
+Fo(currie)n(d)h Fp(function.)826 692 y Fm(6)873 709 y Fp(An)g(application)h
+(of)e Fi(add)g Fp(has)g(the)h(form)f Fi(add)23 b Fh(e)1720
+716 y Fm(1)1757 709 y Fh(e)1778 716 y Fm(2)1798 709 y Fp(,)18
+b(and)f(is)0 765 y(equiv)m(alen)o(t)c(to)d Fi(\(add)24 b Fh(e)404
+772 y Fm(1)423 765 y Fi(\))g Fh(e)492 772 y Fm(2)512 765 y
+Fp(,)12 b(since)g(function)g(application)h(asso)q(ciates)e(to)f(the)h
+Fo(left)p Fp(.)18 b(In)12 b(other)f(w)o(ords,)g(applying)0
+822 y Fi(add)k Fp(to)g(one)h(argumen)o(t)f(yields)i(a)f(new)g(function)g
+(whic)o(h)h(is)f(then)g(applied)i(to)d(the)g(second)i(argumen)o(t.)j(This)c
+(is)0 878 y(consisten)o(t)g(with)h(the)f(t)o(yp)q(e)g(of)f
+Fi(add)p Fp(,)h Fi(Int->Int->Int)n Fp(,)g(whic)o(h)h(is)f(equiv)m(alen)o(t)i
+(to)d Fi(Int->\(Int->Int\))n Fp(;)h(i.e.)g Fi(->)0 934 y Fp(asso)q(ciates)f
+(to)f(the)h Fo(right)p Fp(.)21 b(Indeed,)16 b(using)g Fi(add)o
+Fp(,)f(w)o(e)g(can)g(de\014ne)h Fi(succ)e Fp(in)i(a)f(di\013eren)o(t)g(w)o(a)
+o(y)f(from)h(what)f(w)o(e)h(did)0 991 y(earlier:)71 1091 y
+Fi(succ)476 b(=)24 b(add)f(1)0 1200 y Fp(This)16 b(is)h(an)f(example)g(of)g
+(the)g Fo(p)n(artial)h(applic)n(ation)f Fp(of)f(a)h(curried)h(function,)f
+(and)g(is)h(one)f(w)o(a)o(y)e(that)i(a)f(function)0 1257 y(can)20
+b(b)q(e)h(returned)g(as)f(a)f(v)m(alue.)36 b(Let's)20 b(consider)i(a)d(case)i
+(in)g(whic)o(h)g(it's)f(useful)h(to)e(pass)h(a)g(function)h(as)f(an)0
+1313 y(argumen)o(t.)f(The)d(w)o(ell-kno)o(wn)g Fi(map)e Fp(function)i(is)g(a)
+f(p)q(erfect)h(example:)71 1423 y Fi(map)500 b(::)24 b(\(a->b\))f(->)h([a])f
+(->)h([b])71 1480 y(map)f(f)48 b([])357 b(=)24 b([])71 1536
+y(map)f(f)h(\(x:xs\))285 b(=)24 b(f)g(x)f(:)h(map)g(f)f(xs)0
+1648 y Fp([F)l(unction)16 b(application)h(has)f(higher)g(precedence)i(than)d
+(an)o(y)h(in\014x)g(op)q(erator,)f(and)h(th)o(us)f(the)h(righ)o(t-hand)g
+(side)0 1704 y(of)h(the)h(second)g(equation)f(parses)h(as)f
+Fi(\(f)23 b(x\))h(:)g(\(map)f(f)h(xs\))o Fp(.])52 b Fi(map)17
+b Fp(is)h(a)f(p)q(olymorphic)i(function,)f(and)g(its)0 1761
+y(t)o(yp)q(e)j(indicates)h(clearly)g(that)e(its)g(\014rst)h(argumen)o(t)f(is)
+h(a)f(function;)k(note)c(also)h(that)f(the)h(t)o(w)o(o)e Fi(a)p
+Fp('s)h(m)o(ust)g(b)q(e)0 1817 y(instan)o(tiated)e(with)h(the)f(same)g(t)o
+(yp)q(e)g(\(lik)o(ewise)i(for)d(the)i Fi(b)p Fp('s\).)27 b(As)19
+b(an)f(example)h(of)e(the)i(use)f(of)g Fi(map)o Fp(,)h(w)o(e)f(can)0
+1874 y(incremen)o(t)e(the)f(elemen)o(ts)h(in)g(a)f(list:)569
+2011 y Fi(map)23 b(\(add)h(1\))f([1,2,3])72 b Fn(\))i Fi([2,3,4])71
+2197 y Fp(These)18 b(examples)h(demonstrate)e(the)h(\014rst-class)g(nature)g
+(of)g(functions,)h(whic)o(h)g(when)f(used)h(in)g(this)f(w)o(a)o(y)0
+2254 y(are)d(usually)h(called)h Fo(higher-or)n(der)f Fp(functions.)p
+0 2341 780 2 v 52 2368 a Fl(6)69 2383 y Fk(The)i(name)h Fe(curry)e
+Fk(deriv)o(es)i(from)f(the)h(p)q(erson)g(who)f(p)q(opularized)j(the)e(idea:)
+28 b(Hask)o(ell)20 b(Curry)m(.)32 b(T)m(o)18 b(get)g(the)g(e\013ect)h(of)e
+(an)0 2429 y Fe(uncurrie)n(d)11 b Fk(function,)j(w)o(e)e(could)j(use)e(a)g
+Fe(tuple)p Fk(,)e(as)i(in:)71 2518 y Ff(add)18 b(\(x,y\))292
+b(=)20 b(x)f(+)g(y)0 2614 y Fk(But)13 b(then)h(w)o(e)e(see)h(that)h(this)f(v)
+o(ersion)i(of)e Ff(add)e Fk(is)j(really)h(just)e(a)g(function)h(of)f(one)g
+(argumen)o(t!)p eop
+%%Page: 11 11
+bop 0 -40 a Fj(3.1)45 b(Lam)o(b)q(da)15 b(Abstractions)1324
+b Fp(T-11)0 105 y Fg(3.1)56 b(Lam)n(b)r(da)17 b(Abstractions)0
+215 y Fp(Instead)c(of)f(using)i(equations)e(to)g(de\014ne)i(functions,)g(w)o
+(e)e(can)h(also)f(de\014ne)i(them)f(\\anon)o(ymously")f(via)h(a)f
+Fo(lamb)n(da)0 271 y(abstr)n(action)p Fp(.)19 b(F)l(or)c(example,)g(a)g
+(function)h(equiv)m(alen)o(t)g(to)f Fi(succ)f Fp(could)i(b)q(e)g(written)f
+(as)f Fi(\\x)24 b(->)g(x+1)o Fp(.)c(Similarly)l(,)0 328 y(the)15
+b(function)h Fi(add)f Fp(is)h(equiv)m(alen)o(t)h(to)e Fi(\\x)23
+b(->)h(\\y)f(->)h(x+y)p Fp(.)c(Nested)15 b(lam)o(b)q(da)h(abstractions)f(suc)
+o(h)g(as)g(this)h(ma)o(y)0 384 y(b)q(e)g(written)f(using)h(the)f(equiv)m
+(alen)o(t)i(shorthand)e(notation)g Fi(\\x)24 b(y)f(->)h(x+y)p
+Fp(.)19 b(In)d(fact,)e(the)i(equations:)71 494 y Fi(succ)23
+b(x)429 b(=)24 b(x+1)71 551 y(add)47 b(x)24 b(y)381 b(=)24
+b(x+y)0 660 y Fp(are)15 b(really)h(shorthand)f(for:)71 769
+y Fi(succ)476 b(=)24 b(\\x)71 b(->)24 b(x+1)71 825 y(add)500
+b(=)24 b(\\x)g(y)f(->)h(x+y)0 934 y Fp(W)l(e)15 b(will)i(ha)o(v)o(e)e(more)g
+(to)f(sa)o(y)h(ab)q(out)g(suc)o(h)g(equiv)m(alences)j(later.)71
+1015 y(In)d(general,)h(giv)o(en)f(that)g Fi(x)g Fp(has)g(t)o(yp)q(e)g
+Fh(t)752 1022 y Fm(1)788 1015 y Fp(and)g Fi(exp)g Fp(has)g(t)o(yp)q(e)g
+Fh(t)1162 1022 y Fm(2)1182 1015 y Fp(,)g(then)g Fi(\\x->exp)g
+Fp(has)g(t)o(yp)q(e)g Fh(t)1695 1022 y Fm(1)1715 1015 y Fi(->)p
+Fh(t)1779 1022 y Fm(2)1799 1015 y Fp(.)0 1160 y Fg(3.2)56 b(In\014x)18
+b(Op)r(erators)0 1270 y Fp(In\014x)c(op)q(erators)d(are)i(really)h(just)e
+(functions,)i(and)f(can)g(also)f(b)q(e)i(de\014ned)g(using)f(equations.)20
+b(F)l(or)12 b(example,)i(here)0 1326 y(is)i(the)f(de\014nition)i(of)e(Hask)o
+(ell's)g(list)h(concatenation)g(op)q(erator:)71 1435 y Fi(\(++\))476
+b(::)24 b([a])f(->)h([a])f(->)h([a])71 1491 y([])119 b(++)23
+b(ys)286 b(=)48 b(ys)71 1548 y(\(x:xs\))23 b(++)g(ys)286 b(=)48
+b(x)24 b(:)f(\(xs++ys\))0 1660 y Fp([Lexically)l(,)17 b(in\014x)f(op)q
+(erators)d(consist)i(en)o(tirely)h(of)f(\\sym)o(b)q(ols,")f(as)g(opp)q(osed)i
+(to)e(normal)g(iden)o(ti\014ers)j(whic)o(h)e(are)0 1716 y(alphan)o(umeric)20
+b(\()p Fn(x)p Fp(2.3\).)30 b(Hask)o(ell)20 b(has)e(no)h(pre\014x)h(op)q
+(erators,)e(with)h(the)g(exception)h(of)f(min)o(us)g(\()p Fi(-)p
+Fp(\),)g(whic)o(h)g(is)0 1772 y(b)q(oth)c(in\014x)i(and)e(pre\014x.])71
+1853 y(As)f(another)h(example,)g(an)f(imp)q(ortan)o(t)h(in\014x)g(op)q
+(erator)f(on)h(functions)g(is)g(that)f(for)g Fo(function)i(c)n(omp)n(osition)
+p Fp(:)71 1962 y Fi(\(.\))500 b(::)24 b(\(b->c\))f(->)h(\(a->b\))f(->)g
+(\(a->c\))71 2018 y(f)g(.)h(g)453 b(=)24 b(\\)g(x)f(->)h(f)g(\(g)f(x\))0
+2239 y Fc(3.2.1)52 b(Sections)0 2349 y Fp(Since)16 b(in\014x)g(op)q(erators)e
+(are)h(really)h(just)f(functions,)g(it)g(mak)o(es)f(sense)i(to)e(b)q(e)i
+(able)f(to)g(partially)h(apply)f(them)g(as)0 2405 y(w)o(ell.)21
+b(In)16 b(Hask)o(ell)g(the)f(partial)h(application)g(of)f(an)g(in\014x)i(op)q
+(erator)d(is)i(called)g(a)f Fo(se)n(ction)p Fp(.)k(F)l(or)c(example:)676
+2500 y Fi(\(x+\))102 b Fn(\021)126 b Fi(\\y)24 b(->)f(x+y)676
+2557 y(\(+y\))102 b Fn(\021)126 b Fi(\\x)24 b(->)f(x+y)688
+2613 y(\(+\))114 b Fn(\021)102 b Fi(\\x)24 b(y)g(->)f(x+y)p
+eop
+%%Page: 12 12
+bop 0 -40 a Fp(T-12)1513 b Fj(3)45 b(FUNCTIONS)0 105 y Fp([The)15
+b(paren)o(theses)g(are)g(mandatory)l(.])71 199 y(The)20 b(last)f(form)g(of)g
+(section)i(giv)o(en)f(ab)q(o)o(v)o(e)f(essen)o(tially)i(co)q(erces)g(an)e
+(in\014x)i(op)q(erator)e(in)o(to)h(an)f(equiv)m(alen)o(t)0
+255 y(functional)h(v)m(alue,)h(and)e(is)g(handy)g(when)h(passing)f(an)g
+(in\014x)h(op)q(erator)e(as)g(an)h(argumen)o(t)f(to)h(a)f(function,)i(as)0
+312 y(in)i Fi(map)h(\(+\))g([1,2,3])d Fp(\(the)h(reader)f(should)i(v)o(erify)
+f(that)f(this)h(returns)f(a)h(list)g(of)g(functions!\).)36
+b(It)21 b(is)g(also)0 368 y(necessary)15 b(when)g(giving)g(a)g(function)g(t)o
+(yp)q(e)g(signature,)f(as)h(in)g(the)g(examples)g(of)f Fi(\(++\))g
+Fp(and)h Fi(\(.\))f Fp(giv)o(en)h(earlier.)71 462 y(W)l(e)20
+b(can)h(no)o(w)g(see)g(that)f Fi(add)g Fp(de\014ned)i(earlier)g(is)f(just)g
+Fi(\(+\))p Fp(,)g(and)g Fi(succ)f Fp(is)i(just)e Fi(\(+1\))p
+Fp(!)36 b(Indeed,)24 b(these)0 518 y(de\014nitions)17 b(w)o(ould)f(do)f(just)
+g(\014ne:)71 627 y Fi(succ)476 b(=)24 b(\(+1\))71 684 y(add)500
+b(=)24 b(\(+\))71 855 y Fp(W)l(e)14 b(can)g(co)q(erce)h(an)f(in\014x)h(op)q
+(erator)e(in)o(to)h(a)g(functional)h(v)m(alue,)g(but)g(can)f(w)o(e)g(go)f
+(the)h(other)g(w)o(a)o(y?)19 b(Y)l(es|w)o(e)0 912 y(simply)g(enclose)g(an)f
+(iden)o(ti\014er)h(b)q(ound)g(to)e(a)h(functional)h(v)m(alue)g(in)g(bac)o
+(kquotes.)27 b(F)l(or)17 b(example,)i Fi(x)24 b(`add`)f(y)0
+968 y Fp(is)17 b(the)g(same)g(as)f Fi(add)23 b(x)h(y)p Fp(.)480
+952 y Fm(7)524 968 y Fp(Some)17 b(functions)h(read)e(b)q(etter)h(this)g(w)o
+(a)o(y)l(.)24 b(An)17 b(example)h(is)f(the)g(prede\014ned)h(list)0
+1025 y(mem)o(b)q(ership)13 b(predicate)g Fi(elem)p Fp(;)f(the)g(expression)h
+Fi(x)24 b(`elem`)f(xs)12 b Fp(can)g(b)q(e)h(read)f(in)o(tuitiv)o(ely)i(as)d
+(\\)p Fi(x)h Fp(is)g(an)g(elemen)o(t)0 1081 y(of)j Fi(xs)o
+Fp(.")71 1175 y([There)c(are)g(some)g(sp)q(ecial)i(rules)f(regarding)g
+(sections)g(in)o(v)o(olving)g(the)g(pre\014x/in\014x)g(op)q(erator)f
+Fi(-)g Fp(\()p Fn(x)p Fp(3.4,)p Fn(x)o Fp(3.3\).])71 1269 y(A)o(t)16
+b(this)i(p)q(oin)o(t,)g(the)f(reader)g(ma)o(y)g(b)q(e)h(confused)g(at)e(ha)o
+(ving)i(so)f(man)o(y)g(w)o(a)o(ys)f(to)g(de\014ne)j(a)e(function!)27
+b(The)0 1325 y(decision)18 b(to)d(pro)o(vide)h(these)g(mec)o(hanisms)g
+(partly)g(re\015ects)g(historical)h(con)o(v)o(en)o(tions,)e(and)h(partly)g
+(re\015ects)g(the)0 1382 y(desire)g(for)f(consistency)h(\(for)e(example,)i
+(in)g(the)f(treatmen)o(t)f(of)h(in\014x)h(vs.)k(regular)15
+b(functions\).)0 1568 y Fc(3.2.2)52 b(Fixit)o(y)17 b(Declarations)0
+1697 y Fp(A)f Fo(\014xity)g(de)n(clar)n(ation)f Fp(can)h(b)q(e)h(giv)o(en)f
+(for)f(an)o(y)g(in\014x)i(op)q(erator)e(or)g(constructor)g(\(including)j
+(those)e(made)g(from)0 1754 y(ordinary)j(iden)o(ti\014ers,)j(suc)o(h)d(as)g
+Fi(`elem`)o Fp(\).)754 1737 y Fm(8)805 1754 y Fp(This)h(declaration)g(sp)q
+(eci\014es)g(a)f(precedence)i(lev)o(el)g(from)d(0)h(to)f(9)0
+1810 y(\(with)e(9)g(b)q(eing)i(the)e(strongest;)f(normal)i(application)h(is)e
+(assumed)h(to)e(ha)o(v)o(e)h(a)g(precedence)i(lev)o(el)g(of)e(10\),)f(and)0
+1867 y(left-,)g(righ)o(t-,)g(or)g(non-asso)q(ciativit)o(y)l(.)21
+b(F)l(or)14 b(example,)i(the)f(\014xit)o(y)h(declarations)f(for)g
+Fi(++)g Fp(and)g Fi(.)g Fp(are:)71 1976 y Fi(infixr)23 b(5)g(++)71
+2032 y(infixr)g(9)g(.)0 2141 y Fp(Both)18 b(of)g(these)g(sp)q(ecify)i(righ)o
+(t-asso)q(ciativit)o(y)l(,)f(the)g(\014rst)e(with)i(a)f(precedence)i(lev)o
+(el)g(of)d(5,)i(the)f(other)g(9.)29 b(Left)0 2198 y(asso)q(ciativit)o(y)15
+b(is)h(sp)q(eci\014ed)g(via)g Fi(infixl)o Fp(,)e(and)h(non-asso)q(ciativit)o
+(y)h(b)o(y)f Fi(infix)o Fp(.)20 b(Also,)14 b(the)h(\014xit)o(y)g(of)g(more)f
+(than)0 2254 y(one)h(op)q(erator)f(ma)o(y)g(b)q(e)h(sp)q(eci\014ed)i(with)f
+(the)e(same)h(\014xit)o(y)g(declaration.)21 b(If)15 b(no)f(\014xit)o(y)h
+(declaration)h(is)f(giv)o(en)h(for)0 2310 y(a)c(particular)h(op)q(erator,)f
+(it)h(defaults)g(to)f Fi(infixl)23 b(9)p Fp(.)c(\(See)13 b
+Fn(x)p Fp(5.7)e(for)h(a)g(detailed)i(de\014nition)h(of)d(the)h(asso)q
+(ciativit)o(y)0 2367 y(rules.\))p 0 2434 780 2 v 52 2461 a
+Fl(7)69 2477 y Fk(Note)g(carefully)i(that)e Ff(add)f Fk(is)i(enclosed)h(in)e
+Fe(b)n(ackquotes)p Fk(,)c(not)14 b Fe(ap)n(ostr)n(ophes)9 b
+Fk(as)14 b(used)f(in)h(the)g(syn)o(tax)g(of)e(c)o(haracters;)i(i.e.)j
+Ff('f')12 b Fk(is)0 2522 y(a)g(c)o(haracter,)h(whereas)g Ff(`f`)e
+Fk(is)i(an)f(in\014x)i(op)q(erator.)k(F)m(ortunately)m(,)13
+b(most)f(ASCI)q(I)g(terminals)i(distingui)q(sh)h(these)e(m)o(uc)o(h)g(b)q
+(etter)f(than)0 2568 y(the)h(t)o(yp)q(efon)o(t)h(used)f(in)h(this)g(man)o
+(uscript.)52 2598 y Fl(8)69 2614 y Fk(Fixit)o(y)f(declarations)i(m)o(ust)c
+(only)i(app)q(ear)g(at)e(the)h(v)o(ery)g(b)q(eginning)j(of)c(a)g(Hask)o(ell)j
+Fe(mo)n(dule)p Fk(,)c(as)h(will)i(b)q(e)f(describ)q(ed)i(in)e(Section)h(6.)p
+eop
+%%Page: 13 13
+bop 0 -40 a Fj(3.3)45 b(F)l(unctions)15 b(are)g(Non-strict)1269
+b Fp(T-13)0 105 y Fg(3.3)56 b(F)-5 b(unctions)19 b(are)f(Non-strict)0
+215 y Fp(Supp)q(ose)e Fi(bot)f Fp(is)h(de\014ned)g(b)o(y:)71
+324 y Fi(bot)500 b(=)24 b(bot)0 433 y Fp(In)c(other)e(w)o(ords,)h
+Fi(bot)g Fp(is)h(a)e(non-terminating)i(expression.)33 b(Abstractly)l(,)20
+b(w)o(e)e(denote)i(the)f Fo(value)g Fp(of)g(a)g(non-)0 489
+y(terminating)d(expression)h(as)f Fn(?)g Fp(\(read)g(\\b)q(ottom"\).)21
+b(Expressions)16 b(that)g(result)g(in)h(some)f(kind)h(of)e(a)h(run-time)0
+546 y(error,)e(suc)o(h)i(as)e Fi(1/0)p Fp(,)h(also)g(ha)o(v)o(e)g(this)g(v)m
+(alue.)71 626 y(A)f(function)i Fi(f)e Fp(is)h(said)g(to)f(b)q(e)i
+Fo(strict)e Fp(if,)h(when)g(applied)h(to)e(a)h(non)o(terminating)g
+(expression,)g(it)g(also)f(fails)i(to)0 682 y(terminate.)j(In)14
+b(other)g(w)o(ords,)e Fi(f)i Fp(is)g(strict)f(i\013)h(the)f(v)m(alue)i(of)e
+Fi(f)24 b(bot)13 b Fp(is)h Fn(?)p Fp(.)20 b(F)l(or)13 b(most)f(programming)h
+(languages,)0 739 y Fo(al)r(l)k Fp(functions)h(are)e(strict.)25
+b(But)17 b(this)h(is)f(not)g(so)g(in)g(Hask)o(ell.)27 b(As)17
+b(a)f(simple)j(example,)f(consider)g Fi(const1)o Fp(,)f(the)0
+795 y(constan)o(t)d(1)h(function,)h(de\014ned)g(b)o(y:)71 904
+y Fi(const1)23 b(x)381 b(=)24 b(1)0 1013 y Fp(The)18 b(v)m(alue)h(of)f
+Fi(const1)23 b(bot)17 b Fp(in)i(Hask)o(ell)f(is)h Fi(1)p Fp(.)27
+b(Op)q(erationally)20 b(sp)q(eaking,)f(since)g Fi(const1)e
+Fp(do)q(es)h(not)g(\\need")0 1070 y(the)d(v)m(alue)g(of)f(its)h(argumen)o(t,)
+f(it)g(nev)o(er)h(attempts)e(to)h(ev)m(aluate)i(it,)e(and)h(th)o(us)f(nev)o
+(er)h(gets)f(caugh)o(t)g(in)h(a)f(non)o(ter-)0 1126 y(minating)k
+(computation.)26 b(F)l(or)16 b(this)i(reason,)f(non-strict)h(functions)g(are)
+e(also)i(called)g(\\lazy)g(functions,")g(and)0 1183 y(are)d(said)h(to)e(ev)m
+(aluate)i(their)g(argumen)o(ts)e(\\lazily)l(,")i(or)f(\\b)o(y)g(need.")71
+1263 y(Since)e(error)e(and)h(non)o(terminating)h(v)m(alues)g(are)e(seman)o
+(tically)j(the)e(same)f(in)i(Hask)o(ell,)g(the)f(ab)q(o)o(v)o(e)g(argumen)o
+(t)0 1319 y(also)j(holds)h(for)f(errors.)k(F)l(or)14 b(example,)i
+Fi(const1)23 b(\(1/0\))15 b Fp(also)g(ev)m(aluates)h(prop)q(erly)g(to)e
+Fi(1)p Fp(.)71 1400 y(Non-strict)h(functions)i(are)f(extremely)g(useful)h(in)
+g(a)e(v)m(ariet)o(y)h(of)g(con)o(texts.)21 b(The)16 b(main)g(adv)m(an)o(tage)
+f(is)i(that)0 1456 y(they)d(free)f(the)h(programmer)f(from)f(man)o(y)i
+(concerns)g(ab)q(out)f(ev)m(aluation)i(order.)k(Computationally)14
+b(exp)q(ensiv)o(e)0 1513 y(v)m(alues)j(ma)o(y)f(b)q(e)h(passed)g(as)e
+(argumen)o(ts)h(to)g(functions)h(without)f(fear)g(of)g(them)g(b)q(eing)h
+(computed)g(if)g(they)f(are)0 1569 y(not)f(needed.)21 b(An)15
+b(imp)q(ortan)o(t)g(example)h(of)f(this)h(is)f(a)g(p)q(ossibly)i
+Fo(in\014nite)d Fp(data)g(structure.)0 1714 y Fg(3.4)56 b(\\In\014nite")17
+b(Data)i(Structures)0 1824 y Fp(One)13 b(adv)m(an)o(tage)f(of)g(the)g
+(non-strict)h(nature)f(of)g(Hask)o(ell)h(is)g(that)f(data)g(constructors)f
+(are)h(non-strict,)h(to)q(o.)18 b(This)0 1880 y(should)h(not)e(b)q(e)i
+(surprising,)g(since)g(constructors)e(are)g(really)i(just)e(a)h(sp)q(ecial)h
+(kind)g(of)e(function)i(\(the)e(distin-)0 1937 y(guishing)h(feature)e(b)q
+(eing)i(that)e(they)g(can)h(b)q(e)g(used)g(in)g(pattern)f(matc)o(hing\).)24
+b(F)l(or)16 b(example,)h(the)g(constructor)0 1993 y(for)e(lists,)g
+Fi(\(:\))p Fp(,)g(is)g(non-strict.)71 2073 y(Non-strict)g(constructors)f(p)q
+(ermit)h(the)g(de\014nition)i(of)e(\(conceptually\))h Fo(in\014nite)d
+Fp(data)i(structures.)k(Here)c(is)0 2130 y(an)g(in\014nite)i(list)f(of)f
+(ones:)71 2230 y Fi(ones)476 b(=)24 b(1)g(:)f(ones)0 2339 y
+Fp(P)o(erhaps)15 b(more)g(in)o(teresting)h(is)f(the)h(function)g
+Fi(numsFrom)o Fp(:)71 2448 y Fi(numsFrom)22 b(n)334 b(=)24
+b(n)g(:)f(numsFrom)g(\(n+1\))0 2557 y Fp(Th)o(us)10 b Fi(numsFrom)23
+b(n)11 b Fp(is)g(the)f(in\014nite)j(list)e(of)f(successiv)o(e)i(in)o(tegers)e
+(b)q(eginning)j(with)e Fi(n)p Fp(.)18 b(F)l(rom)10 b(it)g(w)o(e)h(can)f
+(construct)0 2614 y(an)15 b(in\014nite)i(list)f(of)f(squares:)p
+eop
+%%Page: 14 14
+bop 0 -40 a Fp(T-14)1513 b Fj(3)45 b(FUNCTIONS)71 160 y Fi(squares)404
+b(=)24 b(map)f(\(^2\))h(\(numsfrom)e(0\))0 271 y Fp(\(Note)15
+b(the)g(use)g(of)g(a)g(section;)g Fi(^)g Fp(is)h(the)f(in\014x)i(exp)q(onen)o
+(tiation)f(op)q(erator.\))71 353 y(Of)c(course,)h(ev)o(en)o(tually)g(w)o(e)f
+(exp)q(ect)i(to)d(extract)h(some)g(\014nite)i(p)q(ortion)e(of)g(the)h(list)g
+(for)f(actual)g(computation,)0 409 y(and)17 b(there)f(are)h(lots)f(of)g
+(prede\014ned)j(functions)e(in)h(Hask)o(ell)f(that)f(do)g(this)i(sort)d(of)h
+(thing:)24 b Fi(take)o Fp(,)17 b Fi(takeWhile)n Fp(,)0 466
+y Fi(filter)o Fp(,)g(and)h(others)f(\(see)g(the)g(p)q(ortion)h(of)e(the)i
+(Standard)f(Prelude)h(called)h Fi(PreludeList)n Fp(\).)26 b(F)l(or)16
+b(example,)0 522 y Fi(take)f Fp(remo)o(v)o(es)f(the)h(\014rst)g
+Fi(n)g Fp(elemen)o(ts)h(from)e(a)h(list:)569 625 y Fi(take)23
+b(5)h(squares)72 b Fn(\))i Fi([0,1,4,9,16])71 753 y Fp(The)14
+b(de\014nition)i(of)d Fi(ones)g Fp(ab)q(o)o(v)o(e)h(is)h(an)e(example)i(of)f
+(a)f Fo(cir)n(cular)j(list)p Fp(.)i(In)d(most)e(circumstances)i(this)f(has)g
+(an)0 809 y(imp)q(ortan)o(t)h(impact)h(on)g(e\016ciency)l(,)h(since)g(an)f
+(implemen)o(tation)h(can)f(b)q(e)h(exp)q(ected)g(to)e(implemen)o(t)i(the)f
+(list)g(as)0 866 y(a)f(true)g(circular)h(structure,)f(th)o(us)g(sa)o(ving)g
+(space.)71 947 y(F)l(or)10 b(another)h(example)i(of)e(the)g(use)h(of)f
+(circularit)o(y)l(,)i(the)f(Fib)q(onacci)h(sequence)f(can)g(b)q(e)g(computed)
+g(e\016cien)o(tly)0 1004 y(as)j(the)g(follo)o(wing)h(in\014nite)h(sequence:)
+71 1113 y Fi(fib)309 b(=)24 b(1)g(:)g(1)f(:)h([)g(a+b)f(|)h(\(a,b\))f(<-)h
+(zip)f(fib)h(\(tail)f(fib\))g(])0 1222 y Fp(where)e Fi(zip)g
+Fp(is)g(a)g(Standard)g(Prelude)h(function)g(that)e(returns)h(the)g(pairwise)h
+(in)o(terlea)o(ving)g(of)e(its)i(t)o(w)o(o)d(list)0 1278 y(argumen)o(ts:)71
+1387 y Fi(zip)k(\(x:xs\))g(\(y:ys\))166 b(=)24 b(\(x,y\))f(:)h(zip)f(xs)h(ys)
+71 1444 y(zip)47 b(xs)119 b(ys)238 b(=)24 b([])0 1553 y Fp(Note)16
+b(ho)o(w)g Fi(fib)o Fp(,)g(an)h(in\014nite)h(list,)f(is)f(de\014ned)i(in)f
+(terms)f(of)g(itself,)h(as)e(if)i(it)g(w)o(ere)f(\\c)o(hasing)g(its)g(tail.")
+24 b(Indeed,)0 1609 y(w)o(e)15 b(can)g(dra)o(w)g(a)g(picture)h(of)f(this)g
+(computation)g(as)g(sho)o(wn)g(in)h(Figure)g(1a.)71 1691 y(F)l(or)e(another)h
+(application)i(of)e(in\014nite)i(lists,)e(see)h(Section)g(4.4.)0
+1839 y Fg(3.5)56 b(The)18 b(Error)g(F)-5 b(unction)0 1950 y
+Fp(Hask)o(ell)20 b(has)f(a)g(built-in)i(function)f(called)h
+Fi(error)d Fp(whose)h(t)o(yp)q(e)g(is)h Fi(String->a)o Fp(.)31
+b(This)20 b(is)f(a)g(somewhat)g(o)q(dd)0 2007 y(function:)k(F)l(rom)15
+b(its)h(t)o(yp)q(e)g(it)h(lo)q(oks)f(as)g(if)h(it)f(is)h(returning)f(a)g(v)m
+(alue)h(of)f(a)g(p)q(olymorphic)i(t)o(yp)q(e)e(ab)q(out)g(whic)o(h)h(it)0
+2063 y(kno)o(ws)e(nothing,)g(since)h(it)g(nev)o(er)f(receiv)o(es)h(a)f(v)m
+(alue)h(of)f(that)g(t)o(yp)q(e)g(as)g(an)g(argumen)o(t!)71
+2145 y(In)h(fact,)f(there)h Fo(is)g Fp(one)g(v)m(alue)h(\\shared")e(b)o(y)h
+(all)h(t)o(yp)q(es:)k Fn(?)p Fp(.)h(Indeed,)c(seman)o(tically)f(that)e(is)h
+(exactly)h(what)0 2201 y(v)m(alue)c(is)g(alw)o(a)o(ys)e(returned)h(b)o(y)g
+Fi(error)f Fp(\(recall)i(that)e(all)i(errors)e(ha)o(v)o(e)h(v)m(alue)h
+Fn(?)p Fp(\).)19 b(Ho)o(w)o(ev)o(er,)11 b(w)o(e)h(can)g(exp)q(ect)h(that)0
+2258 y(a)g(reasonable)g(implemen)o(tation)i(will)g(prin)o(t)e(the)g(string)h
+(argumen)o(t)e(to)g Fi(error)h Fp(for)f(diagnostic)i(purp)q(oses.)20
+b(Th)o(us)0 2314 y(this)e(function)g(is)g(useful)g(when)g(w)o(e)f(wish)h(to)f
+(terminate)g(a)g(program)g(when)h(something)f(has)g(\\gone)g(wrong.")0
+2371 y(F)l(or)e(example,)g(the)h(actual)f(de\014nition)i(of)e
+Fi(head)f Fp(tak)o(en)h(from)f(the)i(Standard)f(Prelude)h(is:)71
+2480 y Fi(head)23 b(\(x:xs\))309 b(=)48 b(x)71 2536 y(head)f([])381
+b(=)48 b(error)23 b("head{PreludeList}:)e(head)j([]")p eop
+%%Page: 15 15
+bop 1857 -40 a Fp(T-15)33 869 y @beginspecial 5.156800 @llx
+435.382507 @lly 327.294495 @urx 781.187195 @ury 1800 @rwi @setspecial
+%%BeginDocument: fib.eps
+/FHIODict 30 dict def
+FHIODict begin
+/bdf{bind def}bind def
+/d{setdash}bdf
+/h{closepath}bdf
+/H{}bdf
+/J{setlinecap}bdf
+/j{setlinejoin}bdf
+/M{setmiterlimit}bdf
+/n{newpath}bdf
+/N{newpath}bdf
+/q{gsave}bdf
+/Q{grestore}bdf
+/w{setlinewidth}bdf
+/u{}bdf
+/U{}bdf
+/sepdef{
+dup where not
+{
+FreeHandSepDict
+}
+if
+3 1 roll exch put
+}bdf
+/`
+{end %. FreeHandDict
+/-save0- save def
+pop pop pop pop pop
+concat
+userdict begin
+/showpage {} def
+0 setgray 0 setlinecap 1 setlinewidth
+0 setlinejoin 10 setmiterlimit [] 0 setdash newpath
+/languagelevel where {pop languagelevel 1 ne{false setstrokeadjust false setoverprint}if}if
+} bdf
+/~
+{end
+-save0- restore
+FreeHandDict begin
+}bdf
+/FreeHandDict 190 dict def
+FreeHandDict begin
+/currentpacking where{pop true setpacking}if
+/xdf{exch def}bdf
+/ndf{1 index where{pop pop pop}{dup xcheck{bind}if def}ifelse}bdf
+/min{2 copy gt{exch}if pop}bdf
+/max{2 copy lt{exch}if pop}bdf
+/isLino statusdict /product get (Lino) anchorsearch{pop pop true}{pop false}ifelse def
+/dr{transform .25 sub round .25 add
+exch .25 sub round .25 add exch itransform}bdf
+/C{dr curveto}bdf
+/L{dr lineto}bdf
+/m{dr moveto}bdf
+/printerRes
+gsave
+matrix defaultmatrix setmatrix
+72 72 dtransform
+abs exch abs
+max
+grestore
+def
+/maxsteps 256 def
+/calcgraysteps {
+currentscreen pop exch
+printerRes exch div exch
+2 copy
+sin mul round dup mul
+3 1 roll
+cos mul round dup mul
+add 1 add
+dup maxsteps gt {pop maxsteps} if
+} bdf
+/bottom -0 def
+/delta -0 def
+/frac -0 def
+/left -0 def
+/numsteps -0 def
+/numsteps1 -0 def
+/radius -0 def
+/right -0 def
+/top -0 def
+/xt -0 def
+/yt -0 def
+/df currentflat def
+/tempstr 1 string def
+/clipflatness currentflat def
+/inverted?
+0 currenttransfer exec .5 ge def
+/colorexists
+systemdict/setcmykcolor known def
+/tc1 [0 0 0 1] def
+/tc2 [0 0 0 1] def
+/fc [0 0 0 1] def
+/sc [0 0 0 1] def
+/concatprocs{
+/proc2 exch cvlit def/proc1 exch cvlit def
+/newproc proc1 length proc2 length add array def
+newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval
+newproc cvx}bdf
+/storerect{/top xdf/right xdf/bottom xdf/left xdf}bdf
+/rectpath{newpath left bottom m left top L
+right top L right bottom L closepath}bdf
+/i{dup 0 eq
+{pop df dup}
+{dup} ifelse
+/clipflatness xdf setflat
+}bdf
+version cvr 38.0 le
+{/setrgbcolor{
+currenttransfer exec 3 1 roll
+currenttransfer exec 3 1 roll
+currenttransfer exec 3 1 roll
+setrgbcolor}bdf}if
+/gettint{0 get}bdf
+/puttint{0 exch put}bdf
+/vms {/vmsv save def} bdf
+/vmr {vmsv restore} bdf
+/vmrs{vmsv restore /vmsv save def}bdf
+/eomode{
+{/filler /eofill load def /clipper /eoclip load def}
+{/filler /fill load def /clipper /clip load def}
+ifelse
+}bdf
+/CD{/NF exch def{exch dup/FID ne 1 index/UniqueID ne and{exch NF 3 1 roll put}
+{pop pop}ifelse}forall NF}bdf
+/MN{1 index length/Len exch def
+dup length Len add string dup
+Len 4 -1 roll putinterval dup 0 4 -1 roll putinterval}bdf
+/RC{4 -1 roll /ourvec xdf 256 string cvs(|______)anchorsearch
+{1 index MN cvn/NewN exch def cvn
+findfont dup maxlength dict CD dup/FontName NewN put dup
+/Encoding ourvec put NewN exch definefont pop}{pop}ifelse}bdf
+/RF{dup FontDirectory exch known{pop 3 -1 roll pop}{RC}ifelse}bdf
+/FF{dup 256 string cvs(|______)exch MN cvn dup FontDirectory exch known
+{exch pop findfont 3 -1 roll pop}{pop dup findfont dup maxlength dict CD dup dup
+/Encoding exch /Encoding get 256 array copy 7 -1 roll {3 -1 roll dup 4 -2 roll put}forall put definefont}ifelse}bdf
+userdict begin /BDFontDict 20 dict def end
+BDFontDict begin
+/bu{}def
+/bn{}def
+/setTxMode{av 70 ge{pop}if pop}def
+/gm{m}def
+/show{pop}def
+/gr{pop}def
+/fnt{pop pop pop}def
+/fs{pop}def
+/fz{pop}def
+/lin{pop pop}def
+end
+/MacVec 256 array def
+MacVec 0 /Helvetica findfont
+/Encoding get 0 128 getinterval putinterval
+MacVec 127 /DEL put MacVec 16#27 /quotesingle put MacVec 16#60 /grave put
+/NUL/SOH/STX/ETX/EOT/ENQ/ACK/BEL/BS/HT/LF/VT/FF/CR/SO/SI
+/DLE/DC1/DC2/DC3/DC4/NAK/SYN/ETB/CAN/EM/SUB/ESC/FS/GS/RS/US
+MacVec 0 32 getinterval astore pop
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/register/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/nbspace/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase
+/perthousand/Acircumflex/Ecircumflex/Aacute
+/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex
+/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+MacVec 128 128 getinterval astore pop
+/fps{
+currentflat
+exch
+dup 0 le{pop 1}if
+{
+dup setflat 3 index stopped
+{1.3 mul dup 3 index gt{pop setflat pop pop stop}if}
+{exit}
+ifelse
+}loop
+pop setflat pop pop
+}bdf
+/fp{100 currentflat fps}bdf
+/clipper{clip}bdf
+/W{/clipper load 100 clipflatness fps}bdf
+/fixtrans1 {
+dup{ic mul ic sub 1 add}concatprocs exch
+dup{im mul im sub 1 add}concatprocs exch
+dup{iy mul iy sub 1 add}concatprocs exch
+{ik mul ik sub 1 add}concatprocs
+}bdf
+/fixtrans2 {
+currentcolortransfer
+5 -1 roll exch concatprocs 7 1 roll
+4 -1 roll exch concatprocs 6 1 roll
+3 -1 roll exch concatprocs 5 1 roll
+concatprocs 4 1 roll
+setcolortransfer
+}bdf
+end%. FreeHandDict
+end%. FHIODict
+FHIODict begin
+FreeHandDict begin
+5.1568 435.3825 327.2945 781.1872 storerect rectpath clip newpath
+/onlyk{false}ndf
+/ccmyk{dup 5 -1 roll sub 0 max exch}ndf
+/setcmykcolor{1 exch sub ccmyk ccmyk ccmyk pop setrgbcolor}ndf
+/setcmykcoloroverprint{4{dup -1 eq{pop 0}if 4 1 roll}repeat setcmykcolor}ndf
+/findcmykcustomcolor{5 /packedarray where{pop packedarray}{array astore readonly}ifelse}ndf
+/setcustomcolor{exch aload pop pop 4{4 index mul 4 1 roll}repeat setcmykcolor pop}ndf
+/setseparationgray{1 exch sub dup dup dup setcmykcolor}ndf
+/setoverprint{pop}ndf
+/currentoverprint false ndf
+/colorimage{pop pop
+[5 -1 roll/exec cvx 6 -1 roll/exec cvx 7 -1 roll/exec cvx 8 -1 roll/exec cvx
+/cmykbufs2gray cvx]cvx image}
+version cvr 47.1 le isLino and{userdict begin bdf end}{ndf}ifelse
+/cci1 {
+currentcolortransfer
+{ik mul ik sub 1 add}concatprocs 4 1 roll
+{iy mul iy sub 1 add}concatprocs 4 1 roll
+{im mul im sub 1 add}concatprocs 4 1 roll
+{ic mul ic sub 1 add}concatprocs 4 1 roll
+setcolortransfer
+}ndf
+/cci2 {
+{invbuf dup length magentabuf length ne
+{dup length dup dup
+/magentabuf exch string def
+/yellowbuf exch string def
+/blackbuf exch string def}if
+dup magentabuf copy yellowbuf copy blackbuf copy pop}concatprocs
+}ndf
+/customcolorimage{colorexists{
+aload pop pop 4 array astore
+setimagecmyk
+cci1
+/magentabuf 0 string def
+/yellowbuf 0 string def
+/blackbuf 0 string def
+cci2 {magentabuf}{yellowbuf}{blackbuf}true 4 colorimage}
+{pop image}ifelse}ndf
+/separationimage{image}ndf
+/newcmykcustomcolor{6 /packedarray where{pop packedarray}{array astore readonly}ifelse}ndf
+/inkoverprint false ndf
+/setinkoverprint{pop}ndf
+/overprintprocess{pop}ndf
+/setspotcolor
+{spots exch get 0 5 getinterval exch setcustomcolor}ndf
+/currentcolortransfer{currenttransfer dup dup dup}ndf
+/setcolortransfer{systemdict begin settransfer end pop pop pop}ndf
+/getcmyk {
+dup length 4 eq
+{aload pop}
+{aload pop spots exch get 0 4 getinterval aload pop 4
+{4 index mul 4 1 roll}repeat 5 -1 roll pop} ifelse
+}bdf
+/setimagecmyk{
+getcmyk/ik xdf /iy xdf /im xdf /ic xdf
+}ndf
+/autospread{pop}ndf
+/fhsetspreadsize{pop}ndf
+/strokeopf false def
+/fillopf false def
+/R{0 ne /strokeopf xdf}bdf
+/O{0 ne /fillopf xdf}bdf
+/filler{fill}bdf
+/F{fc fhsetcolor fillopf setoverprint false autospread
+gsave /filler load fp grestore false setoverprint}bdf
+/f{closepath F}bdf
+/S{sc fhsetcolor strokeopf setoverprint true autospread {stroke}fp false setoverprint}bdf
+/s{closepath S}bdf
+/B{fc fhsetcolor fillopf setoverprint gsave /filler load fp grestore
+sc fhsetcolor strokeopf setoverprint true autospread {stroke}fp false setoverprint}bdf
+/b{closepath B}bdf
+colorexists not{/setcolorscreen {setscreen pop pop pop pop pop pop pop pop pop}bdf}if
+/fhsetcolor{dup length 4 eq
+{aload overprintprocess setcmykcolor}
+{aload 1 get spots exch get 5 get setinkoverprint setspotcolor}
+ifelse
+}ndf
+/settextcolor{dup fhsetcolor dup length 4 eq
+{onlyk{3 get 1.0 eq{true setinkoverprint}if}{pop}ifelse}
+{pop}
+ifelse
+}ndf
+/ka{/fc xdf}bdf
+/Ka{/sc xdf}bdf
+/xa{/fc xdf} bdf
+/Xa{/sc xdf} bdf
+/bc2[0 0]def
+/bc4[0 0 0 0]def
+/absmax{2 copy abs exch abs gt{exch}if pop}bdf
+/calcstep
+{ colorexists not and{calcgraysteps}{maxsteps}ifelse
+tc1 length 4 eq
+{
+0 1 3
+{tc1 1 index get
+tc2 3 -1 roll get
+sub
+}for
+absmax absmax absmax
+}
+{
+bc2 tc1 1 get 1 exch put
+tc1 gettint tc2 gettint
+sub abs
+}
+ifelse
+mul abs round dup 0 eq{pop 1}if
+dup /numsteps xdf 1 sub dup 0 eq{pop 1}if /numsteps1 xdf
+}bdf
+/cblend{
+tc1 length 4 eq
+{
+0 1 3
+{bc4 exch
+tc1 1 index get
+tc2 2 index get
+1 index sub
+frac mul add put
+}for bc4
+}
+{
+bc2
+tc1 gettint
+tc2 gettint
+1 index sub
+frac mul add
+puttint bc2
+}
+ifelse
+fhsetcolor
+}bdf
+/logtaper{/frac frac 9 mul 1 add log def}bdf
+FHIODict begin
+/origmtx matrix currentmatrix def
+/iminv false def
+/invbuf{0 1 2 index length 1 sub{dup 2 index exch get 255 exch sub 2 index 3 1 roll put}for}bdf
+/cyanrp{currentfile cyanbuf readhexstring pop iminv{invbuf}if}def
+/magentarp{cyanbuf magentabuf copy}bdf
+/yellowrp{cyanbuf yellowbuf copy}bdf
+/blackrp{cyanbuf blackbuf copy}bdf
+/fixtransfer{
+colorexists
+{fixtrans1 fixtrans2}
+{{dup 1 exch sub currentgray mul add}concatprocs
+currenttransfer exch concatprocs
+systemdict begin settransfer end}ifelse
+}ndf
+/cmykbufs2gray{
+dup length 0 1 3 -1 roll 1 sub
+{4 index 1 index get
+4 index 2 index get
+4 index 3 index get
+4 index 4 index get
+255 exch sub ccmyk ccmyk ccmyk pop 5 mul exch 45 mul add exch 14 mul add -6 bitshift
+2 index 3 1 roll put}for
+4 1 roll pop pop pop
+}bdf
+end
+/textopf false def
+/curtextmtx{}def
+/otw .25 def
+/msf{dup/curtextmtx xdf makefont setfont}bdf
+/makesetfont/msf load def
+/curtextheight{.707104 .707104 curtextmtx dtransform
+dup mul exch dup mul add sqrt}bdf
+/ta{1 index
+{tempstr 0 2 index put tempstr 2 index
+gsave exec grestore
+tempstr stringwidth rmoveto
+5 index eq{6 index 6 index rmoveto}if
+3 index 3 index rmoveto
+}forall 7{pop}repeat}bdf
+/sts{settextcolor textopf setoverprint/ts{awidthshow}def exec false setoverprint}bdf
+/stol{setlinewidth settextcolor textopf setoverprint newpath
+/ts{{false charpath stroke}ta}def exec false setoverprint}bdf
+/currentpacking where{pop false setpacking}if
+/spots[1 0 0 0 (Process Cyan) false newcmykcustomcolor
+0 1 0 0 (Process Magenta) false newcmykcustomcolor
+0 0 1 0 (Process Yellow) false newcmykcustomcolor
+0 0 0 1 (Process Black) false newcmykcustomcolor
+0 0 0 0 (White) false
+newcmykcustomcolor
+]def
+0 dict dup begin
+end
+/f0 /Symbol FF def
+[] 0 d
+3.863708 M
+1 w
+0 j
+0 J
+0 O
+0 R
+0 i
+false eomode
+[0 0 0 1] Ka
+[0 0 0 1] ka
+vms
+u
+vmrs
+MacVec 256 array copy
+/f1 /|______Helvetica-Bold dup RF findfont def
+{
+f1 [18 0 0 18 0 0] makesetfont
+9.656845 613.020248 m
+0 0 32 0 0 (1) ts
+}
+[0 0 0 1]
+sts
+78.6568 699.0202 m
+78.6568 745.0202 L
+2 J
+S
+78.6568 745.0202 m
+83.6568 745.0202 L
+78.6568 757.0202 L
+73.6568 745.0202 L
+78.6568 745.0202 L
+f
+n
+160.6568 624.0202 m
+162.6568 627.0202 L
+165.6568 631.0202 L
+168.6568 634.0202 L
+171.6568 636.0202 L
+175.6568 639.0202 L
+178.6568 641.0202 L
+180.6568 642.0202 L
+182.6568 643.0202 L
+184.6568 644.0202 L
+186.6568 645.0202 L
+188.6568 646.0202 L
+190.6568 647.0202 L
+192.6568 647.0202 L
+194.6568 648.0202 L
+196.6568 648.0202 L
+198.6568 649.0202 L
+200.6568 649.0202 L
+202.6568 650.0202 L
+205.6568 650.0202 L
+207.6568 650.0202 L
+209.6568 650.0202 L
+211.6568 651.0202 L
+213.6568 651.0202 L
+215.6568 651.0202 L
+217.6568 650.0202 L
+219.6568 650.0202 L
+221.6568 650.0202 L
+223.6568 650.0202 L
+225.6568 649.0202 L
+227.6568 649.0202 L
+231.6568 648.0202 L
+235.6568 646.0202 L
+238.6568 644.0202 L
+241.6568 642.0202 L
+244.6568 640.0202 L
+247.6568 637.0202 L
+249.6568 635.0202 L
+251.6568 632.0202 L
+253.6568 630.0202 L
+255.6568 628.0202 L
+257.6568 625.0202 L
+258.6568 623.0202 L
+260.6568 621.0202 L
+262.6568 618.0202 L
+263.6568 616.0202 L
+265.6568 613.0202 L
+267.6568 611.0202 L
+268.6568 608.0202 L
+270.6568 606.0202 L
+271.6568 603.0202 L
+272.6568 601.0202 L
+274.6568 598.0202 L
+275.6568 595.0202 L
+276.6568 593.0202 L
+277.6568 590.0202 L
+279.6568 588.0202 L
+280.6568 585.0202 L
+281.6568 582.0202 L
+282.6568 580.0202 L
+283.6568 577.0202 L
+284.6568 574.0202 L
+285.6568 572.0202 L
+286.6568 569.0202 L
+286.6568 566.0202 L
+287.6568 563.0202 L
+288.6568 561.0202 L
+289.6568 558.0202 L
+289.6568 555.0202 L
+290.6568 552.0202 L
+291.6568 550.0202 L
+291.6568 547.0202 L
+292.6568 544.0202 L
+292.6568 541.0202 L
+293.6568 538.0202 L
+293.6568 536.0202 L
+293.6568 533.0202 L
+294.6568 530.0202 L
+294.6568 527.0202 L
+294.6568 524.0202 L
+295.6568 521.0202 L
+295.6568 519.0202 L
+295.6568 516.0202 L
+295.6568 513.0202 L
+295.6568 510.0202 L
+295.6568 506.0202 L
+295.6568 503.0202 L
+295.6568 500.0202 L
+294.6568 498.0202 L
+294.6568 495.0202 L
+293.6568 493.0202 L
+293.6568 491.0202 L
+292.6568 489.0202 L
+291.6568 487.0202 L
+290.6568 486.0202 L
+289.6568 484.0202 L
+288.6568 483.0202 L
+286.6568 481.0202 L
+284.6568 480.0202 L
+281.6568 481.0202 L
+279.6568 481.0202 L
+276.6568 482.0202 L
+274.6568 484.0202 L
+235.6568 520.0202 L
+S
+91.6568 694.0202 m
+93.6568 696.0202 L
+95.6568 698.0202 L
+97.6568 700.0202 L
+100.6568 702.0202 L
+102.6568 703.0202 L
+104.6568 705.0202 L
+107.6568 706.0202 L
+109.6568 708.0202 L
+112.6568 709.0202 L
+114.6568 710.0202 L
+117.6568 711.0202 L
+119.6568 713.0202 L
+122.6568 714.0202 L
+125.6568 715.0202 L
+128.6568 715.0202 L
+130.6568 716.0202 L
+133.6568 717.0202 L
+136.6568 718.0202 L
+139.6568 718.0202 L
+142.6568 719.0202 L
+145.6568 719.0202 L
+148.6568 720.0202 L
+151.6568 720.0202 L
+154.6568 720.0202 L
+156.6568 720.0202 L
+159.6568 720.0202 L
+162.6568 720.0202 L
+165.6568 720.0202 L
+168.6568 720.0202 L
+171.6568 720.0202 L
+174.6568 720.0202 L
+177.6568 720.0202 L
+180.6568 720.0202 L
+183.6568 719.0202 L
+186.6568 719.0202 L
+189.6568 719.0202 L
+192.6568 718.0202 L
+195.6568 718.0202 L
+198.6568 717.0202 L
+201.6568 716.0202 L
+203.6568 716.0202 L
+206.6568 715.0202 L
+209.6568 714.0202 L
+212.6568 714.0202 L
+214.6568 713.0202 L
+217.6568 712.0202 L
+220.6568 711.0202 L
+222.6568 710.0202 L
+225.6568 709.0202 L
+228.6568 707.0202 L
+232.6568 706.0202 L
+235.6568 704.0202 L
+238.6568 703.0202 L
+241.6568 701.0202 L
+244.6568 699.0202 L
+246.6568 697.0202 L
+249.6568 695.0202 L
+252.6568 693.0202 L
+255.6568 691.0202 L
+257.6568 689.0202 L
+260.6568 687.0202 L
+262.6568 684.0202 L
+265.6568 682.0202 L
+267.6568 679.0202 L
+270.6568 677.0202 L
+272.6568 674.0202 L
+274.6568 672.0202 L
+276.6568 669.0202 L
+278.6568 666.0202 L
+280.6568 663.0202 L
+282.6568 660.0202 L
+284.6568 657.0202 L
+286.6568 655.0202 L
+288.6568 652.0202 L
+290.6568 649.0202 L
+292.6568 646.0202 L
+294.6568 642.0202 L
+295.6568 639.0202 L
+297.6568 636.0202 L
+298.6568 633.0202 L
+300.6568 630.0202 L
+301.6568 626.0202 L
+303.6568 623.0202 L
+304.6568 620.0202 L
+305.6568 617.0202 L
+307.6568 613.0202 L
+308.6568 610.0202 L
+309.6568 607.0202 L
+310.6568 603.0202 L
+311.6568 600.0202 L
+312.6568 597.0202 L
+313.6568 593.0202 L
+314.6568 590.0202 L
+315.6568 587.0202 L
+315.6568 583.0202 L
+316.6568 580.0202 L
+316.6568 578.0202 L
+317.6568 575.0202 L
+318.6568 573.0202 L
+318.6568 570.0202 L
+319.6568 567.0202 L
+319.6568 564.0202 L
+320.6568 562.0202 L
+320.6568 559.0202 L
+321.6568 556.0202 L
+321.6568 553.0202 L
+322.6568 550.0202 L
+322.6568 547.0202 L
+323.6568 544.0202 L
+323.6568 541.0202 L
+324.6568 538.0202 L
+324.6568 534.0202 L
+324.6568 531.0202 L
+325.6568 528.0202 L
+325.6568 525.0202 L
+325.6568 522.0202 L
+325.6568 519.0202 L
+326.6568 515.0202 L
+326.6568 512.0202 L
+326.6568 509.0202 L
+326.6568 506.0202 L
+326.6568 503.0202 L
+325.6568 500.0202 L
+325.6568 497.0202 L
+325.6568 494.0202 L
+324.6568 491.0202 L
+324.6568 488.0202 L
+323.6568 486.0202 L
+323.6568 483.0202 L
+322.6568 480.0202 L
+321.6568 477.0202 L
+320.6568 475.0202 L
+319.6568 472.0202 L
+318.6568 470.0202 L
+317.6568 468.0202 L
+315.6568 466.0202 L
+314.6568 464.0202 L
+312.6568 462.0202 L
+311.6568 460.0202 L
+309.6568 458.0202 L
+307.6568 456.0202 L
+305.6568 455.0202 L
+302.6568 453.0202 L
+300.6568 452.0202 L
+297.6568 451.0202 L
+294.6568 449.0202 L
+291.6568 448.0202 L
+288.6568 447.0202 L
+285.6568 446.0202 L
+282.6568 445.0202 L
+279.6568 444.0202 L
+276.6568 443.0202 L
+273.6568 442.0202 L
+270.6568 441.0202 L
+267.6568 440.0202 L
+263.6568 439.0202 L
+260.6568 439.0202 L
+257.6568 438.0202 L
+253.6568 438.0202 L
+250.6568 437.0202 L
+247.6568 437.0202 L
+244.6568 437.0202 L
+240.6568 436.0202 L
+237.6568 436.0202 L
+234.6568 436.0202 L
+230.6568 436.0202 L
+227.6568 436.0202 L
+224.6568 436.0202 L
+221.6568 436.0202 L
+218.6568 437.0202 L
+214.6568 437.0202 L
+211.6568 437.0202 L
+208.6568 438.0202 L
+205.6568 439.0202 L
+202.6568 439.0202 L
+199.6568 440.0202 L
+196.6568 441.0202 L
+194.6568 442.0202 L
+191.6568 443.0202 L
+188.6568 444.0202 L
+185.6568 445.0202 L
+183.6568 447.0202 L
+180.6568 448.0202 L
+178.6568 450.0202 L
+176.6568 451.0202 L
+173.6568 453.0202 L
+171.6568 455.0202 L
+169.6568 456.0202 L
+167.6568 458.0202 L
+165.6568 461.0202 L
+164.6568 463.0202 L
+162.6568 465.0202 L
+161.6568 467.0202 L
+160.6568 469.0202 L
+160.6568 471.0202 L
+160.6568 473.0202 L
+160.6568 476.0202 L
+160.6568 478.0202 L
+161.6568 481.0202 L
+162.6568 483.0202 L
+163.6568 486.0202 L
+165.6568 488.0202 L
+166.6568 491.0202 L
+168.6568 494.0202 L
+170.6568 496.0202 L
+172.6568 499.0202 L
+174.6568 502.0202 L
+177.6568 505.0202 L
+179.6568 507.0202 L
+181.6568 510.0202 L
+184.6568 513.0202 L
+186.6568 515.0202 L
+188.6568 518.0202 L
+191.6568 520.0202 L
+193.6568 523.0202 L
+195.6568 525.0202 L
+S
+u
+134.6568 623.0202 m
+101.6568 657.0202 L
+S
+101.6568 657.0202 m
+105.6568 661.0202 L
+93.6568 666.0202 L
+98.6568 653.0202 L
+101.6568 657.0202 L
+f
+n
+U
+u
+202.6568 554.0202 m
+171.6568 586.0202 L
+S
+171.6568 586.0202 m
+174.6568 590.0202 L
+162.6568 595.0202 L
+167.6568 582.0202 L
+171.6568 586.0202 L
+f
+n
+U
+u
+u
+60.1568 680.5202 m
+60.1568 691.0138 68.6633 699.5202 79.1568 699.5202 C
+89.6504 699.5202 98.1568 691.0138 98.1568 680.5202 C
+98.1568 670.0267 89.6504 661.5202 79.1568 661.5202 C
+68.6633 661.5202 60.1568 670.0267 60.1568 680.5202 C
+[0 0 0 0] ka
+b
+U
+vmrs
+0 dict dup begin
+end
+/f2 /Symbol FF def
+{
+f2 [36 0 0 36 0 0] makesetfont
+73.656845 672.020248 m
+0 0 32 0 0 (:) ts
+}
+[0 0 0 1]
+sts
+U
+u
+u
+129.1568 610.5202 m
+129.1568 621.0138 137.6633 629.5202 148.1568 629.5202 C
+158.6504 629.5202 167.1568 621.0138 167.1568 610.5202 C
+167.1568 600.0267 158.6504 591.5202 148.1568 591.5202 C
+137.6633 591.5202 129.1568 600.0267 129.1568 610.5202 C
+[0 0 0 0] ka
+2 J
+b
+U
+vmrs
+0 dict dup begin
+end
+/f2 /Symbol FF def
+{
+f2 [36 0 0 36 0 0] makesetfont
+142.656845 602.020248 m
+0 0 32 0 0 (:) ts
+}
+[0 0 0 1]
+sts
+U
+u
+199.1568 541.5202 m
+199.1568 552.0138 207.6633 560.5202 218.1568 560.5202 C
+228.6504 560.5202 237.1568 552.0138 237.1568 541.5202 C
+237.1568 531.0267 228.6504 522.5202 218.1568 522.5202 C
+207.6633 522.5202 199.1568 531.0267 199.1568 541.5202 C
+[0 0 0 0] ka
+2 J
+b
+U
+vmrs
+0 dict dup begin
+end
+/f2 /Symbol FF def
+{
+f2 [36 0 0 36 0 0] makesetfont
+208.12738 532.080994 m
+0 0 32 0 0 (+) ts
+}
+[0 0 0 1]
+sts
+u
+22.6568 624.0202 m
+55.6568 658.0202 L
+2 J
+S
+55.6568 658.0202 m
+58.6568 654.0202 L
+63.6568 667.0202 L
+51.6568 662.0202 L
+55.6568 658.0202 L
+f
+n
+U
+u
+90.6568 551.0202 m
+123.6568 585.0202 L
+S
+123.6568 585.0202 m
+126.6568 581.0202 L
+131.6568 594.0202 L
+119.6568 589.0202 L
+123.6568 585.0202 L
+f
+n
+U
+u
+192.6568 520.0202 m
+191.6568 519.0202 L
+S
+191.6568 519.0202 m
+195.6568 515.0202 L
+200.6568 528.0202 L
+187.6568 523.0202 L
+191.6568 519.0202 L
+f
+n
+U
+u
+237.6568 518.0202 m
+240.6568 515.0202 L
+S
+240.6568 515.0202 m
+244.6568 519.0202 L
+231.6568 524.0202 L
+236.6568 511.0202 L
+240.6568 515.0202 L
+f
+n
+U
+vmrs
+MacVec 256 array copy
+/f1 /|______Helvetica-Bold dup RF findfont def
+{
+f1 [18 0 0 18 0 0] makesetfont
+76.656845 538.020248 m
+0 0 32 0 0 (1) ts
+}
+[0 0 0 1]
+sts
+vmrs
+MacVec 256 array copy
+/f1 /|______Helvetica-Bold dup RF findfont def
+{
+f1 [18 0 0 18 0 0] makesetfont
+126.656845 724.020248 m
+0 0 32 0 0 (1,1,2,3,5,...) ts
+}
+[0 0 0 1]
+sts
+vmrs
+MacVec 256 array copy
+/f1 /|______Helvetica-Bold dup RF findfont def
+{
+f1 [18 0 0 18 0 0] makesetfont
+164.656845 655.020248 m
+0 0 32 0 0 (1,2,3,5,8,...) ts
+}
+[0 0 0 1]
+sts
+vmrs
+MacVec 256 array copy
+/f3 /|______Times-BoldItalic dup RF findfont def
+{
+f3 [18 0 0 18 0 0] makesetfont
+69.656845 763.020248 m
+0 0 32 0 0 (fib) ts
+}
+[0 0 0 1]
+sts
+U
+vmr
+end % FreeHandDict
+end % FHIODict
+%%EndDocument
+ @endspecial 1134 w @beginspecial 14.258400 @llx 620.398376
+@lly 377.258392 @urx 783.398376 @ury 1800 @rwi @setspecial
+%%BeginDocument: io.eps
+/FHIODict 30 dict def
+FHIODict begin
+/bdf{bind def}bind def
+/d{setdash}bdf
+/h{closepath}bdf
+/H{}bdf
+/J{setlinecap}bdf
+/j{setlinejoin}bdf
+/M{setmiterlimit}bdf
+/n{newpath}bdf
+/N{newpath}bdf
+/q{gsave}bdf
+/Q{grestore}bdf
+/w{setlinewidth}bdf
+/u{}bdf
+/U{}bdf
+/sepdef{
+dup where not
+{
+FreeHandSepDict
+}
+if
+3 1 roll exch put
+}bdf
+/`
+{end %. FreeHandDict
+/-save0- save def
+pop pop pop pop pop
+concat
+userdict begin
+/showpage {} def
+0 setgray 0 setlinecap 1 setlinewidth
+0 setlinejoin 10 setmiterlimit [] 0 setdash newpath
+/languagelevel where {pop languagelevel 1 ne{false setstrokeadjust false setoverprint}if}if
+} bdf
+/~
+{end
+-save0- restore
+FreeHandDict begin
+}bdf
+/FreeHandDict 190 dict def
+FreeHandDict begin
+/currentpacking where{pop true setpacking}if
+/xdf{exch def}bdf
+/ndf{1 index where{pop pop pop}{dup xcheck{bind}if def}ifelse}bdf
+/min{2 copy gt{exch}if pop}bdf
+/max{2 copy lt{exch}if pop}bdf
+/isLino statusdict /product get (Lino) anchorsearch{pop pop true}{pop false}ifelse def
+/dr{transform .25 sub round .25 add
+exch .25 sub round .25 add exch itransform}bdf
+/C{dr curveto}bdf
+/L{dr lineto}bdf
+/m{dr moveto}bdf
+/printerRes
+gsave
+matrix defaultmatrix setmatrix
+72 72 dtransform
+abs exch abs
+max
+grestore
+def
+/maxsteps 256 def
+/calcgraysteps {
+currentscreen pop exch
+printerRes exch div exch
+2 copy
+sin mul round dup mul
+3 1 roll
+cos mul round dup mul
+add 1 add
+dup maxsteps gt {pop maxsteps} if
+} bdf
+/bottom -0 def
+/delta -0 def
+/frac -0 def
+/left -0 def
+/numsteps -0 def
+/numsteps1 -0 def
+/radius -0 def
+/right -0 def
+/top -0 def
+/xt -0 def
+/yt -0 def
+/df currentflat def
+/tempstr 1 string def
+/clipflatness currentflat def
+/inverted?
+0 currenttransfer exec .5 ge def
+/colorexists
+systemdict/setcmykcolor known def
+/tc1 [0 0 0 1] def
+/tc2 [0 0 0 1] def
+/fc [0 0 0 1] def
+/sc [0 0 0 1] def
+/concatprocs{
+/proc2 exch cvlit def/proc1 exch cvlit def
+/newproc proc1 length proc2 length add array def
+newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval
+newproc cvx}bdf
+/storerect{/top xdf/right xdf/bottom xdf/left xdf}bdf
+/rectpath{newpath left bottom m left top L
+right top L right bottom L closepath}bdf
+/i{dup 0 eq
+{pop df dup}
+{dup} ifelse
+/clipflatness xdf setflat
+}bdf
+version cvr 38.0 le
+{/setrgbcolor{
+currenttransfer exec 3 1 roll
+currenttransfer exec 3 1 roll
+currenttransfer exec 3 1 roll
+setrgbcolor}bdf}if
+/gettint{0 get}bdf
+/puttint{0 exch put}bdf
+/vms {/vmsv save def} bdf
+/vmr {vmsv restore} bdf
+/vmrs{vmsv restore /vmsv save def}bdf
+/eomode{
+{/filler /eofill load def /clipper /eoclip load def}
+{/filler /fill load def /clipper /clip load def}
+ifelse
+}bdf
+/CD{/NF exch def{exch dup/FID ne 1 index/UniqueID ne and{exch NF 3 1 roll put}
+{pop pop}ifelse}forall NF}bdf
+/MN{1 index length/Len exch def
+dup length Len add string dup
+Len 4 -1 roll putinterval dup 0 4 -1 roll putinterval}bdf
+/RC{4 -1 roll /ourvec xdf 256 string cvs(|______)anchorsearch
+{1 index MN cvn/NewN exch def cvn
+findfont dup maxlength dict CD dup/FontName NewN put dup
+/Encoding ourvec put NewN exch definefont pop}{pop}ifelse}bdf
+/RF{dup FontDirectory exch known{pop 3 -1 roll pop}{RC}ifelse}bdf
+/FF{dup 256 string cvs(|______)exch MN cvn dup FontDirectory exch known
+{exch pop findfont 3 -1 roll pop}{pop dup findfont dup maxlength dict CD dup dup
+/Encoding exch /Encoding get 256 array copy 7 -1 roll {3 -1 roll dup 4 -2 roll put}forall put definefont}ifelse}bdf
+userdict begin /BDFontDict 20 dict def end
+BDFontDict begin
+/bu{}def
+/bn{}def
+/setTxMode{av 70 ge{pop}if pop}def
+/gm{m}def
+/show{pop}def
+/gr{pop}def
+/fnt{pop pop pop}def
+/fs{pop}def
+/fz{pop}def
+/lin{pop pop}def
+end
+/MacVec 256 array def
+MacVec 0 /Helvetica findfont
+/Encoding get 0 128 getinterval putinterval
+MacVec 127 /DEL put MacVec 16#27 /quotesingle put MacVec 16#60 /grave put
+/NUL/SOH/STX/ETX/EOT/ENQ/ACK/BEL/BS/HT/LF/VT/FF/CR/SO/SI
+/DLE/DC1/DC2/DC3/DC4/NAK/SYN/ETB/CAN/EM/SUB/ESC/FS/GS/RS/US
+MacVec 0 32 getinterval astore pop
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/register/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/nbspace/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase
+/perthousand/Acircumflex/Ecircumflex/Aacute
+/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex
+/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+MacVec 128 128 getinterval astore pop
+/fps{
+currentflat
+exch
+dup 0 le{pop 1}if
+{
+dup setflat 3 index stopped
+{1.3 mul dup 3 index gt{pop setflat pop pop stop}if}
+{exit}
+ifelse
+}loop
+pop setflat pop pop
+}bdf
+/fp{100 currentflat fps}bdf
+/clipper{clip}bdf
+/W{/clipper load 100 clipflatness fps}bdf
+/fixtrans1 {
+dup{ic mul ic sub 1 add}concatprocs exch
+dup{im mul im sub 1 add}concatprocs exch
+dup{iy mul iy sub 1 add}concatprocs exch
+{ik mul ik sub 1 add}concatprocs
+}bdf
+/fixtrans2 {
+currentcolortransfer
+5 -1 roll exch concatprocs 7 1 roll
+4 -1 roll exch concatprocs 6 1 roll
+3 -1 roll exch concatprocs 5 1 roll
+concatprocs 4 1 roll
+setcolortransfer
+}bdf
+end%. FreeHandDict
+end%. FHIODict
+FHIODict begin
+FreeHandDict begin
+14.2584 620.3984 377.2584 783.3984 storerect rectpath clip newpath
+/onlyk{false}ndf
+/ccmyk{dup 5 -1 roll sub 0 max exch}ndf
+/setcmykcolor{1 exch sub ccmyk ccmyk ccmyk pop setrgbcolor}ndf
+/setcmykcoloroverprint{4{dup -1 eq{pop 0}if 4 1 roll}repeat setcmykcolor}ndf
+/findcmykcustomcolor{5 /packedarray where{pop packedarray}{array astore readonly}ifelse}ndf
+/setcustomcolor{exch aload pop pop 4{4 index mul 4 1 roll}repeat setcmykcolor pop}ndf
+/setseparationgray{1 exch sub dup dup dup setcmykcolor}ndf
+/setoverprint{pop}ndf
+/currentoverprint false ndf
+/colorimage{pop pop
+[5 -1 roll/exec cvx 6 -1 roll/exec cvx 7 -1 roll/exec cvx 8 -1 roll/exec cvx
+/cmykbufs2gray cvx]cvx image}
+version cvr 47.1 le isLino and{userdict begin bdf end}{ndf}ifelse
+/cci1 {
+currentcolortransfer
+{ik mul ik sub 1 add}concatprocs 4 1 roll
+{iy mul iy sub 1 add}concatprocs 4 1 roll
+{im mul im sub 1 add}concatprocs 4 1 roll
+{ic mul ic sub 1 add}concatprocs 4 1 roll
+setcolortransfer
+}ndf
+/cci2 {
+{invbuf dup length magentabuf length ne
+{dup length dup dup
+/magentabuf exch string def
+/yellowbuf exch string def
+/blackbuf exch string def}if
+dup magentabuf copy yellowbuf copy blackbuf copy pop}concatprocs
+}ndf
+/customcolorimage{colorexists{
+aload pop pop 4 array astore
+setimagecmyk
+cci1
+/magentabuf 0 string def
+/yellowbuf 0 string def
+/blackbuf 0 string def
+cci2 {magentabuf}{yellowbuf}{blackbuf}true 4 colorimage}
+{pop image}ifelse}ndf
+/separationimage{image}ndf
+/newcmykcustomcolor{6 /packedarray where{pop packedarray}{array astore readonly}ifelse}ndf
+/inkoverprint false ndf
+/setinkoverprint{pop}ndf
+/overprintprocess{pop}ndf
+/setspotcolor
+{spots exch get 0 5 getinterval exch setcustomcolor}ndf
+/currentcolortransfer{currenttransfer dup dup dup}ndf
+/setcolortransfer{systemdict begin settransfer end pop pop pop}ndf
+/getcmyk {
+dup length 4 eq
+{aload pop}
+{aload pop spots exch get 0 4 getinterval aload pop 4
+{4 index mul 4 1 roll}repeat 5 -1 roll pop} ifelse
+}bdf
+/setimagecmyk{
+getcmyk/ik xdf /iy xdf /im xdf /ic xdf
+}ndf
+/autospread{pop}ndf
+/fhsetspreadsize{pop}ndf
+/strokeopf false def
+/fillopf false def
+/R{0 ne /strokeopf xdf}bdf
+/O{0 ne /fillopf xdf}bdf
+/filler{fill}bdf
+/F{fc fhsetcolor fillopf setoverprint false autospread
+gsave /filler load fp grestore false setoverprint}bdf
+/f{closepath F}bdf
+/S{sc fhsetcolor strokeopf setoverprint true autospread {stroke}fp false setoverprint}bdf
+/s{closepath S}bdf
+/B{fc fhsetcolor fillopf setoverprint gsave /filler load fp grestore
+sc fhsetcolor strokeopf setoverprint true autospread {stroke}fp false setoverprint}bdf
+/b{closepath B}bdf
+colorexists not{/setcolorscreen {setscreen pop pop pop pop pop pop pop pop pop}bdf}if
+/fhsetcolor{dup length 4 eq
+{aload overprintprocess setcmykcolor}
+{aload 1 get spots exch get 5 get setinkoverprint setspotcolor}
+ifelse
+}ndf
+/settextcolor{dup fhsetcolor dup length 4 eq
+{onlyk{3 get 1.0 eq{true setinkoverprint}if}{pop}ifelse}
+{pop}
+ifelse
+}ndf
+/ka{/fc xdf}bdf
+/Ka{/sc xdf}bdf
+/xa{/fc xdf} bdf
+/Xa{/sc xdf} bdf
+/bc2[0 0]def
+/bc4[0 0 0 0]def
+/absmax{2 copy abs exch abs gt{exch}if pop}bdf
+/calcstep
+{ colorexists not and{calcgraysteps}{maxsteps}ifelse
+tc1 length 4 eq
+{
+0 1 3
+{tc1 1 index get
+tc2 3 -1 roll get
+sub
+}for
+absmax absmax absmax
+}
+{
+bc2 tc1 1 get 1 exch put
+tc1 gettint tc2 gettint
+sub abs
+}
+ifelse
+mul abs round dup 0 eq{pop 1}if
+dup /numsteps xdf 1 sub dup 0 eq{pop 1}if /numsteps1 xdf
+}bdf
+/cblend{
+tc1 length 4 eq
+{
+0 1 3
+{bc4 exch
+tc1 1 index get
+tc2 2 index get
+1 index sub
+frac mul add put
+}for bc4
+}
+{
+bc2
+tc1 gettint
+tc2 gettint
+1 index sub
+frac mul add
+puttint bc2
+}
+ifelse
+fhsetcolor
+}bdf
+/logtaper{/frac frac 9 mul 1 add log def}bdf
+FHIODict begin
+/origmtx matrix currentmatrix def
+/iminv false def
+/invbuf{0 1 2 index length 1 sub{dup 2 index exch get 255 exch sub 2 index 3 1 roll put}for}bdf
+/cyanrp{currentfile cyanbuf readhexstring pop iminv{invbuf}if}def
+/magentarp{cyanbuf magentabuf copy}bdf
+/yellowrp{cyanbuf yellowbuf copy}bdf
+/blackrp{cyanbuf blackbuf copy}bdf
+/fixtransfer{
+colorexists
+{fixtrans1 fixtrans2}
+{{dup 1 exch sub currentgray mul add}concatprocs
+currenttransfer exch concatprocs
+systemdict begin settransfer end}ifelse
+}ndf
+/cmykbufs2gray{
+dup length 0 1 3 -1 roll 1 sub
+{4 index 1 index get
+4 index 2 index get
+4 index 3 index get
+4 index 4 index get
+255 exch sub ccmyk ccmyk ccmyk pop 5 mul exch 45 mul add exch 14 mul add -6 bitshift
+2 index 3 1 roll put}for
+4 1 roll pop pop pop
+}bdf
+end
+/textopf false def
+/curtextmtx{}def
+/otw .25 def
+/msf{dup/curtextmtx xdf makefont setfont}bdf
+/makesetfont/msf load def
+/curtextheight{.707104 .707104 curtextmtx dtransform
+dup mul exch dup mul add sqrt}bdf
+/ta{1 index
+{tempstr 0 2 index put tempstr 2 index
+gsave exec grestore
+tempstr stringwidth rmoveto
+5 index eq{6 index 6 index rmoveto}if
+3 index 3 index rmoveto
+}forall 7{pop}repeat}bdf
+/sts{settextcolor textopf setoverprint/ts{awidthshow}def exec false setoverprint}bdf
+/stol{setlinewidth settextcolor textopf setoverprint newpath
+/ts{{false charpath stroke}ta}def exec false setoverprint}bdf
+/currentpacking where{pop false setpacking}if
+/spots[1 0 0 0 (Process Cyan) false newcmykcustomcolor
+0 1 0 0 (Process Magenta) false newcmykcustomcolor
+0 0 1 0 (Process Yellow) false newcmykcustomcolor
+0 0 0 1 (Process Black) false newcmykcustomcolor
+0 0 0 0 (White) false
+newcmykcustomcolor
+]def
+0 dict dup begin
+end
+/f0 /Symbol FF def
+[] 0 d
+3.863708 M
+1 w
+0 j
+0 J
+0 O
+0 R
+0 i
+false eomode
+[0 0 0 1] Ka
+[0 0 0 1] ka
+vms
+u
+u
+u
+u
+u
+14.7584 767.5217 m
+119.7584 767.5217 L
+119.7584 710.5217 L
+14.7584 710.5217 L
+14.7584 767.5217 L
+[0 0 0 0] ka
+2 J
+b
+U
+vmrs
+MacVec 256 array copy
+/f1 /|______Helvetica-Bold dup RF findfont def
+{
+f1 [24 0 0 24 0 0] makesetfont
+34.258438 731.021698 m
+0 0 32 0 0 (client) ts
+}
+[0 0 0 1]
+sts
+U
+u
+271.7584 767.5217 m
+376.7584 767.5217 L
+376.7584 710.5217 L
+271.7584 710.5217 L
+271.7584 767.5217 L
+[0 0 0 0] ka
+2 J
+b
+U
+vmrs
+MacVec 256 array copy
+/f1 /|______Helvetica-Bold dup RF findfont def
+{
+f1 [24 0 0 24 0 0] makesetfont
+286.258438 732.021698 m
+0 0 32 0 0 (server) ts
+}
+[0 0 0 1]
+sts
+u
+119.2584 756.0217 m
+254.2584 756.0217 L
+2 J
+S
+254.2584 756.0217 m
+254.2584 751.0217 L
+266.2584 756.0217 L
+254.2584 761.0217 L
+254.2584 756.0217 L
+f
+n
+U
+u
+271.2584 721.0217 m
+135.2584 721.0217 L
+S
+135.2584 721.0217 m
+135.2584 726.0217 L
+123.2584 721.0217 L
+135.2584 716.0217 L
+135.2584 721.0217 L
+f
+n
+U
+u
+65.2584 653.0217 m
+65.2584 694.0217 L
+S
+65.2584 694.0217 m
+70.2584 694.0217 L
+65.2584 706.0217 L
+60.2584 694.0217 L
+65.2584 694.0217 L
+f
+n
+U
+vmrs
+MacVec 256 array copy
+/f2 /|______Courier-Bold dup RF findfont def
+{
+f2 [24 0 0 24 0 0] makesetfont
+163.258438 760.021698 m
+0 0 32 0 0 (reqs) ts
+}
+[0 0 0 1]
+sts
+vmrs
+MacVec 256 array copy
+/f2 /|______Courier-Bold dup RF findfont def
+{
+f2 [24 0 0 24 0 0] makesetfont
+158.258438 705.021698 m
+0 0 32 0 0 (resps) ts
+}
+[0 0 0 1]
+sts
+vmrs
+MacVec 256 array copy
+/f2 /|______Courier-Bold dup RF findfont def
+{
+f2 [24 0 0 24 0 0] makesetfont
+38.258438 633.021698 m
+0 0 32 0 0 (init) ts
+}
+[0 0 0 1]
+sts
+U
+U
+U
+vmr
+end % FreeHandDict
+end % FHIODict
+%%EndDocument
+ @endspecial 106 967 a(Figure)15 b(1:)20 b(\(a\))14 b(Circular)i(Fib)q
+(onacci)h(Sequence)331 b(\(b\))15 b(Serv)o(er/Clien)o(t)h(Sim)o(ulation)0
+1093 y Fq(4)69 b(Case)23 b(Expressions)g(and)h(P)n(attern)f(Matc)n(hing)0
+1215 y Fp(Earlier)c(w)o(e)e(ga)o(v)o(e)g(sev)o(eral)h(examples)h(of)e
+(pattern)h(matc)o(hing)g(in)g(de\014ning)i(functions|for)e(example)h
+Fi(length)0 1271 y Fp(and)f Fi(fringe)o Fp(.)28 b(In)19 b(this)f(section)g(w)
+o(e)g(will)h(lo)q(ok)f(at)g(the)g(pattern-matc)o(hing)f(pro)q(cess)h(in)h(m)o
+(uc)o(h)f(greater)f(detail)0 1328 y(\()p Fn(x)p Fp(3.14\).)151
+1311 y Fm(9)71 1404 y Fp(P)o(atterns)e(are)i(not)f(\\\014rst-class;")h(there)
+g(is)h(only)f(a)g(\014xed)g(set)g(of)f(di\013eren)o(t)i(kinds)f(of)g
+(patterns.)24 b(W)l(e)17 b(ha)o(v)o(e)0 1461 y(already)c(seen)g(sev)o(eral)g
+(examples)h(of)e Fo(data)j(c)n(onstructor)e Fp(patterns;)f(b)q(oth)h
+Fi(length)f Fp(and)h Fi(fringe)f Fp(de\014ned)i(earlier)0 1517
+y(use)i(suc)o(h)h(patterns,)e(the)h(former)f(on)h(the)g(constructors)f(of)g
+(a)h(\\built-in")i(t)o(yp)q(e)e(\(lists\),)g(the)g(latter)f(on)h(a)g(user-)0
+1574 y(de\014ned)e(t)o(yp)q(e)e(\()p Fi(Tree)o Fp(\).)19 b(Indeed,)14
+b(matc)o(hing)e(is)h(p)q(ermitted)g(using)h(the)e(constructors)g(of)g(an)o(y)
+g(t)o(yp)q(e,)g(user-de\014ned)0 1630 y(or)19 b(not.)31 b(This)20
+b(includes)h(tuples,)g(strings,)f(n)o(um)o(b)q(ers,)g(c)o(haracters,)f(etc.)
+32 b(F)l(or)18 b(example,)j(here's)e(a)g(con)o(triv)o(ed)0
+1686 y(function)d(that)f(matc)o(hes)f(against)h(a)g(tuple)h(of)f(\\constan)o
+(ts:")71 1795 y Fi(contrived)22 b(::)i(\([a],)f(Char,)g(\(Int,)g(Float\),)g
+(String,)g(Bool\))g(->)h(Bool)71 1852 y(contrived)94 b(\([],)47
+b('b',)g(\(1,)71 b(2.0\),)g("hi",)g(True\))23 b(=)h(False)0
+1964 y Fp(This)16 b(example)g(also)f(demonstrates)f(that)h
+Fo(nesting)f Fp(of)g(patterns)h(is)h(p)q(ermitted)g(\(to)e(arbitrary)h
+(depth\).)71 2040 y(T)l(ec)o(hnically)21 b(sp)q(eaking,)f Fo(formal)g(p)n(ar)
+n(ameters)881 2024 y Fm(10)937 2040 y Fp(are)f(also)f(patterns|it's)h(just)f
+(that)g(they)h Fo(never)g(fail)h(to)0 2097 y(match)f(a)g(value)p
+Fp(.)28 b(As)18 b(a)f(\\side)h(e\013ect")g(of)f(the)h(successful)h(matc)o(h,)
+e(the)h(formal)g(parameter)f(is)h(b)q(ound)h(to)e(the)0 2153
+y(v)m(alue)j(it)e(is)h(b)q(eing)h(matc)o(hed)e(against.)30
+b(F)l(or)18 b(this)g(reason)h(patterns)e(in)j(an)o(y)e(one)g(equation)h(are)f
+(not)h(allo)o(w)o(ed)0 2210 y(to)14 b(ha)o(v)o(e)h(more)f(than)h(one)f(o)q
+(ccurrence)i(of)f(the)g(same)f(formal)g(parameter)g(\(a)h(prop)q(ert)o(y)f
+(called)i Fo(line)n(arity)e Fn(x)q Fp(3.14,)0 2266 y Fn(x)p
+Fp(3.2,)p Fn(x)o Fp(4.4.2\).)71 2343 y(P)o(atterns)c(suc)o(h)i(as)e(formal)h
+(parameters)g(that)g(nev)o(er)g(fail)h(to)f(matc)o(h)g(are)g(said)h(to)e(b)q
+(e)i Fo(irr)n(efutable)p Fp(,)g(in)g(con)o(trast)0 2399 y(to)g
+Fo(r)n(efutable)h Fp(patterns)f(suc)o(h)h(as)f(the)h(ones)g(giv)o(en)g(in)h
+(the)e Fi(contrived)g Fp(example)h(ab)q(o)o(v)o(e.)19 b(There)13
+b(are)g(three)f(other)p 0 2434 780 2 v 52 2461 a Fl(9)69 2477
+y Fk(P)o(attern)k(matc)o(hing)h(in)f(Hask)o(ell)h(is)f(v)o(ery)g(di\013eren)o
+(t)h(from)e(that)g(found)h(in)h(logic)g(programming)g(languages)g(suc)o(h)f
+(as)g(Prolog;)0 2522 y(in)e(particular,)h(it)e(can)g(b)q(e)h(view)o(ed)g(as)f
+(\\one-w)o(a)o(y")g(matc)o(hing,)h(whereas)g(Prolog)g(allo)o(ws)g(\\t)o(w)o
+(o-w)o(a)o(y")f(matc)o(hing)i(\(via)e(uni\014cation\),)0 2568
+y(along)h(with)g(implicit)i(bac)o(ktrac)o(king)f(in)f(its)f(ev)n(aluation)j
+(mec)o(hanism.)37 2598 y Fl(10)69 2614 y Fk(The)d(Rep)q(ort)h(calls)g(these)g
+Fe(variables)p Fk(.)p eop
+%%Page: 16 16
+bop 0 -40 a Fp(T-16)700 b Fj(4)45 b(CASE)15 b(EXPRESSIONS)i(AND)e(P)l(A)l
+(TTERN)h(MA)l(TCHING)0 105 y Fp(kinds)k(of)f(irrefutable)i(patterns,)e(t)o(w)
+o(o)g(of)g(whic)o(h)h(w)o(e)f(will)i(in)o(tro)q(duce)f(no)o(w)f(\(the)h
+(other)f(w)o(e)g(will)i(dela)o(y)f(un)o(til)0 162 y(Section)c(4.4\).)0
+308 y Fc(As-patterns.)45 b Fp(Sometimes)16 b(it)h(is)f(con)o(v)o(enien)o(t)h
+(to)e(name)h(a)g(pattern)g(for)f(use)h(on)g(the)h(righ)o(t-hand)f(side.)24
+b(F)l(or)0 365 y(example,)16 b(a)f(function)h(that)e(duplicates)j(the)e
+(\014rst)g(elemen)o(t)h(in)g(a)f(list)h(migh)o(t)f(b)q(e)h(written)f(as:)71
+474 y Fi(f)23 b(\(x:xs\))381 b(=)24 b(x:x:xs)0 585 y Fp(\(Recall)17
+b(that)d Fi(:)h Fp(asso)q(ciates)g(to)g(the)g(righ)o(t.\))k(Note)c(that)g
+Fi(x:xs)f Fp(app)q(ears)i(b)q(oth)f(as)g(a)g(pattern)g(on)g(the)g(left-hand)0
+642 y(side,)k(and)f(an)f(expression)h(on)g(the)g(righ)o(t-hand)g(side.)28
+b(T)l(o)17 b(impro)o(v)o(e)g(readabilit)o(y)l(,)j(w)o(e)d(migh)o(t)g(prefer)h
+(to)f(write)0 698 y Fi(x:xs)e Fp(just)g(once,)g(whic)o(h)h(w)o(e)f(can)g(ac)o
+(hiev)o(e)h(using)g(an)f Fo(as-p)n(attern)g Fp(as)g(follo)o(ws:)1353
+682 y Fm(11)71 807 y Fi(f)23 b(s@\(x:xs\))309 b(=)24 b(x:s)0
+919 y Fp(T)l(ec)o(hnically)17 b(sp)q(eaking,)d(as-patterns)g(alw)o(a)o(ys)f
+(result)i(in)g(a)f(successful)h(matc)o(h,)f(although)g(the)g(sub-pattern)g
+(\(in)0 975 y(this)i(case)f Fi(x:xs)o Fp(\))g(could,)h(of)f(course,)g(fail.)0
+1122 y Fc(Wild-cards.)46 b Fp(Another)12 b(common)e(situation)i(is)g(matc)o
+(hing)f(against)g(a)g(v)m(alue)h(w)o(e)f(really)i(care)e(nothing)g(ab)q(out.)
+0 1179 y(F)l(or)k(example,)g(the)h(functions)f Fi(head)g Fp(and)g
+Fi(tail)g Fp(de\014ned)i(in)f(Section)g(2.1)e(can)h(b)q(e)h(rewritten)f(as:)
+71 1288 y Fi(head)23 b(\(_:xs\))309 b(=)24 b(x)71 1344 y(tail)f(\(x:_\))333
+b(=)24 b(xs)0 1453 y Fp(in)14 b(whic)o(h)h(w)o(e)e(ha)o(v)o(e)g(\\adv)o
+(ertised")h(the)f(fact)g(that)g(w)o(e)g(don't)g(care)h(what)f(a)g(certain)h
+(part)f(of)g(the)h(input)g(is.)20 b(Eac)o(h)0 1510 y(wild-card)15
+b(will)g(indep)q(enden)o(tly)h(matc)o(h)d(an)o(ything,)h(but)f(in)h(con)o
+(trast)f(to)f(a)h(formal)g(parameter,)g(eac)o(h)h(will)h(bind)0
+1566 y(nothing;)g(for)g(this)h(reason)e(more)h(than)g(one)g(are)g(allo)o(w)o
+(ed)h(in)g(an)f(equation.)0 1713 y Fc(n)p Fi(+)p Fc(k-patterns.)45
+b Fp(There)21 b(is)h(one)f(other)f(kind)i(of)e Fo(r)n(efutable)h
+Fp(pattern)f(in)i(Hask)o(ell,)h(called)f(an)f Fo(n)p Fi(+)o
+Fo(k-p)n(attern)p Fp(,)0 1769 y(whic)o(h)15 b(is)g(useful)h(when)f(writing)g
+(inductiv)o(e)h(de\014nitions)g(o)o(v)o(er)e(in)o(tegers.)20
+b(F)l(or)13 b(example,)j(here's)e(a)g(de\014nition)i(of)0 1826
+y(an)f(in\014x)h(op)q(erator)f Fi(^)g Fp(that)f(raises)i(its)f(\014rst)g
+(argumen)o(t)f(to)h(the)g(p)q(o)o(w)o(er)g(indicated)i(b)o(y)e(the)g(second:)
+71 1935 y Fi(x)23 b(^)48 b(0)429 b(=)24 b(1)71 1991 y(x)f(^)h(\(n+1\))357
+b(=)24 b(x*\(x^n\))0 2103 y Fp(\(A)15 b(more)g(e\016cien)o(t)h(de\014nition)h
+(of)d Fi(^)h Fp(is)h(giv)o(en)g(in)g(the)f(Standard)g(Prelude.\))71
+2185 y(In)e(general,)h(the)f(pattern)g Fi(n+)p Fh(k)h Fp(matc)o(hes)f(an)o(y)
+g(in)o(teger)g(v)m(alue)i Fh(v)f Fn(\025)f Fh(k)q Fp(,)g(and)h(binds)g
+Fi(n)f Fp(to)g Fh(v)7 b Fn(\000)f Fh(k)q Fp(.)20 b(n)p Fi(+)p
+Fp(k-patterns)0 2241 y(ha)o(v)o(e)15 b(the)g(adv)m(an)o(tage)f(of)g(making)i
+(de\014nitions)g(suc)o(h)g(as)e(the)h(ab)q(o)o(v)o(e)g(lo)q(ok)g(v)o(ery)g
+(similar)h(to)e(the)h(corresp)q(onding)0 2298 y(mathematical)g(de\014nition:)
+858 2342 y Fh(x)884 2326 y Fm(0)945 2342 y Fp(=)42 b(1)809
+2399 y Fh(x)835 2382 y Fd(n)p Fm(+1)945 2399 y Fp(=)g Fh(x)10
+b Fn(\003)g Fh(x)1117 2382 y Fd(n)0 2482 y Fp(\(See)15 b Fn(x)q
+Fp(3.14)f(for)g(a)h(formal)g(translation)g(of)g(n)p Fi(+)p
+Fp(k-patterns)g(in)o(to)g(a)g(more)g(primitiv)o(e)h(form.\))p
+0 2525 780 2 v 37 2552 a Fl(11)69 2568 y Fk(Another)e(adv)n(an)o(tage)h(to)e
+(doing)i(this)g(is)f(that)f(a)h(naiv)o(e)h(implemen)o(tation)h(migh)o(t)f
+(completely)g(reconstruct)g Ff(x:xs)c Fk(rather)j(than)0 2614
+y(re-use)f(the)g(v)n(alue)i(b)q(eing)f(matc)o(hed)g(against.)p
+eop
+%%Page: 17 17
+bop 0 -40 a Fj(4.1)45 b(P)o(attern-Matc)o(hing)14 b(Seman)o(tics)1187
+b Fp(T-17)0 105 y Fg(4.1)56 b(P)n(attern-Matc)n(hing)19 b(Seman)n(tics)0
+220 y Fp(So)e(far)f(w)o(e)h(ha)o(v)o(e)f(discussed)j(ho)o(w)d(individual)k
+(patterns)c(are)h(matc)o(hed,)g(ho)o(w)f(some)h(are)f(refutable,)i(some)e
+(are)0 277 y(irrefutable,)i(etc.)26 b(But)17 b(what)g(driv)o(es)h(the)f(o)o
+(v)o(erall)g(pro)q(cess?)27 b(In)18 b(what)e(order)h(are)g(the)g(matc)o(hes)g
+(attempted?)0 333 y(What)e(if)g(none)h(succeed?)22 b(These)15
+b(are)g(the)g(questions)h(addressed)g(in)g(this)g(section.)71
+418 y(A)c(particular)g(matc)o(h)g(of)g(a)f(pattern)h(to)f(a)h(v)m(alue)i(can)
+e(actually)h(yield)g(one)g(of)e(three)h(results:)19 b Fo(failur)n(e)p
+Fp(;)13 b Fo(suc)n(c)n(ess)0 474 y Fp(\(returning)h(a)f(binding)i(for)d(eac)o
+(h)i(formal)f(parameter)f(in)i(the)g(pattern\);)f(or)f Fo(diver)n(genc)n(e)g
+Fp(\(i.e.)h(non)o(termination\).)0 531 y(The)i(matc)o(hing)h(pro)q(cess)f
+(itself)h(o)q(ccurs)g(\\top-do)o(wn,)e(left-to-righ)o(t.")20
+b(F)l(ailure)c(of)f(a)g(pattern)g(an)o(ywhere)g(in)h(one)0
+587 y(equation)c(results)g(in)g(failure)h(of)e(the)h(whole)g(equation,)h(and)
+e(the)h(next)g(equation)g(is)g(then)g(tried.)19 b(If)12 b(all)h(equations)0
+644 y(fail,)j(the)f(v)m(alue)h(of)f(the)g(function)h(application)h(is)f
+Fn(?)p Fp(,)f(and)h(results)f(in)h(a)f(run-time)h(error.)71
+728 y(F)l(or)i(example,)k(if)e Fi([1,2])e Fp(is)i(matc)o(hed)g(against)f
+Fi([0,bot])o Fp(,)h(then)g Fi(1)f Fp(fails)i(to)e(matc)o(h)g
+Fi(0)o Fp(,)i(so)e(the)g(result)h(is)0 785 y(a)f(failed)j(matc)o(h.)33
+b(But)19 b(if)i Fi([1,2])e Fp(is)h(matc)o(hed)g(against)f Fi([bot,0])o
+Fp(,)i(then)f(matc)o(hing)f Fi(1)h Fp(against)f Fi(bot)h Fp(causes)0
+841 y(div)o(ergence)c(\(i.e.)f Fn(?)p Fp(\).)71 926 y(The)d(only)h(other)f(t)
+o(wist)g(to)f(this)i(set)f(of)g(rules)h(is)g(that)e(top-lev)o(el)j(patterns)e
+(ma)o(y)f(also)i(ha)o(v)o(e)e(a)h(b)q(o)q(olean)i Fo(guar)n(d)p
+Fp(,)0 982 y(as)h(in)h(this)f(de\014nition)i(of)e(a)g(function)h(that)f
+(forms)f(an)h(abstract)f(v)o(ersion)i(of)f(a)f(n)o(um)o(b)q(er's)h(sign:)71
+1091 y Fi(sign)23 b(x)h(|)47 b(x)24 b(>)48 b(0)190 b(=)72 b(1)238
+1147 y(|)47 b(x)24 b(==)g(0)190 b(=)72 b(0)238 1204 y(|)47
+b(x)24 b(<)48 b(0)190 b(=)48 b(-1)0 1313 y Fp(Note)16 b(that)f(a)h(sequence)i
+(of)e(guards)g(ma)o(y)f(b)q(e)i(pro)o(vided)g(for)f(the)g(same)g(pattern;)g
+(as)g(with)g(patterns,)g(they)g(are)0 1370 y(ev)m(aluated)g(top-do)o(wn,)f
+(and)g(the)g(\014rst)g(that)g(ev)m(aluates)h(to)e Fi(True)h
+Fp(results)g(in)h(a)f(successful)i(matc)o(h.)0 1527 y Fg(4.2)56
+b(An)19 b(Example)0 1642 y Fp(The)i(pattern-matc)o(hing)f(rules)i(can)f(ha)o
+(v)o(e)f(subtle)h(e\013ects)g(on)f(the)h(meaning)g(of)f(functions.)37
+b(F)l(or)20 b(example,)0 1698 y(consider)c(this)g(de\014nition)h(of)e
+Fi(take)o Fp(:)71 1799 y Fi(take)47 b(0)119 b(_)262 b(=)48
+b([])71 1855 y(take)f(_)119 b([])238 b(=)48 b([])71 1912 y(take)23
+b(\(n+1\))g(\(x:xs\))166 b(=)48 b(x)24 b(:)f(take)h(n)f(xs)0
+2023 y Fp(and)15 b(this)h(sligh)o(tly)g(di\013eren)o(t)g(v)o(ersion)f(\(the)g
+(\014rst)g(2)g(equations)g(ha)o(v)o(e)g(b)q(een)i(rev)o(ersed\):)71
+2135 y Fi(take1)47 b(_)119 b([])214 b(=)48 b([])71 2191 y(take1)f(0)119
+b(_)238 b(=)48 b([])71 2248 y(take1)23 b(\(n+1\))g(\(x:xs\))142
+b(=)48 b(x)24 b(:)f(take1)h(n)f(xs)0 2357 y Fp(No)o(w)15 b(note)g(the)g
+(follo)o(wing:)698 2414 y Fi(take)47 b(0)24 b(bot)111 b Fn(\))87
+b Fi([])698 2470 y(take1)23 b(0)h(bot)111 b Fn(\))87 b(?)698
+2557 y Fi(take)47 b(bot)24 b([])87 b Fn(\))g(?)698 2613 y Fi(take1)23
+b(bot)h([])87 b Fn(\))g Fi([])p eop
+%%Page: 18 18
+bop 0 -40 a Fp(T-18)700 b Fj(4)45 b(CASE)15 b(EXPRESSIONS)i(AND)e(P)l(A)l
+(TTERN)h(MA)l(TCHING)0 105 y Fp(W)l(e)h(see)h(that)f Fi(take)g
+Fp(is)h(\\more)e(de\014ned")j(with)f(resp)q(ect)f(to)g(its)h(second)g
+(argumen)o(t,)e(whereas)i Fi(take1)e Fp(is)i(more)0 162 y(de\014ned)h(with)f
+(resp)q(ect)g(to)f(its)h(\014rst.)27 b(It)18 b(is)g(di\016cult)h(to)f(sa)o(y)
+f(in)h(this)g(case)g(whic)o(h)h(de\014nition)g(is)f(b)q(etter.)28
+b(Just)0 218 y(remem)o(b)q(er)16 b(that)f(in)i(certain)g(applications,)g(it)g
+(ma)o(y)e(mak)o(e)g(a)h(di\013erence.)24 b(\(The)15 b(Standard)h(Prelude)i
+(includes)0 274 y(a)d(de\014nition)i(corresp)q(onding)f(to)f
+Fi(take)o Fp(.\))0 423 y Fg(4.3)56 b(Case)19 b(Expressions)0
+535 y Fp(P)o(attern)d(matc)o(hing)h(pro)o(vides)g(a)g(w)o(a)o(y)e(to)i
+(\\dispatc)o(h)g(con)o(trol")f(based)h(on)g(structural)g(prop)q(erties)g(of)g
+(a)f(v)m(alue.)0 591 y(Ho)o(w)o(ev)o(er,)21 b(in)h(man)o(y)e(circumstances)i
+(w)o(e)f(don't)g(wish)g(to)f(de\014ne)j(a)d Fo(function)h Fp(ev)o(ery)g(time)
+g(w)o(e)g(need)h(to)e(do)0 648 y(this,)c(but)g(so)g(far)g(w)o(e)f(ha)o(v)o(e)
+h(only)g(sho)o(wn)g(ho)o(w)g(to)f(do)h(pattern)g(matc)o(hing)g(in)h(function)
+f(de\014nitions.)25 b(Hask)o(ell's)0 704 y Fo(c)n(ase)16 b(expr)n(ession)e
+Fp(pro)o(vides)i(a)f(w)o(a)o(y)g(to)f(solv)o(e)i(this)g(problem.)21
+b(Indeed,)c(the)f(meaning)g(of)f(pattern)g(matc)o(hing)g(in)0
+761 y(function)k(de\014nitions)i(is)e(sp)q(eci\014ed)h(in)g(the)e(Rep)q(ort)h
+(in)h(terms)e(of)g(case)g(expressions,)i(whic)o(h)f(are)g(considered)0
+817 y(more)c(primitiv)o(e.)21 b(In)16 b(particular,)f(a)g(function)h
+(de\014nition)h(of)e(the)g(form:)787 916 y Fi(f)h Fo(p)850
+923 y Fb(11)917 916 y Fh(:)8 b(:)g(:)22 b Fo(p)1017 923 y Fb(1k)1074
+916 y Fi(=)16 b Fo(e)1135 923 y Fb(1)787 973 y Fh(:)8 b(:)g(:)787
+1029 y Fi(f)16 b Fo(p)850 1036 y Fb(n1)919 1029 y Fh(:)8 b(:)g(:)22
+b Fo(p)1019 1036 y Fb(nk)1077 1029 y Fi(=)16 b Fo(e)1138 1036
+y Fb(n)0 1129 y Fp(where)f(eac)o(h)h Fo(p)257 1136 y Fb(ij)301
+1129 y Fp(is)g(a)e(pattern,)h(is)g(seman)o(tically)i(equiv)m(alen)o(t)g(to:)
+288 1232 y Fi(f)23 b(x1)h(x2)g Fh(:)8 b(:)g(:)21 b Fi(xk)j(=)g(case)f(\(x1,)
+31 b Fh(:)8 b(:)g(:)e Fi(,)23 b(xk\))h(of)c(\()p Fo(p)1240
+1239 y Fb(11)1283 1232 y Fh(;)k(:)8 b(:)g(:)d(;)24 b Fo(p)1440
+1239 y Fb(1k)1480 1232 y Fi(\))g(->)16 b Fo(e)1613 1239 y Fb(1)1193
+1288 y Fh(:)8 b(:)g(:)1193 1344 y Fi(\()p Fo(p)1240 1351 y
+Fb(n1)1285 1344 y Fh(;)24 b(:)8 b(:)g(:)d(;)24 b Fo(p)1442
+1351 y Fb(nk)1484 1344 y Fi(\))g(->)16 b Fo(e)1617 1351 y Fb(n)0
+1446 y Fp(where)f(the)g Fi(xi)f Fp(are)h(new)g(iden)o(ti\014ers.)21
+b(\(F)l(or)14 b(a)g(more)h(general)g(translation)g(that)f(includes)j(guards,)
+d(see)h Fn(x)p Fp(4.4.2.\))0 1503 y(F)l(or)g(example,)g(the)h(de\014nition)h
+(of)d Fi(take)h Fp(giv)o(en)h(earlier)g(is)f(equiv)m(alen)o(t)i(to:)71
+1612 y Fi(take)23 b(m)h(ys)357 b(=)24 b(case)f(\(m,ys\))g(of)739
+1668 y(\(0,_\))166 b(->)48 b([])739 1725 y(\(_,[]\))142 b(->)48
+b([])739 1781 y(\(n+1,x:xs\))e(->)i(x)23 b(:)h(take)f(n)h(xs)71
+1941 y Fp(A)13 b(p)q(oin)o(t)g(not)g(made)g(earlier)h(is)g(that,)f(for)f(t)o
+(yp)q(e)h(correctness,)g(the)h(t)o(yp)q(es)f(of)g(the)g(righ)o(t-hand)g
+(sides)h(of)f(a)g(case)0 1997 y(expression)h(or)e(set)h(of)f(equations)h
+(comprising)h(a)e(function)i(de\014nition)h(m)o(ust)d(all)i(b)q(e)f(the)g
+(same;)g(more)f(precisely)l(,)0 2054 y(they)j(m)o(ust)g(all)h(share)f(a)g
+(common)g(principal)i(t)o(yp)q(e.)71 2136 y(The)j(pattern-matc)o(hing)g
+(rules)g(for)g(case)g(expressions)h(are)e(the)h(same)g(as)g(w)o(e)g(ha)o(v)o
+(e)f(giv)o(en)i(for)e(function)0 2192 y(de\014nitions,)h(so)d(there)h(is)g
+(really)h(nothing)f(new)g(to)f(learn)h(here,)h(other)e(than)h(to)f(note)h
+(the)f(con)o(v)o(enience)j(that)0 2248 y(case)d(expressions)g(o\013er.)24
+b(Indeed,)19 b(there's)d(one)h(use)g(of)g(a)f(case)h(expression)h(that)e(is)h
+(so)f(common)h(that)f(it)h(has)0 2305 y(sp)q(ecial)k(syn)o(tax:)27
+b(the)19 b Fo(c)n(onditional)g(expr)n(ession)p Fp(.)31 b(In)20
+b(Hask)o(ell,)g(conditional)h(expressions)f(ha)o(v)o(e)f(the)g(familiar)0
+2361 y(form:)756 2419 y Fi(if)c Fh(e)840 2426 y Fm(1)875 2419
+y Fi(then)g Fh(e)1007 2426 y Fm(2)1042 2419 y Fi(else)g Fh(e)1174
+2426 y Fm(3)0 2503 y Fp(whic)o(h)h(is)g(really)g(short-hand)f(for:)724
+2557 y Fi(case)f Fh(e)855 2564 y Fm(1)890 2557 y Fi(of)41 b(True)48
+b(->)15 b Fh(e)1207 2564 y Fm(2)979 2613 y Fi(False)24 b(->)15
+b Fh(e)1207 2620 y Fm(3)p eop
+%%Page: 19 19
+bop 0 -40 a Fj(4.4)45 b(Lazy)15 b(P)o(atterns)1473 b Fp(T-19)0
+105 y(F)l(rom)15 b(this)g(expansion)i(it)e(should)i(b)q(e)f(clear)g(that)e
+Fh(e)900 112 y Fm(1)936 105 y Fp(m)o(ust)h(ha)o(v)o(e)g(t)o(yp)q(e)g
+Fi(Bool)o Fp(,)g(and)h Fh(e)1489 112 y Fm(2)1524 105 y Fp(and)g
+Fh(e)1634 112 y Fm(3)1669 105 y Fp(m)o(ust)f(ha)o(v)o(e)g(the)0
+162 y(same)e(\(but)g(otherwise)h(arbitrary\))e(t)o(yp)q(e.)19
+b(In)14 b(other)f(w)o(ords,)f Fi(if)p 1104 162 14 2 v 16 w(then)p
+1216 162 V 16 w(else)p 1327 162 V 29 w Fp(when)i(view)o(ed)g(as)f(a)g
+(function)h(has)0 218 y(t)o(yp)q(e)h Fi(Bool->a->a->a)n Fp(.)0
+365 y Fg(4.4)56 b(Lazy)18 b(P)n(atterns)0 476 y Fp(There)e(is)f(one)h(other)f
+(kind)h(of)f(pattern)g(allo)o(w)o(ed)h(in)g(Hask)o(ell.)21
+b(It)16 b(is)g(called)h(a)e Fo(lazy)h(p)n(attern)p Fp(,)e(and)i(has)f(the)h
+(form)0 533 y Fi(~)p Fh(pat)p Fp(.)28 b(Lazy)18 b(patterns)f(are)h
+Fo(irr)n(efutable)p Fp(:)25 b(matc)o(hing)18 b(a)f(v)m(alue)j
+Fh(v)f Fp(against)e Fi(~)p Fh(pat)h Fp(alw)o(a)o(ys)g(succeeds,)h(regardless)
+0 589 y(of)c Fh(pat)p Fp(.)20 b(Op)q(erationally)d(sp)q(eaking,)f(if)g(an)f
+(iden)o(ti\014er)i(in)f Fh(pat)f Fp(is)h(later)f(\\used")h(on)f(the)g(righ)o
+(t-hand-side,)i(it)e(will)0 646 y(b)q(e)g(b)q(ound)h(to)e(that)g(p)q(ortion)h
+(of)g(the)f(v)m(alue)i(that)f(w)o(ould)g(result)g(if)g Fh(v)h
+Fp(w)o(ere)f(to)f(successfully)j(matc)o(h)d Fh(pat)p Fp(,)h(and)g
+Fn(?)0 702 y Fp(otherwise.)71 784 y(Lazy)22 b(patterns)g(are)g(useful)i(in)f
+(con)o(texts)f(where)h(in\014nite)h(lists)g(are)e(b)q(eing)h(de\014ned)h
+(recursiv)o(ely)l(.)44 b(F)l(or)0 840 y(example,)16 b(in\014nite)h(lists)e
+(are)g(an)g(excellen)o(t)i(v)o(ehicle)g(for)e(writing)g Fo(simulation)g
+Fp(programs,)f(and)h(in)h(this)g(con)o(text)0 897 y(the)h(in\014nite)j(lists)
+e(are)f(often)g(called)i Fo(str)n(e)n(ams)p Fp(.)25 b(Consider)18
+b(the)g(simple)g(case)g(of)f(sim)o(ulating)h(the)g(in)o(teractions)0
+953 y(b)q(et)o(w)o(een)g(a)f(serv)o(er)g(pro)q(cess)h Fi(server)f
+Fp(and)g(a)h(clien)o(t)g(pro)q(cess)g Fi(client)o Fp(,)g(where)g
+Fi(client)e Fp(sends)i(a)g(sequence)g(of)0 1010 y Fo(r)n(e)n(quests)c
+Fp(to)h Fi(server)o Fp(,)g(and)g Fi(server)g Fp(replies)i(to)d(eac)o(h)i
+(request)f(with)h(some)f(kind)h(of)f Fo(r)n(esp)n(onse)p Fp(.)k(This)d
+(situation)0 1066 y(is)i(sho)o(wn)e(pictorially)j(in)f(Figure)f(1b,)g(just)g
+(as)f(w)o(e)h(did)h(with)g(the)f(Fib)q(onacci)h(example.)26
+b(\(Note)17 b(that)f Fi(client)0 1122 y Fp(also)g(tak)o(es)f(an)h(initial)i
+(message)d(as)h(argumen)o(t.\))21 b(Using)c(streams)e(to)g(sim)o(ulate)h(the)
+h(message)e(sequences,)i(the)0 1179 y(Hask)o(ell)f(co)q(de)g(corresp)q
+(onding)g(to)f(this)g(diagram)g(is:)71 1288 y Fi(reqs)500 b(=)24
+b(client)f(init)g(resps)71 1344 y(resps)476 b(=)24 b(server)f(reqs)0
+1453 y Fp(These)16 b(recursiv)o(e)f(equations)h(are)f(a)g(direct)h(lexical)h
+(transliteration)e(of)g(the)g(diagram.)71 1535 y(Let)g(us)g(further)g(assume)
+g(that)g(the)g(structure)g(of)g(the)g(serv)o(er)g(and)g(clien)o(t)i(lo)q(ok)e
+(something)h(lik)o(e)g(this:)71 1644 y Fi(client)23 b(init)g(\(resp:resps\))f
+(=)i(init)f(:)h(client)f(\(next)g(resp\))g(resps)71 1700 y(server)142
+b(\(req:reqs\))70 b(=)24 b(process)f(req)g(:)h(server)f(reqs)0
+1809 y Fp(where)18 b(w)o(e)g(assume)g(that)g Fi(next)f Fp(is)i(a)f(function)h
+(that,)f(giv)o(en)g(a)g(resp)q(onse)h(from)e(the)i(serv)o(er,)f(determines)h
+(the)0 1866 y(next)i(request,)g(and)g Fi(process)f Fp(is)h(a)g(function)g
+(that)f(pro)q(cesses)h(a)f(request)h(from)f(the)h(clien)o(t,)i(returning)e
+(an)0 1922 y(appropriate)15 b(resp)q(onse.)71 2004 y(Unfortunately)l(,)d
+(this)f(program)f(has)h(a)g(serious)h(problem:)18 b(it)12 b(will)h(not)e(pro)
+q(duce)h(an)o(y)e(output!)19 b(The)11 b(problem)0 2060 y(is)h(that)e
+Fi(client)o Fp(,)i(as)f(used)g(in)h(the)g(recursiv)o(e)g(setting)f(of)g
+Fi(reqs)f Fp(and)i Fi(resps)o Fp(,)f(attempts)g(a)f(matc)o(h)h(on)g(the)g
+(resp)q(onse)0 2117 y(list)18 b(b)q(efore)g(it)g(has)g(submitted)g(its)g
+(\014rst)f(request!)27 b(In)19 b(other)e(w)o(ords,)g(the)h(pattern)f(matc)o
+(hing)h(is)g(b)q(eing)h(done)0 2173 y(\\to)q(o)14 b(early)l(.")20
+b(One)c(w)o(a)o(y)f(to)f(\014x)h(this)h(is)g(to)e(rede\014ne)j
+Fi(client)d Fp(as)h(follo)o(ws:)71 2282 y Fi(client)23 b(init)g(resps)214
+b(=)24 b(init)f(:)h(client)f(\(next)g(\(head)g(resps\)\))g(\(tail)g(resps\))0
+2391 y Fp(Although)15 b(w)o(ork)m(able,)f(this)g(solution)h(do)q(es)g(not)e
+(read)h(as)g(w)o(ell)h(as)f(that)f(giv)o(en)i(earlier.)20 b(A)14
+b(b)q(etter)g(solution)h(is)g(to)0 2448 y(use)h(a)e(lazy)i(pattern:)71
+2557 y Fi(client)23 b(init)g(~\(resp:resps\))f(=)i(init)f(:)h(client)f
+(\(next)g(resp\))g(resps)p eop
+%%Page: 20 20
+bop 0 -40 a Fp(T-20)700 b Fj(4)45 b(CASE)15 b(EXPRESSIONS)i(AND)e(P)l(A)l
+(TTERN)h(MA)l(TCHING)0 105 y Fp(Because)22 b(lazy)h(patterns)e(are)g
+(irrefutable,)j(the)e(matc)o(h)f(will)j(immediately)f(succeed,)h(allo)o(wing)
+f(the)f(initial)0 162 y(request)17 b(to)f(b)q(e)i(\\submitted,")g(in)f(turn)g
+(allo)o(wing)h(the)f(\014rst)g(resp)q(onse)h(to)e(b)q(e)i(generated;)f(the)h
+(engine)g(is)f(no)o(w)0 218 y(\\primed,")e(and)h(the)f(recursion)h(tak)o(es)e
+(care)h(of)g(the)g(rest.)71 306 y(As)g(an)g(example)h(of)f(this)g(program)f
+(in)i(action,)f(if)h(w)o(e)f(de\014ne:)71 415 y Fi(init)476
+b(=)24 b(0)71 472 y(next)f(resp)357 b(=)24 b(resp)71 528 y(process)e(req)310
+b(=)24 b(req+1)0 637 y Fp(then)16 b(w)o(e)e(see)i(that:)485
+704 y Fi(take)24 b(10)f(reqs)73 b Fn(\))h Fi([0,1,2,3,4,5,6,7,8,9])71
+830 y Fp(The)13 b(serv)o(er/clien)o(t)h(example)g(w)o(as)e(delib)q(erately)k
+(c)o(hosen)d(to)f(demonstrate)h(a)g(t)o(ypical)h(use)f(of)g(lazy)g(patterns)0
+887 y(and)19 b(streams,)f(and)g(also)h(to)f(aid)h(the)f(user)h(in)o(terested)
+g(in)g(using)h(Hask)o(ell's)f Fo(str)n(e)n(am-b)n(ase)n(d)f(I/O)p
+Fp(,)g(in)h(whic)o(h)g(a)0 943 y(Hask)o(ell)14 b(program)f(is)g(essen)o
+(tially)i(the)f(clien)o(t,)g(with)g(the)g(op)q(erating)f(system)g(acting)h
+(as)f(serv)o(er)g(\()p Fn(x)p Fp(7\).)18 b(Although)0 1000
+y(in)d(this)g(tutorial)f(w)o(e)g(will)i(only)f(discuss)g Fo(c)n
+(ontinuation-b)n(ase)n(d)g(I/O)f Fp(\(see)g(Section)h(8\),)e(the)i
+(stream-based)f(alter-)0 1056 y(nativ)o(e)j(is)h(an)f(excellen)o(t)i(example)
+f(of)e(the)h(use)h(of)e(lazy)i(patterns)f(and)g(streams.)24
+b(Indeed,)19 b(the)e(stream-based)0 1113 y(I/O)f(example)g(in)g(the)f(Rep)q
+(ort)h(uses)f(lazy)h(patterns.)71 1201 y(As)11 b(another)g(example)i(of)e
+(the)h(use)g(of)f(lazy)h(patterns,)g(consider)h(the)e(de\014nition)j(of)d
+(Fib)q(onacci)i(giv)o(en)f(earlier:)71 1310 y Fi(fib)309 b(=)24
+b(1)g(:)g(1)f(:)h([)g(a+b)f(|)h(\(a,b\))f(<-)h(zip)f(fib)h(\(tail)f(fib\))g
+(])0 1419 y Fp(W)l(e)15 b(migh)o(t)g(try)g(rewriting)h(this)f(using)h(an)f
+(as-pattern:)71 1528 y Fi(fib@\(1:tfib\))70 b(=)23 b(1)h(:)g(1)f(:)h([)g(a+b)
+f(|)h(\(a,b\))f(<-)h(zip)f(fib)h(tfib)f(])0 1639 y Fp(This)16
+b(v)o(ersion)g(of)f Fi(fib)g Fp(has)h(the)f(\(small)h(adv)m(an)o(tage\))f(of)
+g(not)g(using)i Fi(tail)e Fp(on)g(the)h(righ)o(t-hand)g(side,)g(since)h(it)e
+(is)0 1696 y(a)o(v)m(ailable)i(in)f(\\destructured")f(form)f(on)i(the)f
+(left-hand)h(side)g(as)f Fi(tfib)o Fp(.)71 1784 y([This)f(kind)h(of)f
+(equation)g(is)h(called)h(a)e Fo(p)n(attern)h(binding)e Fp(b)q(ecause)i(it)g
+(is)f(a)g(top-lev)o(el)h(equation)g(in)g(whic)o(h)g(the)0 1840
+y(en)o(tire)k(left-hand)g(side)g(is)g(a)f(pattern;)h(i.e.)f(b)q(oth)g
+Fi(fib)g Fp(and)h Fi(tfib)e Fp(b)q(ecome)i(b)q(ound)g(within)h(the)e(scop)q
+(e)h(of)f(the)0 1897 y(declaration.])71 1985 y(No)o(w,)12 b(using)h(the)g
+(same)g(reasoning)g(w)o(e)f(did)i(earlier,)g(w)o(e)f(should)h(b)q(e)f(led)h
+(to)e(b)q(eliev)o(e)j(that)d(this)i(program)d(will)0 2041 y(not)j(generate)h
+(an)o(y)f(output.)19 b(Curiously)l(,)d(ho)o(w)o(ev)o(er,)d(it)i
+Fo(do)n(es)p Fp(,)f(and)h(the)f(reason)h(is)g(simple:)21 b(in)15
+b(Hask)o(ell,)g(pattern)0 2098 y(bindings)i(are)e(assumed)g(to)f(ha)o(v)o(e)h
+(an)f(implicit)k Fi(~)d Fp(in)h(fron)o(t)e(of)g(them,)h(re\015ecting)h(the)f
+(most)f(common)g(b)q(eha)o(vior)0 2154 y(exp)q(ected)h(of)f(pattern)g
+(bindings,)i(and)e(a)o(v)o(oiding)h(some)f(anomalous)g(situations)g(whic)o(h)
+h(are)f(b)q(ey)o(ond)h(the)f(scop)q(e)0 2211 y(of)f(this)h(tutorial.)19
+b(Th)o(us)14 b(w)o(e)f(see)h(that)e(lazy)i(patterns)f(pla)o(y)h(an)g(imp)q
+(ortan)o(t)f(role)g(in)i(Hask)o(ell,)f(if)g(only)g(implicitly)l(.)0
+2380 y Fg(4.5)56 b(Lexical)16 b(Scoping)j(and)g(Nested)f(F)-5
+b(orms)0 2501 y Fp(It)14 b(is)h(often)f(desirable)i(to)e(create)g(a)g(nested)
+h(scop)q(e)g(within)g(an)f(expression,)h(for)f(the)g(purp)q(ose)h(of)f
+(creating)h(lo)q(cal)0 2557 y(bindings)i(not)f(seen)g(elsewhere|i.e.)23
+b(some)15 b(kind)h(of)g(\\blo)q(c)o(k-structuring")g(form.)k(In)c(Hask)o(ell)
+g(there)g(are)f(t)o(w)o(o)0 2614 y(w)o(a)o(ys)f(to)h(ac)o(hiev)o(e)g(this:)p
+eop
+%%Page: 21 21
+bop 0 -40 a Fj(4.6)45 b(La)o(y)o(out)1614 b Fp(T-21)0 105 y
+Fc(Let)23 b(Expressions.)44 b Fp(Hask)o(ell's)19 b Fo(let)h(expr)n(essions)d
+Fp(are)i(useful)h(whenev)o(er)g(a)e(nested)i(set)f(of)f(bindings)j(is)f(re-)0
+162 y(quired.)h(As)15 b(a)g(simple)i(example,)e(consider:)71
+271 y Fi(let)23 b(y)71 b(=)24 b(a*b)166 327 y(f)g(x)f(=)h(\(x+y\)/y)71
+383 y(in)f(f)h(c)g(+)f(f)h(d)0 493 y Fp(The)19 b(set)g(of)f(bindings)j
+(created)e(b)o(y)g(a)g Fi(let)f Fp(expression)i(is)f Fo(mutual)r(ly)i(r)n(e)n
+(cursive)p Fp(,)e(and)g(pattern)f(bindings)j(are)0 549 y(treated)c(as)g(lazy)
+i(patterns)e(\(i.e.)27 b(they)18 b(carry)f(an)h(implicit)i
+Fi(~)p Fp(\).)27 b(The)18 b(only)g(kind)h(of)e(declarations)h(p)q(ermitted)0
+605 y(are)d Fo(typ)n(e)h(signatur)n(es)p Fp(,)e Fo(function)i(bindings)p
+Fp(,)d(and)j Fo(p)n(attern)g(bindings)p Fp(.)0 780 y Fc(Where)j(Clauses.)45
+b Fp(Sometimes)18 b(it)f(is)h(con)o(v)o(enien)o(t)g(to)e(scop)q(e)i(bindings)
+h(o)o(v)o(er)d(sev)o(eral)i(guarded)f(equations,)0 836 y(whic)o(h)f(requires)
+g(a)f Fo(wher)n(e)h(clause)p Fp(:)71 945 y Fi(f)23 b(x)h(y)48
+b(|)f(y>z)262 b(=)48 b(...)238 1001 y(|)f(y==z)238 b(=)48 b(...)238
+1058 y(|)f(y<z)262 b(=)48 b(...)643 1114 y(where)23 b(z)h(=)g(x*x)0
+1224 y Fp(Note)14 b(that)h(this)g(cannot)f(b)q(e)i(done)f(with)g(a)g
+Fi(let)f Fp(expression,)h(whic)o(h)h(only)f(scop)q(es)h(o)o(v)o(er)e(the)g
+(expression)i(whic)o(h)0 1280 y(it)f(encloses.)20 b(A)15 b
+Fi(where)f Fp(clause)h(is)g(only)g(allo)o(w)o(ed)g(at)f(the)h(top)f(lev)o(el)
+i(of)e(a)g(set)g(of)g(equations)h(or)f(case)g(expression.)0
+1336 y(The)e(same)g(prop)q(erties)g(and)g(constrain)o(ts)g(on)g(bindings)h
+(in)g Fi(let)e Fp(expressions)i(apply)g(to)e(those)h(in)g Fi(where)g
+Fp(clauses.)71 1426 y(These)k(t)o(w)o(o)f(forms)g(of)h(nested)h(scop)q(e)f
+(seem)h(v)o(ery)e(similar,)j(but)e(remem)o(b)q(er)g(that)g(a)g
+Fi(let)f Fp(expression)i(is)g(an)0 1483 y Fo(expr)n(ession)p
+Fp(,)12 b(whereas)h(a)g Fi(where)f Fp(clause)i(is)g(not|it)f(is)h(part)e(of)h
+(the)g(syn)o(tax)f(of)h(function)h(declarations)g(and)f(case)0
+1539 y(expressions.)0 1715 y Fg(4.6)56 b(La)n(y)n(out)0 1839
+y Fp(The)15 b(reader)g(ma)o(y)f(ha)o(v)o(e)h(b)q(een)g(w)o(ondering)h(ho)o(w)
+e(it)h(is)h(that)e(Hask)o(ell)h(programs)f(a)o(v)o(oid)h(the)g(use)g(of)f
+(semicolons,)0 1895 y(or)e(some)h(other)f(kind)i(of)e(line)i(terminator,)e
+(to)g(mark)g(the)h(end)g(of)g(equations,)g(declarations,)g(etc.)19
+b(F)l(or)12 b(example,)0 1952 y(consider)k(this)g Fi(let)f
+Fp(expression)h(from)e(the)h(last)g(section:)71 2061 y Fi(let)23
+b(y)71 b(=)24 b(a*b)166 2117 y(f)g(x)f(=)h(\(x+y\)/y)71 2174
+y(in)f(f)h(c)g(+)f(f)h(d)0 2283 y Fp(Ho)o(w)15 b(do)q(es)g(the)g(parser)g
+(kno)o(w)g(not)g(to)f(parse)h(this)h(as:)71 2392 y Fi(let)23
+b(y)71 b(=)24 b(a*b)g(f)166 2448 y(x)71 b(=)24 b(\(x+y\)/y)71
+2504 y(in)f(f)h(c)g(+)f(f)h(d)0 2614 y Fp(?)p eop
+%%Page: 22 22
+bop 0 -40 a Fp(T-22)771 b Fj(5)45 b(TYPE)15 b(CLASSES,)h(O)o(VERLO)o(ADING,)g
+(AND)f(\\OOP")71 105 y Fp(The)j(answ)o(er)f(is)i(that)e(Hask)o(ell)i(uses)f
+(a)g(t)o(w)o(o-dimensional)h(syn)o(tax)e(called)i Fo(layout)g
+Fp(that)e(essen)o(tially)j(relies)0 162 y(on)e(declarations)h(b)q(eing)h
+(\\lined)g(up)f(in)g(columns.")30 b(In)19 b(the)f(ab)q(o)o(v)o(e)g(example,)i
+(note)e(that)g Fi(y)g Fp(and)g Fi(f)g Fp(b)q(egin)i(in)0 218
+y(the)d(same)g(column.)27 b(The)17 b(rules)h(for)e(la)o(y)o(out)h(are)g(sp)q
+(elled)i(out)e(in)h(detail)g(in)g(the)f(Rep)q(ort)h(\()p Fn(x)p
+Fp(1.5,)p Fn(x)n Fp(B.4\),)f(but)g(in)0 274 y(practice,)e(use)h(of)f(la)o(y)o
+(out)f(is)i(rather)f(in)o(tuitiv)o(e.)21 b(Just)15 b(remem)o(b)q(er)h(t)o(w)o
+(o)e(things:)71 358 y(First,)j(the)g(next)g(c)o(haracter)g(follo)o(wing)h(an)
+o(y)f(of)g(the)g(k)o(eyw)o(ords)f Fi(where)p Fp(,)h Fi(let)p
+Fp(,)g(or)g Fi(of)g Fp(is)g(what)g(determines)0 415 y(the)c(starting)f
+(column)i(for)e(the)h(declarations)h(in)g(the)f(where,)g(let,)g(or)g(case)g
+(expression)g(b)q(eing)i(written)d(\(the)h(rule)0 471 y(also)i(applies)i(to)d
+Fi(where)g Fp(used)i(in)g(the)f(class)h(and)f(instance)h(declarations)f(to)g
+(b)q(e)h(de\014ned)g(in)g(Section)g(5\).)j(Th)o(us)0 528 y(w)o(e)c(can)g(b)q
+(egin)i(the)e(declarations)h(on)f(the)g(same)g(line)i(as)e(the)g(k)o(eyw)o
+(ord,)f(the)h(next)h(line,)g(etc.)71 612 y(Second,)h(just)f(b)q(e)h(sure)f
+(that)g(the)g(starting)g(column)h(is)g(further)f(to)g(the)h(righ)o(t)f(than)g
+(the)g(starting)g(column)0 668 y(asso)q(ciated)f(with)g(the)g(immediately)i
+(surrounding)f(clause)g(\(otherwise)f(it)g(w)o(ould)g(b)q(e)h(am)o
+(biguous\).)j(The)c(\\ter-)0 725 y(mination")e(of)f(a)h(declaration)g(happ)q
+(ens)h(when)f(something)g(app)q(ears)g(at)f(or)g(to)g(the)h(left)g(of)f(the)h
+(starting)f(column)0 781 y(asso)q(ciated)j(with)h(that)e(binding)k(form.)689
+765 y Fm(12)71 865 y Fp(La)o(y)o(out)e(is)h(actually)h(shorthand)f(for)g(an)g
+Fo(explicit)f Fp(grouping)i(mec)o(hanism,)g(whic)o(h)f(deserv)o(es)h(men)o
+(tion)f(b)q(e-)0 921 y(cause)e(it)h(can)f(b)q(e)h(useful)g(under)g(certain)g
+(circumstances.)21 b(The)15 b Fi(let)g Fp(example)h(ab)q(o)o(v)o(e)f(is)g
+(equiv)m(alen)o(t)i(to:)71 1030 y Fi(let)23 b({)h(y)71 b(=)24
+b(a*b;)214 1087 y(f)f(x)h(=)g(\(x+y\)/y)f(})71 1143 y(in)g(f)h(c)g(+)f(f)h(d)
+0 1252 y Fp(Note)15 b(the)h(explicit)i(curly)e(braces)g(and)g(semicolons.)22
+b(One)16 b(w)o(a)o(y)f(in)h(whic)o(h)h(this)f(explicit)h(notation)f(is)g
+(useful)g(is)0 1309 y(when)g(more)e(than)i(one)f(declaration)h(is)g(desired)g
+(on)f(a)g(line;)h(for)f(example,)h(this)f(is)h(a)f(v)m(alid)i(expression:)71
+1418 y Fi(let)23 b(y)71 b(=)24 b(a*b;)47 b(z)24 b(=)g(a/b)166
+1474 y(f)g(x)f(=)h(\(x+y\)/z)71 1531 y(in)f(f)h(c)g(+)f(f)h(d)0
+1640 y Fp(F)l(or)15 b(another)f(example)i(of)f(the)g(expansion)i(of)d(la)o(y)
+o(out)h(in)o(to)g(explicit)i(delimiters,)g(see)f Fn(x)p Fp(1.5.)71
+1724 y(The)i(use)h(of)e(la)o(y)o(out)h(greatly)g(reduces)h(the)f(syn)o
+(tactic)g(clutter)h(asso)q(ciated)f(with)h(declaration)g(lists,)g(th)o(us)0
+1780 y(enhancing)e(readabilit)o(y)l(.)k(It)15 b(is)h(easy)f(to)f(learn,)i
+(and)f(its)h(use)f(is)h(encouraged.)0 1957 y Fq(5)69 b(T)n(yp)r(e)23
+b(Classes,)f(Ov)n(erloading,)g(and)i(\\OOP")0 2087 y Fp(There)17
+b(is)g(one)f(\014nal)i(feature)e(of)g(Hask)o(ell's)h(t)o(yp)q(e)g(system)f
+(that)g(sets)g(it)h(apart)e(from)h(other)g(languages,)h(and)f(is)0
+2144 y(probably)h(the)f(most)f(inno)o(v)m(ativ)o(e)i(asp)q(ect)f(of)g(Hask)o
+(ell's)g(design.)24 b(The)16 b(kind)h(of)f(p)q(olymorphism)h(that)f(w)o(e)f
+(ha)o(v)o(e)0 2200 y(talk)o(ed)g(ab)q(out)h(so)e(far)h(is)h(commonly)f
+(called)i Fo(p)n(ar)n(ametric)f Fp(p)q(olymorphism.)21 b(There)16
+b(is)f(another)g(kind)i(called)g Fo(ad)0 2256 y(ho)n(c)c Fp(p)q(olymorphism,)
+i(b)q(etter)f(kno)o(wn)f(as)g Fo(overlo)n(ading)p Fp(.)19 b(Here)13
+b(are)h(some)f(examples)h(of)f(ad)g(ho)q(c)h(p)q(olymorphism:)68
+2382 y Fn(\017)23 b Fp(The)15 b(literals)h Fi(1)p Fp(,)f Fi(2)p
+Fp(,)f(etc.)20 b(are)15 b(often)g(used)g(to)g(represen)o(t)g(b)q(oth)g
+(\014xed)h(and)f(arbitrary)g(precision)h(in)o(tegers.)68 2480
+y Fn(\017)23 b Fp(Numeric)16 b(op)q(erators)e(suc)o(h)i(as)e
+Fi(+)h Fp(are)g(often)g(de\014ned)i(to)d(w)o(ork)h(on)g(man)o(y)f(di\013eren)
+o(t)i(kinds)g(of)f(n)o(um)o(b)q(ers.)p 0 2525 780 2 v 37 2552
+a Fl(12)69 2568 y Fk(Hask)o(ell)e(observ)o(es)g(the)f(con)o(v)o(en)o(tion)h
+(that)f(tabs)g(coun)o(t)h(as)e(8)h(blanks;)h(th)o(us)g(care)e(m)o(ust)h(b)q
+(e)g(tak)o(en)g(when)g(using)h(an)f(editor)h(whic)o(h)0 2614
+y(ma)o(y)g(observ)o(e)h(some)f(other)h(con)o(v)o(en)o(tion.)p
+eop
+%%Page: 23 23
+bop 1857 -40 a Fp(T-23)68 105 y Fn(\017)23 b Fp(The)13 b(equalit)o(y)h(op)q
+(erator)e(\()p Fi(==)g Fp(in)i(Hask)o(ell\))g(usually)g(w)o(orks)e(on)h(n)o
+(um)o(b)q(ers)g(and)h(man)o(y)e(other)h(\(but)g(not)f(all\))114
+162 y(t)o(yp)q(es.)0 264 y(Note)i(that)g(these)h(o)o(v)o(erloaded)f(b)q(eha)o
+(viors)h(are)g Fo(di\013er)n(ent)f Fp(for)g(eac)o(h)g(t)o(yp)q(e)h(\(in)g
+(fact)f(the)h(b)q(eha)o(vior)g(is)g(sometimes)0 320 y(unde\014ned,)g(or)f
+(error\),)e(whereas)i(in)g(parametric)g(p)q(olymorphism)g(the)g(t)o(yp)q(e)g
+(truly)g(do)q(es)g(not)f(matter)g(\()p Fi(fringe)n Fp(,)0 377
+y(for)f(example,)i(really)g(do)q(esn't)f(care)g(what)g(kind)h(of)f(elemen)o
+(ts)g(are)g(found)g(in)h(the)g(lea)o(v)o(es)f(of)f(a)h(tree\).)19
+b(In)13 b(Hask)o(ell,)0 433 y Fo(typ)n(e)j(classes)e Fp(pro)o(vide)i(a)e
+(structured)i(w)o(a)o(y)e(to)g(con)o(trol)h(ad)g(ho)q(c)h(p)q(olymorphism,)g
+(or)f(o)o(v)o(erloading.)71 510 y(Let's)d(start)g(with)i(a)e(simple,)j(but)e
+(imp)q(ortan)o(t,)g(example:)19 b Fo(e)n(quality)p Fp(.)g(There)14
+b(are)e(man)o(y)h(t)o(yp)q(es)g(for)f(whic)o(h)i(w)o(e)0 566
+y(w)o(ould)f(lik)o(e)h(equalit)o(y)g(de\014ned,)g(but)f(some)f(for)g(whic)o
+(h)i(w)o(e)f(w)o(ould)g(not.)18 b(F)l(or)13 b(example,)g(comparing)g(the)g
+(equalit)o(y)0 623 y(of)g(functions)g(is)h(generally)g(considered)h
+(computationally)f(in)o(tractable,)f(whereas)g(w)o(e)g(often)g(w)o(an)o(t)f
+(to)g(compare)0 679 y(t)o(w)o(o)j(lists)i(for)e(equalit)o(y)l(.)418
+663 y Fm(13)480 679 y Fp(T)l(o)h(highligh)o(t)h(the)g(issue,)g(consider)g
+(this)f(de\014nition)i(of)e(the)g(function)h Fi(elem)f Fp(whic)o(h)0
+736 y(tests)f(for)f(mem)o(b)q(ership)j(in)f(a)e(list:)71 845
+y Fi(x)23 b(`elem`)47 b([])286 b(=)24 b(False)71 901 y(x)f(`elem`)g(\(y:ys\))
+214 b(=)24 b(x==y)f(||)h(\(x)g(`elem`)f(ys\))0 1013 y Fp([F)l(or)16
+b(the)h(st)o(ylistic)h(reason)f(w)o(e)f(discussed)j(in)f(Section)g(3.1,)e(w)o
+(e)g(ha)o(v)o(e)h(c)o(hosen)g(to)g(de\014ne)h Fi(elem)e Fp(in)i(in\014x)g
+(form.)0 1069 y Fi(==)d Fp(and)g Fi(||)g Fp(are)g(the)g(in\014x)i(op)q
+(erators)d(for)g(equalit)o(y)i(and)g(logical)g(or,)e(resp)q(ectiv)o(ely)l(.])
+0 1146 y(In)o(tuitiv)o(ely)h(sp)q(eaking,)f(the)g(t)o(yp)q(e)f(of)g
+Fi(elem)g Fp(\\ough)o(t")f(to)g(b)q(e:)20 b Fi(a->[a]->Bool)n
+Fp(.)f(But)14 b(this)f(w)o(ould)h(imply)h(that)d Fi(==)0 1202
+y Fp(has)i(t)o(yp)q(e)g Fi(a->a->Bool)n Fp(,)g(ev)o(en)g(though)g(w)o(e)g
+(just)f(said)i(that)e(w)o(e)h(don't)f(exp)q(ect)i Fi(==)e Fp(to)g(b)q(e)i
+(de\014ned)g(for)e(all)i(t)o(yp)q(es.)71 1279 y(F)l(urthermore,)20
+b(as)g(w)o(e)f(ha)o(v)o(e)h(noted)g(earlier,)i(ev)o(en)e(if)h
+Fi(==)f Fo(wer)n(e)g Fp(de\014ned)h(on)f(all)h(t)o(yp)q(es,)g(comparing)f(t)o
+(w)o(o)0 1335 y(lists)e(for)e(equalit)o(y)i(is)g Fo(very)g(di\013er)n(ent)e
+Fp(from)h(comparing)g(t)o(w)o(o)f(in)o(tegers.)25 b(In)18 b(this)g(sense,)f
+(w)o(e)g(exp)q(ect)h Fi(==)f Fp(to)f(b)q(e)0 1392 y Fo(overlo)n(ade)n(d)f
+Fp(to)g(carry)f(on)i(these)f(v)m(arious)h(tasks.)71 1468 y
+Fo(T)m(yp)n(e)h(classes)f Fp(con)o(v)o(enien)o(tly)j(solv)o(e)f(b)q(oth)g(of)
+f(these)h(problems)g(b)o(y)g(allo)o(wing)h(us)f(to)f(declare)h(whic)o(h)h(t)o
+(yp)q(es)0 1525 y(are)13 b Fo(instanc)n(es)e Fp(of)i(whic)o(h)i(class,)e(and)
+h(to)f(pro)o(vide)g(de\014nitions)j(of)c(the)i(o)o(v)o(erloaded)f
+Fo(op)n(er)n(ations)g Fp(asso)q(ciated)h(with)0 1581 y(a)h(class.)20
+b(F)l(or)15 b(example,)g(let's)h(de\014ne)g(a)f(t)o(yp)q(e)g(class)h(con)o
+(taining)g(an)f(equalit)o(y)h(op)q(erator:)71 1690 y Fi(class)23
+b(Eq)g(a)h(where)118 1747 y(\(==\))429 b(::)24 b(a)g(->)f(a)h(->)g(Bool)0
+1856 y Fp(Here)18 b Fi(Eq)g Fp(is)g(the)g(name)g(of)f(the)h(class)h(b)q(eing)
+g(de\014ned,)g(and)f Fi(==)g Fp(is)g(the)g(single)h(op)q(eration)f(in)h(the)f
+(class.)28 b(This)0 1912 y(declaration)13 b(ma)o(y)f(b)q(e)h(read)g(\\a)f(t)o
+(yp)q(e)g Fi(a)h Fp(is)g(an)f(instance)i(of)e(the)h(class)f
+Fi(Eq)h Fp(if)g(there)f(is)h(an)g(\(o)o(v)o(erloaded\))f(op)q(eration)0
+1969 y Fi(==)p Fp(,)i(of)g(the)h(appropriate)g(t)o(yp)q(e,)f(de\014ned)i(on)f
+(it.")20 b(\(Note)14 b(that)g Fi(==)g Fp(is)h(only)h(de\014ned)g(on)e(pairs)h
+(of)g(ob)s(jects)f(of)g(the)0 2025 y(same)h(t)o(yp)q(e.\))71
+2102 y(The)i(constrain)o(t)f(that)h(a)f(t)o(yp)q(e)i Fi(a)e
+Fp(m)o(ust)h(b)q(e)h(an)f(instance)g(of)g(the)g(class)g Fi(Eq)g
+Fp(is)h(written)f Fi(Eq)23 b(a)p Fp(.)j(Th)o(us)17 b Fi(Eq)23
+b(a)0 2158 y Fp(is)c(not)g(a)g(t)o(yp)q(e)g(expression,)h(but)f(rather)f(it)i
+(expresses)f(a)g(constrain)o(t)f(on)h(a)g(t)o(yp)q(e,)g(and)g(is)h(called)g
+(a)f Fo(c)n(ontext)p Fp(.)0 2215 y(Con)o(texts)14 b(are)h(app)q(ended)i(to)e
+(the)g(fron)o(t)f(of)h(t)o(yp)q(e)h(expressions.)21 b(F)l(or)14
+b(example,)i(the)f(e\013ect)g(of)g(the)h(ab)q(o)o(v)o(e)f(class)0
+2271 y(declaration)h(is)g(to)e(assign)i(the)f(follo)o(wing)h(t)o(yp)q(e)f(to)
+g Fi(==)o Fp(:)71 2380 y Fi(\(==\))476 b(::)24 b(\(Eq)f(a\))h(=>)g(a)f(->)h
+(a)g(->)f(Bool)p 0 2480 780 2 v 37 2506 a Fl(13)69 2522 y Fk(The)15
+b(kind)h(of)e(equalit)o(y)j(w)o(e)d(are)h(referring)h(to)f(here)g(is)g(\\v)n
+(alue)h(equalit)o(y)m(,")h(and)e(opp)q(osed)i(to)d(the)h(\\p)q(oin)o(ter)h
+(equalit)o(y")h(found,)0 2568 y(for)f(example,)h(in)g(Lisp's)g
+Ff(eq)o Fk(.)26 b(P)o(oin)o(ter)17 b(equalit)o(y)h(is)e(not)h(referen)o
+(tially)h(transparen)o(t,)g(and)e(th)o(us)h(do)q(es)f(not)g(sit)h(w)o(ell)g
+(in)f(a)g(purely)0 2614 y(functional)f(language.)p eop
+%%Page: 24 24
+bop 0 -40 a Fp(T-24)771 b Fj(5)45 b(TYPE)15 b(CLASSES,)h(O)o(VERLO)o(ADING,)g
+(AND)f(\\OOP")0 105 y Fp(This)e(should)g(b)q(e)g(read,)f(\\F)l(or)f(ev)o(ery)
+i(t)o(yp)q(e)f Fi(a)g Fp(that)f(is)i(an)f(instance)h(of)f(the)g(class)h
+Fi(Eq)o Fp(,)g Fi(==)f Fp(has)g(t)o(yp)q(e)g Fi(a->a->Bool)o
+Fp(.")0 162 y(This)i(is)g(the)g(t)o(yp)q(e)f(that)g(w)o(ould)h(b)q(e)g(used)h
+(for)e Fi(==)g Fp(in)h(the)g Fi(elem)f Fp(example,)h(and)g(indeed)h(the)f
+(constrain)o(t)f(imp)q(osed)0 218 y(b)o(y)i(the)g(con)o(text)g(propagates)f
+(to)h(the)g(principal)j(t)o(yp)q(e)d(for)f Fi(elem)p Fp(:)71
+327 y Fi(elem)476 b(::)24 b(\(Eq)f(a\))h(=>)g(a)f(->)h([a])f(->)h(Bool)0
+436 y Fp(This)11 b(should)g(b)q(e)g(read,)f(\\F)l(or)g(ev)o(ery)g(t)o(yp)q(e)
+g Fi(a)g Fp(that)f(is)i(an)f(instance)h(of)f(the)g(class)g
+Fi(Eq)p Fp(,)h Fi(elem)e Fp(has)i(t)o(yp)q(e)f Fi(a->[a]->Bool)n
+Fp(.")0 493 y(This)18 b(is)f(just)g(what)f(w)o(e)h(w)o(an)o(t|it)g(expresses)
+g(the)g(fact)g(that)f Fi(elem)g Fp(is)i(not)e(de\014ned)j(on)e
+Fo(al)r(l)f Fp(t)o(yp)q(es,)i(just)e(those)0 549 y(for)f(whic)o(h)h(w)o(e)f
+(kno)o(w)f(ho)o(w)h(to)f(compare)h(its)h(elemen)o(ts)g(for)e(equalit)o(y)l(.)
+71 625 y(So)f(far)h(so)f(go)q(o)q(d.)19 b(But)14 b(ho)o(w)g(do)f(w)o(e)h(sp)q
+(ecify)h(whic)o(h)g(t)o(yp)q(es)f(are)f(instances)i(of)e(the)h(class)g
+Fi(Eq)p Fp(,)g(and)g(the)g(actual)0 682 y(b)q(eha)o(vior)i(of)f
+Fi(==)f Fp(on)i(eac)o(h)f(of)g(those)f(t)o(yp)q(es?)21 b(This)16
+b(is)g(done)f(with)h(an)f Fo(instanc)n(e)g(de)n(clar)n(ation)p
+Fp(.)k(F)l(or)c(example:)71 791 y Fi(instance)22 b(Eq)i(Int)f(where)118
+847 y(x)h(==)g(y)381 b(=)48 b(intEq)23 b(x)h(y)0 956 y Fp(The)15
+b(de\014nition)h(of)e Fi(==)g Fp(is)i(called)g(a)e Fo(metho)n(d)p
+Fp(.)20 b Fi(intEq)14 b Fp(happ)q(ens)h(to)f(b)q(e)i(the)e(primitiv)o(e)i
+(function)f(that)f(compares)0 1013 y(in)o(tegers)i(for)g(equalit)o(y)l(,)h
+(but)f(in)h(general)g(an)o(y)f(v)m(alid)h(expression)g(is)g(allo)o(w)o(ed)g
+(on)f(the)g(righ)o(t-hand)h(side,)f(just)g(as)0 1069 y(for)e(an)o(y)f(other)h
+(function)h(de\014nition.)21 b(The)15 b(o)o(v)o(erall)f(declaration)h(is)g
+(essen)o(tially)g(sa)o(ying:)k(\\The)c(t)o(yp)q(e)f Fi(Int)f
+Fp(is)i(an)0 1126 y(instance)j(of)f(the)h(class)g Fi(Eq)p Fp(,)f(and)h(here)g
+(is)g(the)g(de\014nition)h(of)e(the)h(metho)q(d)g(corresp)q(onding)g(to)f
+(the)h(op)q(eration)0 1182 y Fi(==)p Fp(.")31 b(Giv)o(en)19
+b(this)h(declaration,)g(w)o(e)f(can)g(no)o(w)f(compare)h(\014xed)h(precision)
+h(in)o(tegers)e(for)f(equalit)o(y)i(using)g Fi(==)o Fp(.)0
+1239 y(Similarly:)71 1347 y Fi(instance)i(Eq)i(Float)f(where)118
+1404 y(x)h(==)g(y)381 b(=)48 b(floatEq)23 b(x)h(y)0 1513 y
+Fp(allo)o(ws)15 b(us)h(to)e(compare)h(\015oating)g(p)q(oin)o(t)h(n)o(um)o(b)q
+(ers)f(using)h Fi(==)p Fp(.)71 1589 y(Recursiv)o(e)g(t)o(yp)q(es)f(suc)o(h)h
+(as)f Fi(Tree)f Fp(de\014ned)j(earlier)f(can)f(also)g(b)q(e)h(handled:)71
+1698 y Fi(instance)22 b(\(Eq)i(a\))f(=>)h(Eq)g(\(Tree)f(a\))g(where)118
+1755 y(Leaf)h(a)214 b(==)24 b(Leaf)f(b)239 b(=)47 b(a)24 b(==)g(b)118
+1811 y(\(Branch)f(l1)h(r1\))f(==)h(\(Branch)f(l2)g(r2\))48
+b(=)f(\(l1==l2\))23 b(&&)h(\(r1==r2\))118 1868 y(_)334 b(==)24
+b(_)358 b(=)47 b(False)0 1979 y Fp(Note)16 b(the)g(con)o(text)40
+b Fi(Eq)23 b(a)40 b Fp(in)17 b(the)g(\014rst)e(line|this)k(is)e(necessary)g
+(b)q(ecause)g(the)f(elemen)o(ts)h(in)g(the)f(lea)o(v)o(es)h(\(of)0
+2036 y(t)o(yp)q(e)e Fi(a)p Fp(\))f(are)h(compared)g(for)f(equalit)o(y)i(in)g
+(line)h(2.)i(The)c(additional)i(constrain)o(t)d(is)i(essen)o(tially)g(sa)o
+(ying)f(that)f(w)o(e)0 2092 y(can)k(compare)f(trees)g(of)g
+Fi(a)p Fp('s)g(for)g(equalit)o(y)i(as)e(long)h(as)f(w)o(e)g(kno)o(w)g(ho)o(w)
+g(to)g(compare)g Fi(a)p Fp('s)g(for)g(equalit)o(y)l(.)28 b(If)18
+b(the)0 2149 y(con)o(text)d(w)o(ere)g(omitted,)f(a)h(static)g(t)o(yp)q(e)h
+(error)e(w)o(ould)i(result.)71 2225 y(The)h(Hask)o(ell)h(Rep)q(ort,)f(esp)q
+(ecially)j(the)d(Standard)g(Prelude,)i(con)o(tains)e(a)g(w)o(ealth)g(of)f
+(useful)j(examples)e(of)0 2281 y(t)o(yp)q(e)e(classes.)21 b(Indeed,)16
+b(a)f(class)g Fi(Eq)g Fp(is)h(de\014ned)h(that)d(is)i(sligh)o(tly)g(larger)f
+(than)g(the)h(one)f(de\014ned)h(earlier:)71 2392 y Fi(class)47
+b(Eq)23 b(a)48 b(where)118 2448 y(\(==\),)23 b(\(/=\))286 b(::)24
+b(a)g(->)f(a)h(->)g(Bool)118 2504 y(x)g(/=)g(y)381 b(=)48 b(not)23
+b(\(x)h(==)g(y\))0 2614 y Fp(This)15 b(is)g(an)g(example)g(of)g(a)f(class)h
+(with)g Fo(two)g Fp(op)q(erations,)g(one)f(for)g(equalit)o(y)l(,)i(the)e
+(other)h(for)f(inequalit)o(y)l(.)21 b(It)15 b(also)p eop
+%%Page: 25 25
+bop 1857 -40 a Fp(T-25)0 105 y(demonstrates)14 b(the)h(use)g(of)f(a)h
+Fo(default)h(metho)n(d)p Fp(,)f(in)h(this)f(case)g(for)f(the)h(inequalit)o(y)
+i(op)q(eration)e Fi(/=)o Fp(.)20 b(If)15 b(a)g(metho)q(d)0
+162 y(for)k(a)f(particular)i(op)q(eration)g(is)f(omitted)h(in)g(an)f
+(instance)h(declaration,)h(then)e(the)g(default)h(one)g(de\014ned)g(in)0
+218 y(the)e(class)g(declaration,)h(if)g(it)f(exists,)g(is)h(used)f(instead.)
+29 b(F)l(or)17 b(example,)i(the)f(three)g(instances)h(of)e
+Fi(Eq)h Fp(de\014ned)0 274 y(earlier)d(will)g(w)o(ork)e(p)q(erfectly)i(w)o
+(ell)g(with)g(the)f(ab)q(o)o(v)o(e)f(class)h(declaration,)h(yielding)h(just)e
+(the)g(righ)o(t)g(de\014nition)h(of)0 331 y(inequalit)o(y)i(that)d(w)o(e)h(w)
+o(an)o(t:)k(the)c(logical)i(negation)e(of)g(equalit)o(y)l(.)71
+408 y(Hask)o(ell)j(also)f(supp)q(orts)g(a)g(notion)g(of)g Fo(class)g
+(inclusion)p Fp(.)24 b(F)l(or)17 b(example,)h(w)o(e)f(ma)o(y)f(wish)i(to)e
+(de\014ne)j(a)e(class)0 464 y Fi(Ord)f Fp(whic)o(h)g Fo(inherits)g
+Fp(all)h(of)e(the)h(op)q(erations)g(in)h(Eq,)f(but)g(in)h(addition)g(has)f(a)
+f(set)h(of)g(comparison)g(op)q(erations)0 520 y(and)f(minim)o(um)i(and)e
+(maxim)o(um)g(functions:)71 621 y Fi(class)47 b(\(Eq)23 b(a\))h(=>)f(Ord)h(a)
+47 b(where)118 677 y(\(<\),)24 b(\(<=\),)f(\(>=\),)g(\(>\))47
+b(::)24 b(a)g(->)f(a)h(->)g(Bool)118 733 y(max,)g(min)333 b(::)24
+b(a)g(->)f(a)h(->)g(a)0 845 y Fp(Note)16 b(the)g(con)o(text)f(in)i(the)f
+Fi(class)g Fp(declaration.)23 b(W)l(e)16 b(sa)o(y)f(that)h
+Fi(Eq)f Fp(is)i(a)f Fo(sup)n(er)n(class)e Fp(of)i Fi(Ord)f
+Fp(\(con)o(v)o(ersely)l(,)h Fi(Ord)0 902 y Fp(is)h(a)f Fo(sub)n(class)f
+Fp(of)g Fi(Eq)p Fp(\),)h(and)h(an)o(y)f(instance)h(of)f Fi(Ord)f
+Fp(m)o(ust)h(also)g(b)q(e)h(an)g(instance)g(of)f Fi(Eq)o Fp(.)24
+b(\(In)16 b(the)h(next)f(Section)0 958 y(w)o(e)f(giv)o(e)g(a)g(fuller)i
+(de\014nition)g(or)d Fi(Ord)h Fp(tak)o(en)g(from)f(the)i(Standard)f
+(Prelude.\))71 1035 y(One)24 b(b)q(ene\014t)h(of)e(suc)o(h)h(class)g
+(inclusions)i(is)e(shorter)f(con)o(texts:)36 b(A)24 b(t)o(yp)q(e)f
+(expression)i(for)e(a)g(function)0 1091 y(that)17 b(uses)g(op)q(erations)h
+(from)e(b)q(oth)h(the)h Fi(Eq)f Fp(and)g Fi(Ord)g Fp(classes)h(can)f(use)h
+(the)f(con)o(text)g Fi(\(Ord)23 b(a\))p Fp(,)17 b(rather)g(than)0
+1147 y Fi(\(Eq)23 b(a,)h(Ord)f(a\))p Fp(,)18 b(since)i Fi(Ord)d
+Fp(\\implies")j Fi(Eq)o Fp(.)28 b(More)18 b(imp)q(ortan)o(tly)l(,)g(metho)q
+(ds)g(for)g(sub)q(class)h(op)q(erations)f(can)0 1204 y(assume)13
+b(the)h(existence)g(of)f(metho)q(ds)g(for)g(sup)q(erclass)h(op)q(erations.)20
+b(F)l(or)12 b(example,)i(the)g Fi(Ord)f Fp(declaration)h(in)g(the)0
+1260 y(Standard)h(Prelude)i(con)o(tains)e(this)g(default)h(metho)q(d)g(for)e
+Fi(\(<\))p Fp(:)166 1364 y Fi(x)24 b(<)f(y)358 b(=)48 b(x)24
+b(<=)f(y)h(&&)g(x)f(/=)h(y)71 1518 y Fp(As)15 b(an)g(example)h(of)f(the)g
+(use)g(of)g Fi(Ord)p Fp(,)g(the)g(principal)i(t)o(yping)f(of)f
+Fi(quicksort)f Fp(de\014ned)i(in)g(Section)g(2.5.1)e(is:)71
+1629 y Fi(quicksort)356 b(::)48 b(\(Ord)23 b(a\))h(=>)f([a])h(->)f([a])0
+1738 y Fp(In)g(other)g(w)o(ords,)g Fi(quicksort)e Fp(only)j(op)q(erates)e(on)
+h(lists)g(of)f(v)m(alues)i(of)f Fo(or)n(der)n(e)n(d)f Fp(t)o(yp)q(es.)42
+b(This)24 b(t)o(yping)f(for)0 1794 y Fi(quicksort)14 b Fp(arises)h(b)q
+(ecause)h(of)f(the)h(use)f(of)g(the)g(comparison)g(op)q(erators)g
+Fi(<)g Fp(and)g Fi(>=)g Fp(in)h(its)f(de\014nition.)71 1871
+y(Hask)o(ell)21 b(also)g(p)q(ermits)g Fo(multiple)h(inheritanc)n(e)p
+Fp(,)f(since)h(classes)f(ma)o(y)f(ha)o(v)o(e)g(more)h(than)f(one)h(sup)q
+(erclass.)0 1927 y(Name)16 b(con\015icts)g(are)g(a)o(v)o(oided)g(b)o(y)f(ha)o
+(ving)h(the)g(constrain)o(t)f(that)g(a)h(particular)g(op)q(eration)g(can)g(b)
+q(e)g(a)g(mem)o(b)q(er)0 1984 y(of)f(at)f(most)h(one)g(class)h(in)g(an)o(y)e
+(giv)o(en)i(scop)q(e.)71 2060 y(Con)o(texts)e(are)h(also)g(allo)o(w)o(ed)g
+(in)h Fi(data)f Fp(declarations;)h(see)f Fn(x)p Fp(4.2.1.)0
+2198 y Fc(A)k(Di\013eren)o(t)f(P)o(ersp)q(ectiv)o(e.)44 b Fp(Before)17
+b(going)g(on)f(to)g(further)h(examples)g(of)f(the)h(use)g(of)g(t)o(yp)q(e)f
+(classes,)i(it)e(is)0 2255 y(w)o(orth)c(p)q(oin)o(ting)i(out)f(t)o(w)o(o)e
+(other)i(viewp)q(oin)o(ts)h(of)f(Hask)o(ell's)g(t)o(yp)q(e)g(classes.)20
+b(The)13 b(\014rst)g(is)g(b)o(y)g(analogy)g(to)f(ob)s(ject-)0
+2311 y(orien)o(ted)j(programming)f(\(OOP\).)h(In)g(the)g(follo)o(wing)g
+(general)h(statemen)o(t)d(ab)q(out)i(OOP)l(,)g(simply)h(substituting)0
+2368 y Fo(typ)n(e)g(class)e Fp(for)h(class,)g(and)g Fo(typ)n(e)h
+Fp(for)e(ob)s(ject,)g(yields)j(a)e(v)m(alid)i(summary)e(of)f(Hask)o(ell's)i
+(t)o(yp)q(e)f(class)h(mec)o(hanism:)71 2444 y(\\)p Fo(Classes)c
+Fp(capture)j(common)g(sets)f(of)h Fo(op)n(er)n(ations)p Fp(.)k(A)c
+(particular)g Fo(obje)n(ct)g Fp(ma)o(y)f(b)q(e)i(an)f Fo(instanc)n(e)e
+Fp(of)h(a)h(class,)0 2501 y(and)i(will)i(ha)o(v)o(e)d(a)h Fo(metho)n(d)g
+Fp(corresp)q(onding)h(to)e(eac)o(h)h(op)q(eration.)25 b(Classes)17
+b(ma)o(y)f(b)q(e)h(arranged)g(hierarc)o(hically)l(,)0 2557
+y(forming)e(notions)g(of)g Fo(sup)n(er)n(classes)e Fp(and)j
+Fo(sub)n(classes)p Fp(,)d(and)i(p)q(ermitting)h Fo(inheritanc)n(e)e
+Fp(of)h(op)q(erations/metho)q(ds.)0 2614 y(A)g Fo(default)i(metho)n(d)f
+Fp(ma)o(y)e(also)h(b)q(e)h(asso)q(ciated)g(with)f(an)g(op)q(eration.")p
+eop
+%%Page: 26 26
+bop 0 -40 a Fp(T-26)771 b Fj(5)45 b(TYPE)15 b(CLASSES,)h(O)o(VERLO)o(ADING,)g
+(AND)f(\\OOP")71 105 y Fp(In)h Fo(c)n(ontr)n(ast)e Fp(to)h(OOP)l(,)h(it)g
+(should)g(b)q(e)g(clear)g(that)f(t)o(yp)q(es)h(are)f(not)g(ob)s(jects,)f(and)
+i(in)g(particular)g(there)g(is)g(no)0 162 y(notion)f(of)g(an)f(ob)s(ject's)g
+(or)h(t)o(yp)q(e's)f(in)o(ternal)i(m)o(utable)f(state.)k(An)c(adv)m(an)o
+(tage)g(o)o(v)o(er)f(OOP)h(is)h(that)e(metho)q(ds)h(in)0 218
+y(Hask)o(ell)i(are)f(completely)i(t)o(yp)q(e-safe:)k(an)o(y)17
+b(attempt)e(to)h(apply)h(a)f(metho)q(d)h(to)f(a)g(v)m(alue)h(whose)g(t)o(yp)q
+(e)f(is)h(not)f(in)0 274 y(the)f(required)h(class)f(will)h(b)q(e)f(detected)h
+(at)e(compile)i(time)f(instead)g(of)f(at)g(run)o(time.)21 b(In)15
+b(other)f(w)o(ords,)g(metho)q(ds)0 331 y(are)h(not)g(\\lo)q(ok)o(ed)g(up")g
+(at)g(run)o(time)h(but)f(are)g(simply)h(passed)g(as)f(higher-order)g
+(functions.)71 428 y(A)d(di\013eren)o(t)g(p)q(ersp)q(ectiv)o(e)h(can)f(b)q(e)
+h(gotten)e(b)o(y)h(considering)h(the)f(relationship)i(b)q(et)o(w)o(een)e
+(parametric)g(and)g(ad)0 485 y(ho)q(c)k(p)q(olymorphism.)21
+b(W)l(e)16 b(ha)o(v)o(e)f(sho)o(wn)g(ho)o(w)f(parametric)i(p)q(olymorphism)g
+(is)g(useful)h(in)f(de\014ning)h(families)f(of)0 541 y(t)o(yp)q(es)c(b)o(y)f
+(univ)o(ersally)j(quan)o(tifying)e(o)o(v)o(er)f Fo(al)r(l)h
+Fp(t)o(yp)q(es.)18 b(Sometimes,)13 b(ho)o(w)o(ev)o(er,)e(that)g(univ)o(ersal)
+i(quan)o(ti\014cation)f(is)0 597 y(to)q(o)h(broad|w)o(e)h(wish)h(to)e(quan)o
+(tify)h(o)o(v)o(er)f(some)h(smaller)g(set)g(of)f(t)o(yp)q(es,)h(suc)o(h)g(as)
+g(those)g(t)o(yp)q(es)f(whose)h(elemen)o(ts)0 654 y(can)j(b)q(e)h(compared)f
+(for)f(equalit)o(y)l(.)26 b(T)o(yp)q(e)17 b(classes)h(can)f(b)q(e)h(seen)f
+(as)g(pro)o(viding)h(a)e(structured)h(w)o(a)o(y)f(to)g(do)h(just)0
+710 y(this.)j(Indeed,)c(w)o(e)f(can)g(think)g(of)f(parametric)h(p)q
+(olymorphism)h(as)e(a)h(kind)h(of)e(o)o(v)o(erloading)h(to)q(o!)k(It's)14
+b(just)h(that)0 767 y(the)k(o)o(v)o(erloading)g(o)q(ccurs)g(implicitly)j(o)o
+(v)o(er)c(all)i(t)o(yp)q(es)e(instead)i(of)e(a)h(constrained)g(set)g(of)f(t)o
+(yp)q(es)h(\(i.e.)f(a)h(t)o(yp)q(e)0 823 y(class\).)71 920
+y(In)g(the)g(remainder)h(of)e(this)h(section)h(w)o(e)f(in)o(tro)q(duce)g(the)
+g(sev)o(eral)g(prede\014ned)i Fo(standar)n(d)e Fp(t)o(yp)q(e)g(classes)g(in)0
+977 y(Hask)o(ell.)0 1176 y Fg(5.1)56 b(Equalit)n(y)17 b(and)i(Ordered)f
+(Classes)0 1310 y Fp(Hask)o(ell's)c(standard)e(classes)i(form)e(the)h
+(somewhat)f(frigh)o(tening)i(inclusion)i(structure)d(sho)o(wn)f(in)i(Figure)g
+(2.)k(A)o(t)0 1367 y(the)e(top)f(of)g(the)g(\014gure,)h(w)o(e)f(see)h
+Fi(Eq)f Fp(with)h(its)g(sub)q(class)g Fi(Ord)f Fp(b)q(elo)o(w)h(it.)21
+b(These)16 b(w)o(ere)f(de\014ned)i(in)g(the)e(previous)0 1423
+y(section.)20 b(Con)o(tin)o(uing)c(do)o(wn,)f(w)o(e)g(encoun)o(ter)g(t)o(w)o
+(o)f(sub)q(classes)j(of)d Fi(Ord)p Fp(,)h Fi(Enum)f Fp(and)i
+Fi(Ix)o Fp(.)0 1623 y Fg(5.2)56 b(En)n(umeration)17 b(and)i(Index)f(Classes)0
+1757 y Fi(Enum)13 b Fp(has)g(a)h(set)f(of)g(op)q(erations)h(that)f(underlie)i
+(the)f(syn)o(tactic)f(sugar)g(of)h(arithmetic)g(sequences;)h(for)d(example,)0
+1813 y(the)j(arithmetic)g(sequence)h(expression)f Fi([1,3..])f
+Fp(stands)h(for)f Fi(enumFromThen)22 b(1)i(3)14 b Fp(\(see)h
+Fn(x)p Fp(3.9)f(for)g(the)g(formal)0 1870 y(translation\).)29
+b(Arithmetic)20 b(sequences)f(are)g(ordered,)g(so)f(naturally)l(,)h
+Fi(Enum)f Fp(is)h(a)f(sub)q(class)i(of)e Fi(Ord)p Fp(.)29 b(W)l(e)19
+b(can)0 1926 y(no)o(w)d(see)h(that)f(arithmetic)i(sequence)f(expressions)h
+(can)f(b)q(e)g(used)g(to)f(generate)h(lists)g(of)g(an)o(y)f(t)o(yp)q(e)h
+(that)f(is)h(an)0 1983 y(instance)f(of)g Fi(Enum)o Fp(.)21
+b(This)16 b(includes)i(not)e(only)g(most)f(n)o(umeric)h(t)o(yp)q(es,)f(but)h
+(also)g Fi(Char)o Fp(,)g(so)f(that,)g(for)g(instance,)0 2039
+y Fi(['a'..'z'])g Fp(denotes)h(the)g(list)h(of)f(lo)o(w)o(er-case)f(letters)i
+(in)g(alphab)q(etical)h(order.)k(F)l(urthermore,)15 b(user-de\014ned)0
+2096 y(en)o(umerated)g(t)o(yp)q(es)h(lik)o(e)g Fi(Color)e Fp(can)i(easily)g
+(b)q(e)g(giv)o(en)f Fi(Enum)g Fp(instance)h(declarations.)21
+b(If)15 b(so:)318 2221 y Fi([Red..Violet])72 b Fn(\))h Fi([Red,)24
+b(Green,)f(Blue,)g(Indigo,)g(Violet])0 2347 y Fp(Note)13 b(that)g(suc)o(h)h
+(a)g(sequence)h(is)f Fo(arithmetic)g Fp(in)h(the)f(sense)g(that)f(the)h
+(incremen)o(t)g(b)q(et)o(w)o(een)g(v)m(alues)h(is)f(constan)o(t,)0
+2404 y(ev)o(en)i(though)f(the)g(v)m(alues)h(are)f(not)g(n)o(um)o(b)q(ers.)71
+2501 y(The)j(other)h(immediate)g(standard)f(sub)q(class)i(of)e
+Fi(Ord)g Fp(is)h Fi(Ix)p Fp(,)g(whic)o(h)g(is)g(the)g(class)g(of)f(t)o(yp)q
+(es)h(that)f(can)g(b)q(e)0 2557 y(used)d(as)g(arra)o(y)e(indices.)22
+b(Again,)15 b(it)g(is)g(natural)f(that)g Fi(Ix)h Fp(should)g(b)q(e)h(a)e(sub)
+q(class)i(of)e Fi(Ord)p Fp(,)g(since)i(w)o(e)e(exp)q(ect)i(the)0
+2614 y(elemen)o(ts)g(of)f(an)g(arra)o(y)f(to)g(ha)o(v)o(e)h(an)g(index)i
+(order.)i(W)l(e)d(deal)g(with)f(class)h Fi(Ix)e Fp(in)j(Section)f(6.9.)p
+eop
+%%Page: 27 27
+bop 0 -40 a Fj(5.3)45 b(T)l(ext)15 b(and)g(Binary)h(Classes)1267
+b Fp(T-27)793 675 y Fa(#)751 708 y(#)741 717 y(#)943 525 y(#)901
+558 y(#)891 567 y(#)1074 375 y(#)1033 409 y(#)1022 417 y(#)1093
+675 y(#)1051 708 y(#)1041 717 y(#)1187 825 y(#)1145 858 y(#)1134
+867 y(#)816 534 y(S)841 567 y(S)816 234 y(S)847 275 y(S)878
+317 y(S)909 358 y(S)940 400 y(S)953 417 y(S)1022 833 y(S)1047
+867 y(S)1041 534 y(S)1066 567 y(S)1153 684 y(S)1178 717 y(S)909
+684 y(S)934 717 y(S)546 609 y(S)577 650 y(S)608 692 y(S)627
+717 y(S)631 384 y(\023)600 425 y(\023)569 467 y(\023)549 492
+y(\023)728 234 y(\023)703 267 y(\023)703 384 y(S)728 417 y(S)1022
+923 y Fi(RealFloat)591 773 y(Integral)389 b(Floating)-473 b(RealFrac)1022
+623 y(Fractional)516 548 y(Ix)816 623 y(Real)966 473 y(Num)-279
+b(Enum)628 323 y(Ord)759 173 y(Eq)1097 323 y(Text)185 b(Binary)468
+1071 y Fp(Figure)16 b(2:)j(Hask)o(ell's)d(Standard)f(T)o(yp)q(e)g(Class)h
+(Hierarc)o(h)o(y)0 1254 y Fg(5.3)56 b(T)-5 b(ext)18 b(and)h(Binary)f(Classes)
+0 1438 y Fc(5.3.1)52 b(T)l(ext)17 b(Class)0 1622 y Fp(The)h(instances)h(of)e
+(class)h Fi(Text)f Fp(are)h(those)f(t)o(yp)q(es)h(that)f(can)h(b)q(e)g(con)o
+(v)o(erted)g(to)f(c)o(haracter)g(strings)h(\(t)o(ypically)0
+1678 y(for)e(I/O\))h(and)g(bac)o(k;)f(th)o(us,)h(this)g(class)g(pro)o(vides)g
+(op)q(erations)g(for)f(parsing)h(c)o(haracter)f(strings)g(to)g(obtain)h(the)0
+1735 y(v)m(alues)j(they)f(ma)o(y)f(represen)o(t)h(and)g(for)f(pro)q(ducing)j
+(the)e(canonical)h(textual)f(represen)o(tation)g(of)f(a)h(prin)o(table)0
+1791 y(v)m(alue.)i(As)14 b(these)g(primitiv)o(e)i(op)q(erations)e(are)g
+(somewhat)g(esoteric,)g(let's)g(b)q(egin)i(with)e(one)h(of)e(the)i
+(higher-lev)o(el)0 1848 y(functions)h(that)e(is)i(de\014ned)h(in)f(terms)e
+(of)h(them:)71 1948 y Fi(show)476 b(::)24 b(\(Text)f(a\))h(=>)f(a)h(->)g
+(String)0 2057 y Fp(Naturally)16 b(enough,)f Fi(show)f Fp(tak)o(es)h(an)o(y)f
+(v)m(alue)j(of)d(an)h(appropriate)h(t)o(yp)q(e)f(and)g(returns)g(its)g
+(represen)o(tation)h(as)e(a)0 2113 y(c)o(haracter)i(string)g(\(list)h(of)f(c)
+o(haracters\),)f(as)h(in)h Fi(show)23 b(\(2+2\))o Fp(,)16 b(whic)o(h)i
+(results)e(in)h Fi("4")p Fp(.)23 b(This)17 b(is)g(\014ne)g(as)f(far)f(as)0
+2170 y(it)h(go)q(es,)e(but)i(w)o(e)f(t)o(ypically)i(need)f(to)f(pro)q(duce)h
+(more)f(complex)h(strings)f(that)g(ma)o(y)g(ha)o(v)o(e)g(the)g(represen)o
+(tations)0 2226 y(of)g(man)o(y)g(v)m(alues)h(in)g(them,)f(as)f(in)71
+2335 y Fi("The)23 b(sum)g(of)h(")g(++)f(show)h(x)f(++)h(")g(and)f(")h(++)f
+(show)h(y)f(++)h(")g(is)f(")h(++)g(show)f(\(x+y\))g(++)h(".")0
+2444 y Fp(and)18 b(after)f(a)g(while,)j(all)f(that)e(concatenation)h(gets)f
+(to)g(b)q(e)h(a)g(bit)g(ine\016cien)o(t.)29 b(Sp)q(eci\014call)q(y)l(,)21
+b(let's)d(consider)g(a)0 2501 y(function)h(to)f(represen)o(t)g(the)g(binary)h
+(trees)f(of)g(Section)h(2.3)e(as)h(a)f(string,)i(with)f(suitable)i(markings)e
+(to)g(sho)o(w)0 2557 y(the)d(nesting)h(of)e(subtrees)i(and)f(the)g
+(separation)g(of)f(left)i(and)f(righ)o(t)g(branc)o(hes)g(\(pro)o(vided)h(the)
+f(elemen)o(t)g(t)o(yp)q(e)g(is)0 2614 y(represen)o(table)h(as)f(a)g
+(string\):)p eop
+%%Page: 28 28
+bop 0 -40 a Fp(T-28)771 b Fj(5)45 b(TYPE)15 b(CLASSES,)h(O)o(VERLO)o(ADING,)g
+(AND)f(\\OOP")71 160 y Fi(showTree)380 b(::)24 b(\(Text)f(a\))h(=>)f(Tree)h
+(a)f(->)h(String)71 216 y(showTree)e(\(Leaf)i(x\))166 b(=)48
+b(show)23 b(x)71 272 y(showTree)f(\(Branch)h(l)h(r\))71 b(=)48
+b("<")23 b(++)h(showTree)f(l)g(++)h("|")f(++)h(showTree)f(r)h(++)f(">")0
+382 y Fp(Because)16 b Fi(\(++\))f Fp(has)g(time)h(complexit)o(y)g(linear)h
+(in)f(the)f(length)h(of)f(its)h(left)f(argumen)o(t,)g Fi(showTree)f
+Fp(is)i(quadratic)0 438 y(in)g(the)f(size)h(of)f(the)g(tree.)71
+531 y(T)l(o)f(restore)h(linear)h(complexit)o(y)l(,)g(the)g(function)g
+Fi(shows)e Fp(is)i(pro)o(vided:)71 640 y Fi(shows)452 b(::)24
+b(\(Text)f(a\))h(=>)f(a)h(->)g(String)f(->)g(String)0 749 y(shows)15
+b Fp(tak)o(es)g(a)h(prin)o(table)h(v)m(alue)g(and)f(a)f(string)h(and)g
+(returns)g(that)f(string)h(with)g(the)g(v)m(alue's)h(represen)o(tation)0
+805 y(concatenated)f(at)g(the)g(fron)o(t.)22 b(The)16 b(second)h(argumen)o(t)
+e(serv)o(es)h(as)g(a)g(sort)f(of)h(string)g Fo(ac)n(cumulator,)h
+Fp(and)g Fi(show)0 862 y Fp(can)e(no)o(w)g(b)q(e)h(de\014ned)g(as)f
+Fi(shows)g Fp(with)g(the)h(n)o(ull)g(accum)o(ulator:)71 962
+y Fi(show)23 b(x)429 b(=)48 b(shows)23 b(x)h("")0 1071 y Fp(W)l(e)16
+b(can)g(use)g Fi(shows)f Fp(to)g(de\014ne)i(a)e(more)g(e\016cien)o(t)i(v)o
+(ersion)f(of)f Fi(showTree)o Fp(,)h(whic)o(h)g(also)g(has)f(a)h(string)g
+(accum)o(u-)0 1128 y(lator)f(argumen)o(t:)71 1237 y Fi(showsTree)356
+b(::)24 b(\(Text)f(a\))h(=>)f(Tree)h(a)f(->)h(String)f(->)h(String)71
+1293 y(showsTree)e(\(Leaf)h(x\))h(s)95 b(=)48 b(shows)23 b(x)h(s)71
+1349 y(showsTree)e(\(Branch)h(l)h(r\))f(s=)48 b('<')23 b(:)h(showsTree)f(l)g
+(\('|')h(:)f(showsTree)g(r)h(\('>')f(:)h(s\)\))0 1461 y Fp(This)16
+b(solv)o(es)f(our)g(e\016ciency)i(problem)f(\()p Fi(showsTree)e
+Fp(has)h(linear)h(complexit)o(y\),)g(but)f(the)g(presen)o(tation)h(of)f(this)
+0 1518 y(function)h(\(and)f(others)g(lik)o(e)h(it\))f(can)h(b)q(e)g(impro)o
+(v)o(ed.)k(First,)14 b(let's)h(create)g(a)g(t)o(yp)q(e)g(synon)o(ym:)71
+1629 y Fi(type)23 b(ShowS)333 b(=)48 b(String)23 b(->)h(String)0
+1738 y Fp(This)d(is)f(the)g(t)o(yp)q(e)g(of)g(a)f(function)i(that)f(returns)f
+(a)h(string)g(represen)o(tation)g(of)g(something)g(follo)o(w)o(ed)g(b)o(y)g
+(an)0 1795 y(accum)o(ulator)15 b(string.)21 b(Second,)c(w)o(e)e(can)h(a)o(v)o
+(oid)f(carrying)h(accum)o(ulators)f(around,)g(and)h(also)g(a)o(v)o(oid)f
+(amassing)0 1851 y(paren)o(theses)g(at)g(the)g(righ)o(t)g(end)h(of)f(long)g
+(constructions,)g(b)o(y)g(using)h(functional)h(comp)q(osition:)71
+1960 y Fi(showsTree)356 b(::)24 b(\(Text)f(a\))h(=>)f(Tree)h(a)f(->)h(ShowS)
+71 2016 y(showsTree)e(\(Leaf)h(x\))143 b(=)48 b(shows)23 b(x)71
+2073 y(showsTree)f(\(Branch)h(l)h(r\))47 b(=)h(\('<':\))23
+b(.)h(showsTree)e(l)i(.)g(\('|':\))f(.)h(showsTree)e(r)i(.)g(\('>':\))0
+2182 y Fp(Something)16 b(more)g(imp)q(ortan)o(t)g(than)f(just)h(tidying)h(up)
+f(the)g(co)q(de)h(has)f(come)g(ab)q(out)f(b)o(y)h(this)h(transformation:)0
+2238 y(W)l(e)f(ha)o(v)o(e)f(raised)h(the)g(presen)o(tation)g(from)e(an)i
+Fo(obje)n(ct)g(level)f Fp(\(in)h(this)g(case,)g(strings\))f(to)g(a)g
+Fo(function)h(level.)21 b Fp(W)l(e)0 2295 y(can)16 b(think)h(of)e(the)h(t)o
+(yping)h(as)e(sa)o(ying)h(that)f Fi(showsTree)g Fp(maps)h(a)f(tree)h(in)o(to)
+g(a)g Fo(showing)g(function)p Fp(.)22 b(F)l(unctions)0 2351
+y(lik)o(e)16 b Fi(\('<')23 b(:\))14 b Fp(or)g Fi(\("a)23 b(string")g(++\))14
+b Fp(are)g(primitiv)o(e)i(sho)o(wing)e(functions,)h(and)g(w)o(e)f(build)i(up)
+f(more)f(complex)0 2408 y(functions)i(b)o(y)f(comp)q(osition.)71
+2501 y(No)o(w)i(that)g(w)o(e)h(can)g(turn)g(trees)g(in)o(to)g(strings,)g
+(let's)g(turn)g(to)g(the)g(in)o(v)o(erse)g(problem.)30 b(The)18
+b(basic)h(idea)f(is)0 2557 y(a)g Fo(p)n(arser)h Fp(for)f(a)g(t)o(yp)q(e)h
+Fi(a)p Fp(,)g(whic)o(h)g(is)h(a)e(function)h(that)f(tak)o(es)g(a)h(string)f
+(and)h(returns)f(a)h(list)g(of)g Fi(\(a,)k(String\))0 2614
+y Fp(pairs[7].)c(The)d(Standard)f(Prelude)h(pro)o(vides)g(a)f(t)o(yp)q(e)g
+(synon)o(ym)g(for)f(suc)o(h)i(functions:)p eop
+%%Page: 29 29
+bop 0 -40 a Fj(5.3)45 b(T)l(ext)15 b(and)g(Binary)h(Classes)1267
+b Fp(T-29)71 160 y Fi(type)23 b(ReadS)g(a)286 b(=)48 b(String)23
+b(->)h([\(a,String\)])0 269 y Fp(Normally)l(,)13 b(a)f(parser)f(returns)h(a)g
+(singleton)h(list,)g(con)o(taining)f(a)g(v)m(alue)h(of)f(t)o(yp)q(e)g
+Fi(a)f Fp(that)h(w)o(as)f(read)h(from)f(the)h(input)0 325 y(string)g(and)g
+(the)g(remaining)i(string)e(that)f(follo)o(ws)h(what)g(w)o(as)f(parsed.)19
+b(If)12 b(no)g(parse)g(w)o(as)f(p)q(ossible,)j(ho)o(w)o(ev)o(er,)e(the)0
+382 y(result)k(is)h(the)f(empt)o(y)f(list,)i(and)f(if)g(there)g(is)g(more)g
+(than)g(one)g(p)q(ossible)h(parse)f(\(an)f(am)o(biguit)o(y\),)h(the)g
+(resulting)0 438 y(list)e(con)o(tains)g(more)f(than)g(one)h(pair.)20
+b(The)14 b(standard)f(function)h Fi(reads)f Fp(is)h(a)f(parser)g(for)g(an)o
+(y)g(instance)i(of)e Fi(Text)o Fp(:)71 547 y Fi(reads)452 b(::)24
+b(\(Text)f(a\))h(=>)f(ReadS)g(a)0 656 y Fp(W)l(e)16 b(can)h(use)g(this)f
+(function)i(to)d(de\014ne)j(a)e(parsing)g(function)i(for)d(the)i(string)f
+(represen)o(tation)g(of)g(binary)h(trees)0 713 y(pro)q(duced)k(b)o(y)f
+Fi(showsTree)n Fp(.)34 b(List)21 b(comprehensions)g(giv)o(e)f(us)g(a)f(con)o
+(v)o(enien)o(t)h(idiom)h(for)f(constructing)g(suc)o(h)0 769
+y(parsers:)71 878 y Fi(readsTree)356 b(::)24 b(\(Text)f(a\))h(=>)f(ReadS)g
+(\(Tree)h(a\))71 934 y(readsTree)e(\('<':s\))166 b(=)48 b([\(Branch)23
+b(l)g(r,)h(u\))g(|)f(\(l,)h('|':t\))f(<-)g(readsTree)g(s,)1168
+991 y(\(r,)h('>':u\))f(<-)g(readsTree)g(t)h(])71 1047 y(readsTree)e(s)310
+b(=)48 b([\(Leaf)23 b(x,)h(t\))119 b(|)23 b(\(x,t\))143 b(<-)23
+b(reads)h(s])0 1156 y Fp(Let's)19 b(tak)o(e)f(a)g(momen)o(t)g(to)h(examine)g
+(this)h(function)f(de\014nition)i(in)f(detail.)31 b(There)20
+b(are)e(t)o(w)o(o)g(main)h(cases)g(to)0 1213 y(consider:)i(If)15
+b(the)g(\014rst)g(c)o(haracter)f(of)h(the)g(string)g(to)f(b)q(e)i(parsed)f
+(is)g Fi('<')p Fp(,)g(w)o(e)f(should)i(ha)o(v)o(e)f(the)g(represen)o(tation)0
+1269 y(of)e(a)g(branc)o(h;)g(otherwise,)h(w)o(e)f(ha)o(v)o(e)f(a)h(leaf.)20
+b(In)14 b(the)f(\014rst)g(case,)g(calling)i(the)e(rest)g(of)g(the)g(input)h
+(string)f(follo)o(wing)0 1326 y(the)j(op)q(ening)h(angle)f(brac)o(k)o(et)f
+Fi(s)p Fp(,)g(an)o(y)h(p)q(ossible)h(parse)f(m)o(ust)f(b)q(e)h(a)f(tree)h
+Fi(Branch)23 b(l)h(r)15 b Fp(with)h(remaining)h(string)0 1382
+y Fi(u)p Fp(,)e(sub)s(ject)g(to)f(the)i(follo)o(wing)f(conditions:)56
+1510 y(1.)22 b(The)15 b(tree)g Fi(l)g Fp(can)g(b)q(e)h(parsed)g(from)e(the)h
+(b)q(eginning)j(of)c(the)i(string)f Fi(s)p Fp(.)56 1611 y(2.)22
+b(The)14 b(string)f(remaining)i(\(follo)o(wing)f(the)g(represen)o(tation)g
+(of)f Fi(l)p Fp(\))g(b)q(egins)i(with)g Fi('|')o Fp(.)k(Call)c(the)f(tail)g
+(of)g(this)114 1668 y(string)h Fi(t)p Fp(.)56 1769 y(3.)22
+b(The)15 b(tree)g Fi(r)g Fp(can)g(b)q(e)h(parsed)g(from)e(the)h(b)q(eginning)
+j(of)c Fi(t)p Fp(.)56 1870 y(4.)22 b(The)15 b(string)g(remaining)h(from)f
+Fo(that)h Fp(parse)f(b)q(egins)h(with)g Fi('>')o Fp(,)f(and)h
+Fi(u)f Fp(is)g(the)h(tail.)0 1997 y(Notice)e(the)f(expressiv)o(e)h(p)q(o)o(w)
+o(er)f(w)o(e)g(get)g(from)g(the)g(com)o(bination)h(of)f(pattern)g(matc)o
+(hing)g(with)h(list)g(comprehen-)0 2054 y(sion:)22 b(The)16
+b(form)f(of)h(a)f(resulting)i(parse)f(is)g(giv)o(en)h(b)o(y)f(the)g(main)g
+(expression)h(of)e(the)h(list)h(comprehension,)g(the)0 2110
+y(\014rst)d(t)o(w)o(o)e(conditions)k(ab)q(o)o(v)o(e)d(are)h(expressed)h(b)o
+(y)f(the)g(\014rst)f(generator)h(\(\\)p Fi(\(l,)22 b('|':t\))14
+b Fp(is)g(dra)o(wn)g(from)f(the)h(list)0 2167 y(of)h(parses)g(of)g
+Fi(s)o Fp(."\),)f(and)i(the)f(remaining)h(conditions)h(are)d(expressed)i(b)o
+(y)f(the)h(second)f(generator.)71 2252 y(The)e(second)g(de\014ning)h
+(equation)f(ab)q(o)o(v)o(e)f(just)h(sa)o(ys)f(that)g(to)g(parse)g(the)h
+(represen)o(tation)g(of)f(a)g(leaf,)i(w)o(e)e(parse)0 2308
+y(a)k(represen)o(tation)g(of)f(the)i(elemen)o(t)f(t)o(yp)q(e)h(of)e(the)h
+(tree)g(and)h(apply)f(the)h(constructor)e Fi(Leaf)g Fp(to)h(the)g(v)m(alue)h
+(th)o(us)0 2365 y(obtained.)71 2450 y(W)l(e'll)f(accept)h(on)e(faith)h(for)g
+(the)g(momen)o(t)f(that)g(there)h(is)h(a)e Fi(Text)g Fp(instance)i(of)f
+Fi(Int)f Fp(\(among)g(man)o(y)g(other)0 2506 y(t)o(yp)q(es\),)g(pro)o(viding)
+h(a)f Fi(reads)f Fp(that)g(b)q(eha)o(v)o(es)i(as)f(one)g(w)o(ould)h(exp)q
+(ect,)f(e.g.:)115 2614 y Fi(\(reads)23 b("5)h(golden)f(rings"\))g(::)h
+([\(Int,String\)])71 b Fn(\))j Fi([\(5,)23 b(")h(golden)f(rings"\)])p
+eop
+%%Page: 30 30
+bop 0 -40 a Fp(T-30)771 b Fj(5)45 b(TYPE)15 b(CLASSES,)h(O)o(VERLO)o(ADING,)g
+(AND)f(\\OOP")0 105 y Fp(With)g(this)h(understanding,)g(the)f(reader)g
+(should)i(v)o(erify)e(the)g(follo)o(wing)h(ev)m(aluations:)21
+194 y Fi(readsTree)22 b("<1|<2|3>>")101 b Fn(\))i Fi([\(Branch)22
+b(\(Leaf)i(1\))f(\(Branch)g(\(Leaf)g(2\))h(\(Leaf)f(3\)\),)g(""\)])21
+251 y(readsTree)f("<1|2")221 b Fn(\))103 b Fi([])71 362 y Fp(Because)19
+b(the)g(textual)g(represen)o(tation)f(w)o(e)h(ha)o(v)o(e)f(c)o(hosen)h(for)f
+(trees)h(is)g(unam)o(biguous,)h Fi(readsTree)d Fp(will)0 418
+y(alw)o(a)o(ys)11 b(return)g(either)h(a)f(singleton)i(list)f(or)f(an)g(empt)o
+(y)g(list,)i(pro)o(vided)f(that)f(the)g(represen)o(tation)h(of)f(the)g
+(elemen)o(t)0 474 y(t)o(yp)q(e)k(is)g(also)f(unam)o(biguous.)21
+b(Supp)q(ose,)15 b(ho)o(w)o(ev)o(er,)f(that)f(w)o(e)i(w)o(ere)f(to)g(c)o
+(hange)h(our)f(textual)h(represen)o(tation)f(of)0 531 y(trees)h(to)g(omit)g
+(the)g(angle)h(brac)o(k)o(ets:)71 640 y Fi(readsTree)22 b(s)310
+b(=)48 b([\(Branch)23 b(l)g(r,)h(u\))g(|)f(\(l,)h('|':t\))f(<-)g(readsTree)g
+(s,)1168 696 y(\(r,)h(u\))119 b(<-)23 b(readsTree)g(t)h(])715
+753 y(++)715 809 y([\(Leaf)f(x,)h(t\))119 b(|)23 b(\(x,t\))143
+b(<-)23 b(reads)h(s])0 921 y Fp(\(The)16 b Fi(\(++\))g Fp(here)h(can)g(b)q(e)
+g(though)o(t)e(of)h(as)g(a)h(list)g(analogue)f(of)g(set)h(union;)g(that)f
+(is,)h(the)g(tree)f(parses)g(of)g Fi(s)g Fp(are)0 977 y(all)g(its)g(parses)f
+(as)f(a)h(branc)o(h)h(plus)g(all)g(its)f(parses)g(as)g(a)g(leaf.\))20
+b(No)o(w,)14 b(w)o(e)h(see)h(that:)51 1069 y Fi(readsTree)22
+b("1|2|3")102 b Fn(\))g Fi([\(Branch)23 b(\(Branch)g(\(Leaf)g(1\))h(\(Leaf)f
+(2\)\))g(\(Leaf)g(3\),)h(""\),)730 1125 y(\(Branch)f(\(Leaf)g(1\))h(\(Branch)
+f(\(Leaf)g(2\))g(\(Leaf)g(3\)\),)h(""\)])71 1236 y Fp(Returning)15
+b(to)f(our)g(unam)o(biguous)h(represen)o(tation,)f(there)h(are)f(a)g(couple)h
+(of)f(shortcomings)g(to)g(deal)h(with.)0 1293 y(One)g(is)g(that)e(the)h
+(parser)g(is)h(quite)g(rigid,)g(allo)o(wing)g(no)f(white)h(space)f(b)q(efore)
+h(or)e(b)q(et)o(w)o(een)i(the)f(elemen)o(ts)h(of)f(the)0 1349
+y(tree)i(represen)o(tation;)h(the)f(other)g(is)h(that)e(the)i(w)o(a)o(y)e(w)o
+(e)h(parse)g(our)g(punctuation)h(sym)o(b)q(ols)g(is)g(quite)g(di\013eren)o(t)
+0 1406 y(from)10 b(the)g(w)o(a)o(y)g(w)o(e)g(parse)h(leaf)g(v)m(alues)g(and)g
+(subtrees,)g(this)g(lac)o(k)g(of)f(uniformit)o(y)h(making)g(the)g(function)g
+(de\014nition)0 1462 y(harder)16 b(to)g(read.)23 b(W)l(e)17
+b(can)f(address)h(b)q(oth)f(of)g(these)h(problems)g(b)o(y)f(using)h(the)g
+(lexical)h(analyzer)f(pro)o(vided)g(b)o(y)0 1519 y(the)e(Standard)g(Prelude:)
+71 1619 y Fi(lex)500 b(::)24 b(ReadS)f(String)0 1728 y(lex)c
+Fp(normally)i(returns)f(a)f(singleton)i(list)g(con)o(taining)g(a)e(pair)i(of)
+e(strings:)30 b(the)20 b(\014rst)f(lexeme)i(in)g(the)f(input)0
+1784 y(string)d(and)g(the)g(remainder)g(of)g(the)g(input.)26
+b(The)17 b(lexical)i(rules)e(are)g(those)f(of)h(Hask)o(ell)g(programs,)f
+(including)0 1841 y(commen)o(ts,)h(whic)o(h)g Fi(lex)g Fp(skips,)h(along)f
+(with)g(whitespace.)26 b(If)18 b(the)f(input)h(string)f(is)g(empt)o(y)g(or)f
+(con)o(tains)h(only)0 1897 y(whitespace)e(and)f(commen)o(ts,)f
+Fi(lex)h Fp(returns)g Fi([\("",""\)])o Fp(;)g(if)g(the)g(input)h(is)g(not)e
+(empt)o(y)h(in)h(this)f(sense,)h(but)f(also)0 1954 y(do)q(es)i(not)e(b)q
+(egin)j(with)e(a)g(v)m(alid)i(lexeme)f(after)f(an)o(y)g(leading)h(whitespace)
+g(and)g(commen)o(ts,)e Fi(lex)h Fp(returns)g Fi([])o Fp(.)71
+2032 y(Using)g(the)h(lexical)h(analyzer,)e(our)g(tree)g(parser)g(no)o(w)g(lo)
+q(oks)g(lik)o(e)h(this:)71 2141 y Fi(readsTree)356 b(::)24
+b(\(Text)f(a\))h(=>)f(ReadS)g(\(Tree)h(a\))71 2197 y(readsTree)e(s)310
+b(=)48 b([\(Branch)23 b(l)g(r,)h(x\))g(|)f(\("<",)g(t\))h(<-)g(lex)f(s,)1168
+2254 y(\(l,)71 b(u\))24 b(<-)g(readsTree)e(t,)1168 2310 y(\("|",)h(v\))h(<-)g
+(lex)f(u,)1168 2367 y(\(r,)71 b(w\))24 b(<-)g(readsTree)e(v,)1168
+2423 y(\(">",)h(x\))h(<-)g(lex)f(w)215 b(])715 2480 y(++)715
+2536 y([\(Leaf)23 b(x,)h(t\))119 b(|)23 b(\(x,)71 b(t\))24
+b(<-)g(reads)f(s)167 b(])p eop
+%%Page: 31 31
+bop 0 -40 a Fj(5.4)45 b(Deriv)o(ed)15 b(Instances)1402 b Fp(T-31)71
+105 y(W)l(e)10 b(ma)o(y)g(no)o(w)h(wish)g(to)f(use)h Fi(readsTree)f
+Fp(and)h Fi(showsTree)e Fp(to)h(declare)i Fi(\(Text)23 b(a\))h(=>)g(Tree)f(a)
+10 b Fp(an)h(instance)0 162 y(of)18 b Fi(Text)o Fp(.)30 b(This)19
+b(w)o(ould)f(allo)o(w)h(us)f(to)g(use)h(the)f(generic)h(o)o(v)o(erloaded)g
+(functions)g(from)e(the)i(Prelude)g(to)f(parse)0 218 y(and)c(displa)o(y)g
+(trees.)19 b(Moreo)o(v)o(er,)12 b(w)o(e)i(w)o(ould)g(automatically)f(then)h
+(b)q(e)g(able)h(to)e(parse)g(and)h(displa)o(y)g(man)o(y)f(other)0
+274 y(t)o(yp)q(es)k(con)o(taining)g(trees)f(as)g(comp)q(onen)o(ts,)h(for)f
+(example,)h Fi([Tree)23 b(Int])p Fp(.)h(As)16 b(it)h(turns)f(out,)g
+Fi(readsTree)g Fp(and)0 331 y Fi(showsTree)c Fp(are)h(of)h(almost)f(the)g
+(righ)o(t)h(t)o(yp)q(es)f(to)g(b)q(e)h Fi(Text)f Fp(metho)q(ds,)h(needing)h
+(only)f(the)f(addition)i(of)e(an)h(extra)0 387 y(parameter)f(eac)o(h)g(that)g
+(has)g(do)h(do)f(with)h(paren)o(thesization)g(of)f(forms)g(with)h(in\014x)h
+(constructors.)j(W)l(e)c(refer)f(the)0 444 y(in)o(terested)j(reader)f(to)f
+Fn(x)q Fp(E.2)g(for)h(details.)71 527 y(W)l(e)i(can)g(test)f(suc)o(h)h(a)g
+Fi(Text)f Fp(instance)i(b)o(y)f(applying)h Fi(\(read)24 b(.)f(show\))16
+b Fp(\(whic)o(h)i(should)g(b)q(e)g(the)f(iden)o(tit)o(y\))0
+584 y(to)e(some)f(trees,)h(where)g Fi(read)g Fp(is)h(a)f(sp)q(ecialization)i
+(of)e Fi(reads)p Fp(:)71 693 y Fi(read)476 b(::)24 b(\(Text)f(a\))h(=>)f
+(String)g(->)h(a)0 802 y Fp(This)c(function)g(fails)h(if)f(there)f(is)h(not)f
+(a)g(unique)i(parse)f(or)f(if)h(the)f(input)i(con)o(tains)e(an)o(ything)h
+(more)f(than)g(a)0 858 y(represen)o(tation)c(of)g(one)g(v)m(alue)i(of)e(t)o
+(yp)q(e)g Fi(a)g Fp(\(and)g(p)q(ossibly)l(,)h(commen)o(ts)f(and)g
+(whitespace\).)0 1010 y Fc(5.3.2)52 b(Binary)17 b(Class)0 1123
+y Fp(The)e Fi(Binary)f Fp(class)i(is)f(similar)h(to)f Fi(Text)o
+Fp(,)g(but)g(uses)g(a)g(primitiv)o(e)h(abstract)e(t)o(yp)q(e)h
+Fi(Bin)g Fp(instead)g(of)g Fi(String)o Fp(,)g(the)0 1180 y(purp)q(ose)f(of)g
+(whic)o(h)g(is)h(e\016cien)o(t)f(transparen)o(t)f(I/O.)h(\(See)g
+Fn(x)p Fp(7.\))19 b(Generally)l(,)c(only)f(deriv)o(ed)h(instances)f(of)g
+Fi(Binary)0 1236 y Fp(are)22 b(used)g(\(see)g(b)q(elo)o(w\),)h(whic)o(h)g
+(generate)e(implemen)o(tation-de\014ned)k(op)q(erations)d Fi(readBin)f
+Fp(and)h Fi(showBin)0 1293 y Fp(\(analogous)15 b(to)f Fi(reads)h
+Fp(and)g Fi(shows)o Fp(\).)0 1446 y Fg(5.4)56 b(Deriv)n(ed)17
+b(Instances)0 1560 y Fp(Recall)12 b(the)f Fi(Eq)f Fp(instance)i(for)e(trees)g
+(w)o(e)h(presen)o(ted)g(in)g(Section)h(5;)f(suc)o(h)g(a)g(declaration)g(is)g
+(simple|and)i(b)q(oring|)0 1616 y(to)f(pro)q(duce:)20 b(W)l(e)12
+b(require)i(that)e(the)h(elemen)o(t)g(t)o(yp)q(e)g(in)h(the)e(lea)o(v)o(es)h
+(b)q(e)h(an)e(equalit)o(y)i(t)o(yp)q(e;)f(then,)g(t)o(w)o(o)e(lea)o(v)o(es)i
+(are)0 1673 y(equal)18 b(i\013)f(they)h(con)o(tain)f(equal)h(elemen)o(ts,)g
+(and)f(t)o(w)o(o)f(branc)o(hes)i(are)f(equal)h(i\013)f(their)h(left)f(and)h
+(righ)o(t)f(subtrees)0 1729 y(are)e(equal,)g(resp)q(ectiv)o(ely)l(.)22
+b(An)o(y)15 b(other)g(t)o(w)o(o)f(trees)h(are)g(unequal:)71
+1838 y Fi(instance)46 b(\(Eq)24 b(a\))f(=>)h(Eq)f(\(Tree)h(a\))47
+b(where)166 1895 y(\(Leaf)23 b(x\))119 b(==)24 b(\(Leaf)f(y\))191
+b(=)47 b(x)24 b(==)g(y)166 1951 y(\(Branch)f(l)h(r\))f(==)h(\(Branch)f(l')g
+(r'\))48 b(=)f(l)24 b(==)g(l')f(&&)h(r)f(==)h(r')166 2008 y(_)286
+b(==)24 b(_)358 b(=)47 b(False)71 2168 y Fp(F)l(ortunately)l(,)13
+b(w)o(e)g(don't)g(need)i(to)e(go)g(through)g(this)h(tedium)g(ev)o(ery)g(time)
+g(w)o(e)f(need)i(equalit)o(y)f(op)q(erators)f(for)0 2225 y(a)f(new)i(t)o(yp)q
+(e;)f(the)g Fi(Eq)f Fp(instance)i(can)f(b)q(e)g Fo(derive)n(d)h(automatic)n
+(al)r(ly)g Fp(from)e(the)h Fi(data)f Fp(declaration)i(if)f(w)o(e)g(so)f(sp)q
+(ecify:)71 2335 y Fi(data)47 b(Tree)23 b(a)286 b(=)48 b(Leaf)23
+b(a)h(|)g(Branch)f(\(Tree)g(a\))g(\(Tree)h(a\))47 b(deriving)23
+b(Eq)0 2444 y Fp(The)16 b Fi(deriving)e Fp(clause)i(implicitly)i(pro)q(duces)
+e(an)g Fi(Eq)f Fp(instance)h(declaration)g(just)f(lik)o(e)h(the)g(one)f(in)h
+(Section)h(5.)0 2501 y(Instances)d(of)f Fi(Ord)o Fp(,)h Fi(Enum)o
+Fp(,)g Fi(Ix)o Fp(,)g Fi(Text)o Fp(,)f(and)h Fi(Binary)e Fp(can)i(also)f(b)q
+(e)h(generated)g(b)o(y)f(the)h Fi(deriving)e Fp(clause.)20
+b([More)0 2557 y(than)d(one)g(class)h(name)f(can)h(b)q(e)g(sp)q(eci\014ed,)h
+(in)f(whic)o(h)g(case)f(the)h(list)g(of)f(names)g(m)o(ust)f(b)q(e)i(paren)o
+(thesized)h(and)0 2614 y(the)c(names,)g(separated)g(b)o(y)g(commas.])p
+eop
+%%Page: 32 32
+bop 0 -40 a Fp(T-32)771 b Fj(5)45 b(TYPE)15 b(CLASSES,)h(O)o(VERLO)o(ADING,)g
+(AND)f(\\OOP")71 105 y Fp(The)g(deriv)o(ed)h Fi(Ord)f Fp(instance)h(for)f
+Fi(Tree)f Fp(is)i(sligh)o(tly)g(more)f(complicated)h(than)g(the)f
+Fi(Eq)g Fp(instance:)71 215 y Fi(instance)46 b(\(Ord)24 b(a\))f(=>)h(Ord)f
+(\(Tree)g(a\))48 b(where)166 272 y(\(Leaf)23 b(_\))119 b(<=)24
+b(\(Branch)f(_\))143 b(=)47 b(True)166 328 y(\(Leaf)23 b(x\))119
+b(<=)24 b(\(Leaf)f(y\))191 b(=)47 b(x)24 b(<=)g(y)166 385 y(\(Branch)f(_\))71
+b(<=)24 b(\(Leaf)f(_\))191 b(=)47 b(False)166 441 y(\(Branch)23
+b(l)h(r\))f(<=)h(\(Branch)f(l')g(r'\))48 b(=)f(l)24 b(==)g(l')f(&&)h(r)f(<=)h
+(r')g(||)f(l)h(<=)g(l')0 550 y Fp(This)17 b(sp)q(eci\014es)i(a)d
+Fo(lexic)n(o)n(gr)n(aphic)g Fp(order:)23 b(Constructors)15
+b(are)i(ordered)g(b)o(y)f(the)h(order)f(of)h(their)g(app)q(earance)g(in)0
+607 y(the)f Fi(data)g Fp(declaration,)h(and)g(the)f(argumen)o(ts)g(of)g(a)g
+(constructor)f(are)i(compared)f(from)g(left)g(to)g(righ)o(t.)23
+b(Recall)0 663 y(that)16 b(the)g(built-in)j(list)e(t)o(yp)q(e)g(is)g(seman)o
+(tically)g(equiv)m(alen)o(t)h(to)e(an)g(ordinary)h(t)o(w)o(o-constructor)d(t)
+o(yp)q(e.)24 b(In)17 b(fact,)0 720 y(this)f(is)f(the)h(full)g(declaration:)71
+820 y Fi(data)23 b([a])190 b(=)24 b([])g(|)f(a)h(:)g([a])f(deriving)g(\(Eq,)g
+(Ord,)h(Binary\))118 b(--)24 b(pseudocode)0 931 y Fp(\(Lists)16
+b(also)f(ha)o(v)o(e)g(a)g Fi(Text)g Fp(instance,)h(whic)o(h)g(is)g(not)f
+(deriv)o(ed.\))21 b(The)15 b(deriv)o(ed)i Fi(Eq)e Fp(and)g
+Fi(Ord)g Fp(instances)h(for)f(lists)0 988 y(are)e(the)h(usual)h(ones;)f(in)g
+(particular,)h(c)o(haracter)e(strings,)h(as)f(lists)h(of)g(c)o(haracters,)f
+(are)g(ordered)h(as)g(determined)0 1044 y(b)o(y)20 b(the)g(underlying)j
+Fi(Char)c Fp(t)o(yp)q(e,)i(with)g(an)f(initial)i(substring)f(comparing)f
+(less)h(than)f(a)g(longer)g(string;)j(for)0 1101 y(example,)16
+b Fi("cat")23 b(<)h("catalog")n Fp(.)71 1194 y(In)11 b(practice,)h
+Fi(Eq)f Fp(and)g Fi(Ord)f Fp(instances)i(are)f(almost)f(alw)o(a)o(ys)g(deriv)
+o(ed,)j(rather)d(than)h(user-de\014ned.)20 b(In)11 b(fact,)g(w)o(e)0
+1250 y(should)16 b(pro)o(vide)f(our)f(o)o(wn)g(de\014nitions)i(of)e(equalit)o
+(y)i(and)e(ordering)h(predicates)g(only)g(with)g(some)g(trepidation,)0
+1307 y(b)q(eing)i(careful)g(to)e(main)o(tain)h(the)g(exp)q(ected)h(algebraic)
+g(prop)q(erties)f(of)f(equiv)m(alence)k(relations)d(and)g(partial)g(or)0
+1363 y(total)h(orders.)28 b(An)19 b(in)o(transitiv)o(e)f Fi(\(==\))g
+Fp(predicate,)h(for)e(example,)i(could)h(b)q(e)e(disastrous,)g(confusing)h
+(readers)0 1420 y(of)f(the)g(program)f(and)h(confounding)h(man)o(ual)g(or)e
+(automatic)h(program)f(transformations)g(that)g(rely)i(on)f(the)0
+1476 y Fi(\(==\))i Fp(predicate's)h(b)q(eing)h(an)f(appro)o(ximation)f(to)g
+(de\014nitional)j(equalit)o(y)l(.)37 b(Nev)o(ertheless,)23
+b(it)e(is)g(sometimes)0 1533 y(necessary)16 b(to)f(pro)o(vide)h
+Fi(Eq)f Fp(or)g Fi(Ord)h Fp(instances)g(di\013eren)o(t)g(from)f(those)g(that)
+g(w)o(ould)h(b)q(e)g(deriv)o(ed;)h(probably)f(the)0 1589 y(most)h(imp)q
+(ortan)o(t)h(example)h(is)f(that)g(of)f(an)h(abstract)f(data)h(t)o(yp)q(e)g
+(in)h(whic)o(h)g(di\013eren)o(t)f(concrete)g(v)m(alues)i(ma)o(y)0
+1645 y(represen)o(t)15 b(the)g(same)g(abstract)g(v)m(alue.)71
+1738 y(An)h(en)o(umerated)g(t)o(yp)q(e)g(can)g(ha)o(v)o(e)f(a)h(deriv)o(ed)h
+Fi(Enum)e Fp(instance,)i(and)f(here)g(again,)g(the)g(ordering)g(is)g(that)f
+(of)0 1795 y(the)g(constructors)g(in)h(the)f Fi(data)g Fp(declaration.)20
+b(F)l(or)15 b(example:)71 1904 y Fi(data)23 b(Day)g(=)h(Sunday)f(|)h(Monday)f
+(|)h(Tuesday)f(|)g(Wednesday)285 1960 y(|)h(Thursday)f(|)h(Friday)f(|)g
+(Saturday)214 b(deriving)23 b(\(Eq,)g(Ord,)g(Enum\))272 2099
+y([Wednesday..Friday])141 b Fn(\))72 b Fi([Wednesday,)22 b(Thursday,)h
+(Friday])272 2156 y([Monday,)g(Wednesday)f(..])72 b Fn(\))g
+Fi([Monday,)23 b(Wednesday,)f(Friday])71 2295 y Fp(An)17 b(en)o(umerated)g(t)
+o(yp)q(e)h(or)e(tuple)i(\(single-constructor\))g(t)o(yp)q(e)f(all)h(of)f
+(whose)g(comp)q(onen)o(t)g(t)o(yp)q(es)g(ha)o(v)o(e)g Fi(Ix)0
+2351 y Fp(instances)f(can)f(ha)o(v)o(e)g(a)g(deriv)o(ed)h Fi(Ix)f
+Fp(instance.)21 b(\(See)15 b(Section)h Fn(x)q Fp(6.9.\))71
+2444 y(Deriv)o(ed)j Fi(Text)f Fp(instances)i(are)e(p)q(ossible)i(for)f(en)o
+(umerated)g(t)o(yp)q(es)f(and)h(other)g(t)o(yp)q(es)f(all)i(of)e(whose)h
+(com-)0 2501 y(p)q(onen)o(t)g(t)o(yp)q(es)f(also)g(ha)o(v)o(e)g
+Fi(Text)g Fp(instances.)30 b(\()p Fi(Text)17 b Fp(instances)i(for)f(most)f
+(of)h(the)g(standard)g(t)o(yp)q(es,)h(but)f(not)0 2557 y(functions,)d(are)f
+(pro)o(vided)h(b)o(y)f(the)h(Standard)f(Prelude.\))21 b(The)14
+b(textual)h(represen)o(tation)f(de\014ned)i(b)o(y)e(a)g(deriv)o(ed)0
+2614 y Fi(Text)21 b Fp(instance)h(is)f(consisten)o(t)h(with)f(the)h(app)q
+(earance)f(of)g(constan)o(t)g(Hask)o(ell)h(expressions)g(of)f(the)g(t)o(yp)q
+(e)g(in)p eop
+%%Page: 33 33
+bop 0 -40 a Fj(5.5)45 b(Num)o(b)q(ers)1575 b Fp(T-33)0 105
+y(question.)20 b(F)l(or)15 b(example,)h(if)f(w)o(e)g(add)h
+Fi(Text)e Fp(to)h(the)g Fi(deriving)f Fp(clause)i(for)f(t)o(yp)q(e)g
+Fi(Day)p Fp(,)f(ab)q(o)o(v)o(e,)h(w)o(e)g(obtain)259 209 y
+Fi(show)23 b([Monday..Wednesday])71 b Fn(\))i Fi
+("[Monday,Tuesday,Wednesday]")0 361 y Fg(5.5)56 b(Num)n(b)r(ers)0
+474 y Fp(Hask)o(ell)21 b(pro)o(vides)f(a)g(ric)o(h)g(collection)i(of)d(n)o
+(umeric)i(t)o(yp)q(es,)f(based)h(on)e(those)h(of)f(Sc)o(heme[5],)i(whic)o(h)f
+(in)h(turn)0 530 y(are)15 b(based)h(on)f(Common)g(Lisp[6)q(].)20
+b(\(Those)15 b(languages,)g(ho)o(w)o(ev)o(er,)g(are)g(dynamically)i(t)o(yp)q
+(ed.\))k(The)15 b(standard)0 587 y(t)o(yp)q(es)j(include)j(\014xed-)e(and)f
+(arbitrary-precision)h(in)o(tegers,)g(ratios)f(\(rational)f(n)o(um)o(b)q
+(ers\))i(formed)e(from)h(eac)o(h)0 643 y(in)o(teger)c(t)o(yp)q(e,)g(and)g
+(single-)h(and)f(double-precision)j(real)d(and)g(complex)h(\015oating-p)q
+(oin)o(t.)20 b(W)l(e)14 b(outline)h(here)f(the)0 700 y(basic)i(c)o
+(haracteristics)f(of)g(the)g(n)o(umeric)i(t)o(yp)q(e)e(class)g(structure)g
+(and)h(refer)f(the)g(reader)g(to)g Fn(x)p Fp(6.8)f(for)h(details.)0
+850 y Fc(5.5.1)52 b(Numeric)17 b(Class)g(Structure)0 963 y
+Fp(Returning)f(to)f(Figure)g(2,)f(w)o(e)h(notice)g(that)g(the)g(n)o(umeric)h
+(t)o(yp)q(e)f(classes)g(\(class)g Fi(Num)g Fp(and)g(those)g(that)f(lie)i(b)q
+(elo)o(w)0 1019 y(it\))h(accoun)o(t)f(for)g(more)g(than)h(half)g(of)f(the)h
+(standard)f(classes.)24 b(W)l(e)17 b(also)g(note)f(that)g Fi(Num)g
+Fp(is)h(a)g(sub)q(class)g(of)g Fi(Eq)o Fp(,)0 1076 y(but)c(not)f(of)h
+Fi(Ord)o Fp(;)h(this)f(is)g(b)q(ecause)h(the)f(order)f(predicates)i(do)f(not)
+f(apply)i(to)e(complex)i(n)o(um)o(b)q(ers.)19 b(The)13 b(sub)q(class)0
+1132 y Fi(Real)i Fp(of)f Fi(Num)p Fp(,)h(ho)o(w)o(ev)o(er,)f(is)h(a)g(sub)q
+(class)i(of)d Fi(Ord)h Fp(as)g(w)o(ell.)71 1215 y(The)k Fi(Num)f
+Fp(class)i(pro)o(vides)f(sev)o(eral)g(basic)h(op)q(erations)f(common)g(to)f
+(all)i(n)o(umeric)g(t)o(yp)q(es;)h(these)e(include,)0 1271
+y(among)14 b(others,)h(addition,)h(subtraction,)f(negation,)g(m)o
+(ultiplication,)i(and)e(absolute)h(v)m(alue:)71 1380 y Fi(\(+\),)23
+b(\(-\),)g(\(*\))262 b(::)24 b(\(Num)f(a\))h(=>)f(a)h(->)g(a)f(->)h(a)71
+1437 y(negate,)e(abs)310 b(::)24 b(\(Num)f(a\))h(=>)f(a)h(->)g(a)0
+1548 y Fp([)p Fi(negate)10 b Fp(is)h(the)g(function)h(applied)h(b)o(y)e(Hask)
+o(ell's)g(only)h(pre\014x)f(op)q(erator,)g(min)o(us;)i(w)o(e)d(can't)h(call)h
+(it)f Fi(\(-\))p Fp(,)g(b)q(ecause)0 1605 y(that)j(is)h(the)g(subtraction)g
+(function,)g(so)g(this)g(name)g(is)g(pro)o(vided)h(instead.)k(F)l(or)14
+b(example,)i Fi(-x*y)e Fp(is)h(equiv)m(alen)o(t)0 1661 y(to)d
+Fi(negate)23 b(\(x*y\))o Fp(.)c(\(Pre\014x)12 b(min)o(us)h(has)f(the)g(same)g
+(syn)o(tactic)g(precedence)i(as)e(in\014x)h(min)o(us,)g(whic)o(h,)g(of)f
+(course,)0 1718 y(is)k(lo)o(w)o(er)f(than)g(that)f(of)h(m)o
+(ultiplication.\)])71 1801 y(Note)d(that)h Fi(Num)g Fp(do)q(es)g
+Fo(not)h Fp(pro)o(vide)f(a)g(division)j(op)q(erator;)c(t)o(w)o(o)g
+(di\013eren)o(t)i(kinds)g(of)f(division)i(op)q(erators)d(are)0
+1857 y(pro)o(vided)k(in)g(t)o(w)o(o)e(non-o)o(v)o(erlapping)i(sub)q(classes)g
+(of)f Fi(Num)p Fp(:)71 1940 y(The)i(class)h Fi(Integral)e Fp(pro)o(vides)i
+(whole-n)o(um)o(b)q(er)h(division)g(and)f(remainder)g(op)q(erations,)f(as)g
+(w)o(ell)i(as)e(the)0 1996 y Fi(even)e Fp(and)h Fi(odd)g Fp(predicates.)23
+b(The)16 b(standard)f(instances)i(of)e Fi(Integral)g Fp(are)h
+Fi(Integer)f Fp(\(un)o(b)q(ounded)i(or)e(math-)0 2053 y(ematical)20
+b(in)o(tegers,)f(also)g(kno)o(wn)g(as)g(\\bign)o(ums"\))f(and)i
+Fi(Int)e Fp(\(b)q(ounded,)j(mac)o(hine)f(in)o(tegers,)f(with)h(a)e(range)0
+2109 y(equiv)m(alen)o(t)i(to)f(at)f(least)h(29-bit)f(signed)i(binary\).)31
+b(A)19 b(particular)g(Hask)o(ell)h(implemen)o(tation)g(migh)o(t)e(pro)o(vide)
+0 2166 y(other)d(in)o(tegral)g(t)o(yp)q(es)g(in)g(addition)h(to)f(these.)20
+b(Note)14 b(that)g Fi(Integral)g Fp(is)h(a)g(sub)q(class)h(of)e
+Fi(Real)p Fp(,)g(rather)h(than)f(of)0 2222 y Fi(Num)h Fp(directly;)h(this)g
+(means)f(that)f(there)h(is)h(no)f(attempt)g(to)f(pro)o(vide)i(Gaussian)f(in)o
+(tegers.)71 2305 y(All)23 b(other)e(n)o(umeric)i(t)o(yp)q(es)e(fall)i(in)g
+(the)f(class)g Fi(Fractional)n Fp(,)h(whic)o(h)g(pro)o(vides)f(the)g
+(ordinary)g(division)0 2361 y(op)q(erator)13 b Fi(\(/\))p Fp(.)19
+b(The)c(further)e(sub)q(class)j Fi(Floating)d Fp(con)o(tains)h
+(trigonometric,)f(logarithmic,)i(and)f(exp)q(onen)o(tial)0
+2418 y(functions.)71 2501 y(The)j Fi(RealFrac)g Fp(sub)q(class)h(of)g
+Fi(Fractional)e Fp(and)i Fi(Real)f Fp(pro)o(vides)h(a)f(function)h
+Fi(properFraction)n Fp(,)g(whic)o(h)0 2557 y(decomp)q(oses)e(a)f(n)o(um)o(b)q
+(er)h(in)o(to)f(its)h(whole)g(and)g(fractional)f(parts,)g(and)g(a)g
+(collection)j(of)d(functions)h(that)f(round)0 2614 y(to)g(in)o(tegral)g(v)m
+(alues)h(b)o(y)g(di\013ering)g(rules:)p eop
+%%Page: 34 34
+bop 0 -40 a Fp(T-34)771 b Fj(5)45 b(TYPE)15 b(CLASSES,)h(O)o(VERLO)o(ADING,)g
+(AND)f(\\OOP")71 160 y Fi(properFraction)236 b(::)24 b(\(Fractional)e(a,)i
+(Integral)f(b\))g(=>)h(a)g(->)f(\(b,a\))71 216 y(truncate,)f(round,)71
+272 y(floor,)h(ceiling:)213 b(::)24 b(\(Fractional)e(a,)i(Integral)f(b\))g
+(=>)h(a)g(->)f(b)71 453 y Fp(The)d Fi(RealFloat)f Fp(sub)q(class)j(of)e
+Fi(Floating)f Fp(and)i Fi(RealFrac)e Fp(pro)o(vides)i(some)f(sp)q(ecialized)j
+(functions)f(for)0 509 y(e\016cien)o(t)c(access)g(to)f(the)h(comp)q(onen)o
+(ts)g(of)f(a)g(\015oating-p)q(oin)o(t)i(n)o(um)o(b)q(er,)f(the)g
+Fo(exp)n(onent)f Fp(and)g Fo(signi\014c)n(and)p Fp(.)26 b(The)0
+566 y(standard)15 b(t)o(yp)q(es)g Fi(Float)f Fp(and)i Fi(Double)e
+Fp(fall)i(in)g(class)g Fi(RealFloat)o Fp(.)0 782 y Fc(5.5.2)52
+b(Constructed)17 b(Num)o(b)q(ers)0 924 y Fp(Of)h(the)g(standard)f(n)o(umeric)
+i(t)o(yp)q(es,)f Fi(Int)p Fp(,)g Fi(Integer)o Fp(,)g Fi(Float)o
+Fp(,)g(and)g Fi(Double)f Fp(are)h(primitiv)o(e.)29 b(The)18
+b(others)f(are)0 981 y(made)e(from)g(these)g(b)o(y)g(t)o(yp)q(e)g
+(constructors:)71 1083 y Fi(Complex)e Fp(is)i(a)g(t)o(yp)q(e)f(constructor)g
+(that)g(mak)o(es)g(a)h(complex)g(t)o(yp)q(e)g(in)g(class)g
+Fi(Floating)f Fp(from)g(a)g Fi(RealFloat)0 1140 y Fp(t)o(yp)q(e:)71
+1249 y Fi(data)23 b(\(RealFloat)f(a\))i(=>)g(Complex)e(a)i(=)g(a)g(:+)f(a)48
+b(deriving)23 b(\(Eq,)g(Binary,)g(Text\))0 1358 y Fp(Notice)14
+b(the)f(con)o(text)g Fi(\(RealFloat)23 b(a\))g(=>)p Fp(,)13
+b(whic)o(h)i(restricts)e(the)g(argumen)o(t)g(t)o(yp)q(e;)g(th)o(us,)h(the)f
+(standard)g(com-)0 1414 y(plex)18 b(t)o(yp)q(es)g(are)f Fi(Complex)23
+b(Float)17 b Fp(and)g Fi(Complex)23 b(Double)o Fp(.)k(W)l(e)17
+b(can)h(also)f(see)h(from)f(the)g Fi(data)g Fp(declaration)0
+1471 y(that)12 b(a)g(complex)i(n)o(um)o(b)q(er)e(is)h(written)g
+Fo(x)18 b Fi(:+)12 b Fo(y)t Fp(;)i(the)e(argumen)o(ts)g(are)g(the)h
+(cartesian)f(real)h(and)g(imaginary)g(parts,)0 1527 y(resp)q(ectiv)o(ely)l(.)
+22 b(Since)16 b Fi(:+)f Fp(is)h(a)f(data)f(constructor,)g(w)o(e)h(can)h(use)f
+(it)h(in)g(pattern)e(matc)o(hing:)71 1636 y Fi(conjugate)356
+b(::)24 b(\(RealFloat)e(a\))i(=>)g(Complex)e(a)i(->)g(Complex)f(a)71
+1693 y(conjugate)f(\(x:+y\))190 b(=)48 b(x)24 b(:+)f(\(-y\))71
+1873 y Fp(Similarly)l(,)15 b(the)f(t)o(yp)q(e)g(constructor)f
+Fi(Ratio)f Fp(mak)o(es)h(a)h(rational)f(t)o(yp)q(e)h(in)g(class)g
+Fi(RealFrac)f Fp(from)g(an)g(instance)0 1929 y(of)k Fi(Integral)o
+Fp(.)26 b(\()p Fi(Rational)16 b Fp(is)i(a)f(t)o(yp)q(e)h(synon)o(ym)f(for)g
+Fi(Ratio)23 b(Integer)o Fp(.\))j Fi(Ratio)o Fp(,)18 b(ho)o(w)o(ev)o(er,)f(is)
+h(an)f(abstract)0 1986 y(t)o(yp)q(e)h(constructor,)g(b)q(eing)h(de\014ned)h
+(in)f(the)f(Prelude)h(mo)q(dule)h Fi(PreludeRatio)n Fp(,)e(from)g(whic)o(h)h
+(it)f(is)h(exp)q(orted)0 2042 y(without)d(its)g(data)f(constructor;)g(th)o
+(us,)h(ratios)f(cannot)h(b)q(e)g(pattern-matc)o(hed.)22 b(Instead,)16
+b(a)g(function)g(to)g(form)0 2099 y(a)f(ratio)g(from)f(t)o(w)o(o)g(in)o
+(tegers)h(is)h(pro)o(vided,)g(as)e(w)o(ell)j(as)d(comp)q(onen)o(t)i
+(extraction)f(functions:)71 2208 y Fi(\(\045\))500 b(::)24
+b(\(Integral)f(a\))g(=>)h(a)f(->)h(a)g(->)f(Ratio)h(a)71 2264
+y(numerator,)e(denominator)46 b(::)24 b(\(Integral)f(a\))g(=>)h(Ratio)f(a)h
+(->)f(a)71 2444 y Fp(Wh)o(y)17 b(the)g(di\013erence?)29 b(Complex)19
+b(n)o(um)o(b)q(ers)e(in)i(cartesian)e(form)g(are)h(unique|there)h(are)e(no)h
+(non)o(trivial)0 2501 y(iden)o(tities)g(in)o(v)o(olving)g Fi(:+)p
+Fp(.)23 b(On)17 b(the)f(other)h(hand,)f(ratios)g(are)g(not)g(unique,)i(but)f
+(ha)o(v)o(e)f(a)g(canonical)h(\(reduced\))0 2557 y(form)h(that)f(the)i
+(implemen)o(tation)h(of)e(the)g(abstract)g(data)g(t)o(yp)q(e)g(m)o(ust)g
+(main)o(tain;)i(it)f(is)g(not)f(necessarily)i(the)0 2614 y(case,)14
+b(for)h(instance,)g(that)f Fi(numerator)23 b(\(x\045y\))14
+b Fp(is)h(equal)g(to)f Fi(x)p Fp(,)h(although)g(the)g(real)g(part)f(of)g
+Fi(x:+y)g Fp(is)i(alw)o(a)o(ys)e Fi(x)o Fp(.)p eop
+%%Page: 35 35
+bop 0 -40 a Fj(5.5)45 b(Num)o(b)q(ers)1575 b Fp(T-35)0 105
+y Fc(5.5.3)52 b(Numeric)17 b(Co)q(ercions)h(and)g(Ov)o(erloaded)f(Literals)0
+269 y Fp(The)e(Standard)h(Prelude)g(pro)o(vides)g(sev)o(eral)f(o)o(v)o
+(erloaded)g(functions)h(that)f(serv)o(e)g(as)f(explicit)k(co)q(ercions:)71
+378 y Fi(fromInteger)308 b(::)24 b(\(Num)f(a\))h(=>)f(Integer)g(->)h(a)71
+435 y(fromRational)284 b(::)24 b(\(Fractional)e(a\))i(=>)f(Rational)g(->)h(a)
+71 491 y(toInteger)356 b(::)24 b(\(Integral)f(a\))g(=>)h(a)f(->)h(Integer)71
+548 y(toRational)332 b(::)24 b(\(RealFrac)f(a\))g(=>)h(a)f(->)h(Rational)71
+604 y(fromIntegral)284 b(::)24 b(\(Integral)f(a,)g(Num)h(b\))f(=>)h(a)f(->)h
+(b)71 661 y(fromRealFrac)284 b(::)24 b(\(RealFrac)f(a,)g(Fractional)g(b\))g
+(=>)h(a)g(->)f(b)71 740 y(fromIntegral)284 b(=)48 b(fromInteger)22
+b(.)i(toInteger)71 797 y(fromRealFrac)284 b(=)48 b(fromRational)22
+b(.)i(toRational)71 992 y Fp(Tw)o(o)18 b(of)h(these)g(are)g(implicitly)k
+(used)c(to)g(pro)o(vide)h(o)o(v)o(erloaded)f(n)o(umeric)h(literals:)29
+b(An)20 b(in)o(teger)g(n)o(umeral)0 1049 y(\(without)c(a)g(decimal)i(p)q(oin)
+o(t\))e(is)h(actually)g(equiv)m(alen)o(t)h(to)e(an)g(application)i(of)e
+Fi(fromInteger)f Fp(to)g(the)i(v)m(alue)g(of)0 1105 y(the)i(n)o(umeral)g(as)f
+(an)h Fi(Integer)o Fp(.)31 b(Similarly)l(,)21 b(a)e(\015oating)g(n)o(umeral)g
+(\(with)g(a)f(decimal)i(p)q(oin)o(t\))f(is)h(regarded)e(as)0
+1162 y(an)e(application)h(of)e Fi(fromRational)g Fp(to)g(the)h(v)m(alue)h(of)
+e(the)h(n)o(umeral)g(as)f(a)h Fi(Rational)o Fp(.)21 b(Th)o(us,)16
+b Fi(7)f Fp(has)h(the)g(t)o(yp)q(e)0 1218 y Fi(\(Num)23 b(a\))h(=>)f(a)p
+Fp(,)18 b(and)f Fi(7.3)g Fp(has)g(the)h(t)o(yp)q(e)f Fi(Fractional)23
+b(a)g(=>)h(a)p Fp(.)i(This)18 b(means)f(that)g(w)o(e)g(can)g(use)h(n)o
+(umeric)0 1274 y(literals)e(in)g(generic)h(n)o(umeric)f(functions,)f(for)g
+(example:)71 1383 y Fi(halve)452 b(::)24 b(\(Fractional)e(a\))i(=>)f(a)h(->)g
+(a)71 1440 y(halve)f(x)405 b(=)48 b(x)24 b(*)f(0.5)0 1549 y
+Fp(This)16 b(rather)e(indirect)i(w)o(a)o(y)e(of)h(o)o(v)o(erloading)g(n)o
+(umerals)g(has)g(the)g(additional)i(adv)m(an)o(tage)d(that)g(the)h(metho)q(d)
+g(of)0 1605 y(in)o(terpreting)f(a)g(n)o(umeral)g(as)f(a)g(n)o(um)o(b)q(er)h
+(of)f(a)g(giv)o(en)i(t)o(yp)q(e)e(can)h(b)q(e)g(sp)q(eci\014ed)i(in)e(an)g
+Fi(Integral)e Fp(or)h Fi(Fractional)0 1662 y Fp(instance)j(declaration)g
+(\(since)g Fi(fromInteger)d Fp(and)i Fi(fromRational)f Fp(are)g(op)q(erators)
+g(of)h(those)g(classes,)g(resp)q(ec-)0 1718 y(tiv)o(ely\).)20
+b(F)l(or)15 b(example,)h(the)f Fi(Num)g Fp(instance)h(of)e
+Fi(\(RealFloat)23 b(a\))g(=>)h(Complex)f(a)15 b Fp(con)o(tains)g(this)h
+(metho)q(d:)71 1830 y Fi(fromInteger)22 b(x)262 b(=)48 b(fromInteger)22
+b(x)i(:+)g(0)0 1939 y Fp(This)15 b(sa)o(ys)f(that)g(a)h Fi(Complex)f
+Fp(instance)h(of)g Fi(fromInteger)e Fp(is)i(de\014ned)h(to)e(pro)q(duce)i(a)e
+(complex)i(n)o(um)o(b)q(er)f(whose)0 1995 y(real)h(part)e(is)i(supplied)i(b)o
+(y)d(an)g(appropriate)g Fi(RealFloat)f Fp(instance)j(of)d Fi(fromInteger)o
+Fp(.)20 b(In)c(this)g(manner,)f(ev)o(en)0 2052 y(user-de\014ned)i(n)o(umeric)
+f(t)o(yp)q(es)f(\(sa)o(y)l(,)f(quaternions\))i(can)f(mak)o(e)g(use)g(of)g(o)o
+(v)o(erloaded)g(n)o(umerals.)71 2170 y(As)g(another)g(example,)g(recall)i
+(our)d(\014rst)h(de\014nition)i(of)e Fi(succ)g Fp(from)f(Section)i(2:)71
+2279 y Fi(succ)23 b(::)g(Int)h(->)g(Int)71 2335 y(succ)f(n)h(=)f(n+1)0
+2444 y Fp(Ignoring)15 b(the)g(t)o(yp)q(e)f(signature,)g(the)h(most)f(general)
+h(t)o(yp)q(e)f(of)g Fi(succ)g Fp(is)h Fi(\(Num)23 b(a\))h(=>)g(a->a)o
+Fp(.)c(The)14 b(explicit)j(t)o(yp)q(e)0 2501 y(signature)h(is)g(legal,)h(ho)o
+(w)o(ev)o(er,)e(since)i(it)f(is)g Fo(mor)n(e)g(sp)n(e)n(ci\014c)e
+Fp(than)i(the)g(principal)i(t)o(yp)q(e)d(\(a)g(more)h(general)g(t)o(yp)q(e)0
+2557 y(signature)e(w)o(ould)g(cause)g(a)f(static)g(error\).)20
+b(The)c(t)o(yp)q(e)g(signature)g(has)f(the)h(e\013ect)f(of)h(restricting)g
+Fi(succ)o Fp('s)f(t)o(yp)q(e,)0 2614 y(and)g(in)h(this)g(case)f(w)o(ould)h
+(cause)f(something)h(lik)o(e)g Fi(succ)23 b(\(1::Float\))14
+b Fp(to)h(b)q(e)h(ill-t)o(yp)q(ed.)p eop
+%%Page: 36 36
+bop 0 -40 a Fp(T-36)771 b Fj(5)45 b(TYPE)15 b(CLASSES,)h(O)o(VERLO)o(ADING,)g
+(AND)f(\\OOP")0 105 y Fc(5.5.4)52 b(Default)18 b(Numeric)g(T)o(yp)q(es)0
+216 y Fp(Consider)e(the)f(follo)o(wing)h(function)g(de\014nition:)71
+325 y Fi(rms)500 b(::)24 b(\(Floating)f(a\))g(=>)h(a)f(->)h(a)g(->)f(a)71
+381 y(rms)g(x)h(y)405 b(=)48 b(sqrt)23 b(\(\(x^2)g(+)h(y^2\))f(*)h(0.5\))0
+493 y Fp(The)c(exp)q(onen)o(tiation)g(function)g Fi(\(^\))f
+Fp(\(one)g(of)g(three)g(di\013eren)o(t)h(standard)f(exp)q(onen)o(tiation)h
+(op)q(erators)f(with)0 549 y(di\013eren)o(t)13 b(t)o(ypings,)g(see)g
+Fn(x)p Fp(6.8.5\))e(has)h(the)h(t)o(yp)q(e)g Fi(\(Num)23 b(a,)h(Integral)e
+(b\))i(=>)g(a)f(->)h(b)g(->)f(a)p Fp(,)13 b(and)g(since)h Fi(2)e
+Fp(has)0 606 y(the)k(t)o(yp)q(e)f Fi(\(Num)24 b(a\))f(=>)h(a)p
+Fp(,)15 b(the)h(t)o(yp)q(e)g(of)f Fi(x^2)g Fp(is)h Fi(\(Num)23
+b(a,)h(Integral)f(b\))g(=>)h(a)p Fp(.)d(This)16 b(is)g(a)g(problem;)g(there)0
+662 y(is)g(no)g(w)o(a)o(y)e(to)i(resolv)o(e)f(the)h(o)o(v)o(erloading)g(asso)
+q(ciated)g(with)g(the)g(t)o(yp)q(e)f(v)m(ariable)i Fi(b)p Fp(,)f(since)g(it)g
+(is)h(in)f(the)g(con)o(text,)0 719 y(but)j(has)f(otherwise)h(v)m(anished)i
+(from)d(the)g(t)o(yp)q(e)h(expression.)31 b(Essen)o(tially)l(,)21
+b(the)e(programmer)e(has)i(sp)q(eci\014ed)0 775 y(that)e Fi(x)h
+Fp(should)g(b)q(e)h(squared,)f(but)f(has)h(not)f(sp)q(eci\014ed)j(whether)e
+(it)g(should)h(b)q(e)f(squared)g(with)g(an)g Fi(Int)f Fp(or)g(an)0
+832 y Fi(Integer)d Fp(v)m(alue)j(of)d(t)o(w)o(o.)19 b(Of)c(course,)g(w)o(e)g
+(can)g(\014x)h(this:)71 942 y Fi(rms)23 b(x)h(y)405 b(=)48
+b(sqrt)23 b(\(\(x)h(^)f(\(2::Int\))g(+)h(y)g(^)f(\(2::Int\)\))g(*)h(0.5\))0
+1051 y Fp(It's)15 b(ob)o(vious)g(that)g(this)g(sort)g(of)f(thing)i(will)h(so)
+q(on)e(gro)o(w)f(tiresome,)h(ho)o(w)o(ev)o(er.)71 1132 y(In)g(fact,)g(this)g
+(kind)i(of)d(o)o(v)o(erloading)i(am)o(biguit)o(y)f(is)h(not)f(restricted)g
+(to)g(n)o(um)o(b)q(ers:)71 1241 y Fi(show)23 b(\(read)g("xyz"\))0
+1350 y Fp(As)d(what)f(t)o(yp)q(e)h(is)g(the)g(string)f(supp)q(osed)i(to)e(b)q
+(e)h(read?)35 b(This)20 b(is)g(more)f(serious)h(than)g(the)g(exp)q(onen)o
+(tiation)0 1407 y(am)o(biguit)o(y)l(,)14 b(b)q(ecause)h(there,)f(an)o(y)f
+Fi(Integral)g Fp(instance)i(will)g(do,)f(whereas)g(here,)g(v)o(ery)f
+(di\013eren)o(t)h(b)q(eha)o(vior)h(can)0 1463 y(b)q(e)h(exp)q(ected)g(dep)q
+(ending)i(on)d(what)f(instance)i(of)f Fi(Text)g Fp(is)h(used)f(to)g(resolv)o
+(e)g(the)h(am)o(biguit)o(y)l(.)71 1545 y(Because)h(of)f(the)g(di\013erence)i
+(b)q(et)o(w)o(een)f(the)f(n)o(umeric)i(and)e(general)h(cases)g(of)f(the)g(o)o
+(v)o(erloading)h(am)o(biguit)o(y)0 1601 y(problem,)24 b(Hask)o(ell)e(pro)o
+(vides)g(a)g(solution)g(that)f(is)h(restricted)g(to)f(n)o(um)o(b)q(ers:)33
+b(Eac)o(h)22 b(mo)q(dule)h(ma)o(y)e(con)o(tain)0 1658 y(a)h
+Fo(default)h(de)n(clar)n(ation,)g Fp(consisting)g(of)f(the)g(k)o(eyw)o(ord)g
+Fi(default)f Fp(follo)o(w)o(ed)i(b)o(y)f(a)g(paren)o(thesized,)i(comma-)0
+1714 y(separated)17 b(list)h(of)f(n)o(umeric)h(monot)o(yp)q(es)f(\(t)o(yp)q
+(es)h(with)f(no)h(v)m(ariables\).)27 b(When)18 b(an)f(am)o(bigous)g(t)o(yp)q
+(e)h(v)m(ariable)0 1770 y(is)h(disco)o(v)o(ered)f(\(suc)o(h)h(as)e
+Fi(b)p Fp(,)i(ab)q(o)o(v)o(e\),)f(if)g(at)g(least)g(one)g(of)g(its)h(classes)
+f(is)h(n)o(umeric)g(and)f(all)h(of)f(its)h(classes)f(are)0
+1827 y(standard,)d(the)g(default)h(list)h(is)f(consulted,)g(and)f(the)h
+(\014rst)f(t)o(yp)q(e)g(from)g(the)h(list)g(that)f(will)i(satisfy)e(the)h
+(con)o(text)0 1883 y(of)g(the)h(t)o(yp)q(e)g(v)m(ariable)h(is)f(used.)25
+b(F)l(or)16 b(example,)h(if)h(the)e(default)i(declaration)f
+Fi(default)23 b(\(Int,)g(Float\))16 b Fp(is)h(in)0 1940 y(e\013ect,)e(the)g
+(am)o(biguous)g(exp)q(onen)o(t)h(ab)q(o)o(v)o(e)f(will)h(b)q(e)g(resolv)o(ed)
+g(as)f(t)o(yp)q(e)g Fi(Int)p Fp(.)k(\(See)d Fn(x)p Fp(4.3.4)e(for)g(more)h
+(details.\))71 2021 y(The)f(\\default)h(default")g(is)g Fi(\(Int,)23
+b(Double\))o Fp(,)15 b(but)f Fi(\(Integer,)23 b(Rational,)g(Double\))13
+b Fp(ma)o(y)h(also)h(b)q(e)g(ap-)0 2078 y(propriate.)20 b(V)l(ery)15
+b(cautious)h(programmers)e(ma)o(y)g(prefer)i Fi(default)22
+b(\(\))p Fp(,)15 b(whic)o(h)h(pro)o(vides)g(no)f(defaults.)p
+eop
+%%Page: 37 37
+bop 1857 -40 a Fp(T-37)0 105 y Fq(6)69 b(Mo)r(dules)0 237 y
+Fp(A)o(t)14 b(the)h(top)f(lev)o(el,)i(a)f(Hask)o(ell)g(program)f(consists)h
+(of)f(a)h(collection)h(of)f Fo(mo)n(dules)p Fp(.)k(A)c(mo)q(dule)h(in)g(Hask)
+o(ell)f(serv)o(es)0 294 y(the)g(dual)h(purp)q(ose)g(of)f(con)o(trolling)h
+(name-spaces)g(and)f(creating)g(abstract)g(data)f(t)o(yp)q(es.)71
+379 y(The)19 b(top)f(lev)o(el)i(of)f(a)g(mo)q(dule)h(con)o(tains)f(an)o(y)f
+(of)h(the)g(v)m(arious)g(declarations)h(w)o(e)e(ha)o(v)o(e)h(discussed:)29
+b(\014xit)o(y)0 435 y(declarations,)15 b(data)f(and)h(t)o(yp)q(e)g
+(declarations,)g(class)g(and)f(instance)i(declarations,)f(t)o(yp)q(e)g
+(signatures,)f(function)0 492 y(de\014nitions,)k(and)e(pattern)f(bindings.)25
+b(Except)16 b(for)f(the)h(fact)g(that)f(\014xit)o(y)h(declarations)h(and)f
+(imp)q(ort)g(declara-)0 548 y(tions)i(\(to)f(b)q(e)i(describ)q(ed)h
+(shortly\))e(m)o(ust)f(app)q(ear)h(\014rst,)g(the)h(declarations)f(ma)o(y)g
+(app)q(ear)g(in)h(an)o(y)e(order)h(\(the)0 605 y(top-lev)o(el)e(scop)q(e)g
+(is)g(m)o(utually)g(recursiv)o(e\).)71 690 y(Hask)o(ell's)d(mo)q(dule)g
+(design)h(is)f(relativ)o(ely)g(conserv)m(ativ)o(e:)19 b(The)13
+b(namespace)g(of)f(mo)q(dules)i(is)f(completely)h(\015at,)0
+746 y(and)h(mo)q(dules)i(are)d(in)j(no)e(w)o(a)o(y)f(\\\014rst-class.")19
+b(Mo)q(dule)d(names)g(are)e(alphan)o(umeric)j(and)e(m)o(ust)g(b)q(egin)i
+(with)e(an)0 803 y(upp)q(ercase)g(letter.)20 b(There)14 b(is)h(no)f(formal)f
+(connection)i(b)q(et)o(w)o(een)g(a)e(Hask)o(ell)i(mo)q(dule)h(and)e(the)g
+(\014le)h(system)f(that)0 859 y(w)o(ould)i(\(t)o(ypically\))h(supp)q(ort)f
+(it.)22 b(In)17 b(particular,)f(there)g(is)h(no)f(connection)h(b)q(et)o(w)o
+(een)f(mo)q(dule)h(names)f(and)g(\014le)0 916 y(names,)g(and)g(more)g(than)g
+(one)g(mo)q(dule)h(could)g(conceiv)m(ably)i(reside)e(in)g(a)f(single)h
+(\014le)g(\(one)f(mo)q(dule)h(ma)o(y)f(ev)o(en)0 972 y(span)g(sev)o(eral)f
+(\014les\).)22 b(Of)15 b(course,)h(a)f(particular)h(implemen)o(tation)h(will)
+g(most)e(lik)o(ely)i(adopt)e(con)o(v)o(en)o(tions)h(that)0
+1029 y(mak)o(e)f(the)g(connection)h(b)q(et)o(w)o(een)g(mo)q(dules)g(and)f
+(\014les)i(more)d(stringen)o(t.)71 1114 y(T)l(ec)o(hnically)h(sp)q(eaking,)f
+(a)f(mo)q(dule)h(is)g(really)g(just)f(one)g(big)h(declaration)g(whic)o(h)g(b)
+q(egins)g(with)g(the)f(k)o(eyw)o(ord)0 1170 y Fi(module)o Fp(;)i(here's)g(an)
+g(example)h(for)f(a)g(mo)q(dule)h(whose)f(name)g(is)h Fi(Tree)p
+Fp(:)71 1279 y Fi(module)23 b(Tree)g(\()h(Tree\(Leaf,Branch\),)d(fringe)i(\))
+h(where)71 1359 y(data)f(Tree)g(a)382 b(=)24 b(Leaf)f(a)h(|)f(Branch)g
+(\(Tree)h(a\))f(\(Tree)g(a\))71 1439 y(fringe)g(::)g(Tree)h(a)f(->)h([a])71
+1495 y(fringe)f(\(Leaf)g(x\))286 b(=)24 b([x])71 1551 y(fringe)f(\(Branch)g
+(left)g(right\))g(=)h(fringe)f(left)g(++)h(fringe)f(right)0
+1661 y Fp(The)14 b(t)o(yp)q(e)g Fi(Tree)f Fp(and)h(the)g(function)h
+Fi(fringe)e Fp(should)i(b)q(e)g(familiar;)f(they)g(w)o(ere)g(giv)o(en)g(as)g
+(examples)g(in)h(Section)0 1717 y(2.3.)29 b([Because)19 b(of)f(the)h
+Fi(where)f Fp(k)o(eyw)o(ord,)g(la)o(y)o(out)g(is)h(activ)o(e)g(at)e(the)i
+(top)f(lev)o(el)i(of)e(a)h(mo)q(dule,)h(and)e(th)o(us)h(the)0
+1773 y(declarations)f(m)o(ust)e(all)i(line)g(up)f(in)h(the)f(same)f(column)i
+(\(t)o(ypically)g(the)f(\014rst\).)24 b(Also)17 b(note)g(that)f(the)h(mo)q
+(dule)0 1830 y(name)e(is)h(the)f(same)g(as)g(that)f(of)h(the)g(t)o(yp)q(e;)g
+(this)h(is)g(allo)o(w)o(ed.])71 1915 y(This)e(mo)q(dule)h(explicitly)i
+Fo(exp)n(orts)d Fi(Tree)o Fp(,)g Fi(Leaf)o Fp(,)g Fi(Branch)o
+Fp(,)g(and)g Fi(fringe)o Fp(.)20 b(If)14 b(the)g(exp)q(ort)g(list)g(follo)o
+(wing)h(the)0 1972 y Fi(module)10 b Fp(k)o(eyw)o(ord)g(is)h(omitted,)g
+Fo(al)r(l)g Fp(of)f(the)h(names)g(b)q(ound)h(at)e(the)h(top)f(lev)o(el)i(of)f
+(the)f(mo)q(dule)i(w)o(ould)g(b)q(e)f(exp)q(orted.)0 2028 y(\(In)h(the)h(ab)q
+(o)o(v)o(e)e(example)i(ev)o(erything)g(is)f(explicitly)j(exp)q(orted,)e(so)e
+(the)i(e\013ect)e(w)o(ould)i(b)q(e)g(the)f(same.\))18 b(Note)12
+b(that)0 2084 y(the)k(name)f(of)g(a)h(t)o(yp)q(e)f(and)h(its)g(constructors)f
+(m)o(ust)g(b)q(e)h(group)q(ed)g(together,)f(as)g(in)h Fi(Tree\(Leaf,Branch\))
+n Fp(.)21 b(As)0 2141 y(short-hand,)15 b(w)o(e)g(could)h(also)f(write)g
+Fi(Tree\(..\))f Fp(\(exp)q(orting)i(a)f(subset)g(of)g(the)g(constructors)f
+(is)i(not)f(allo)o(w)o(ed\).)71 2226 y(The)g Fi(Tree)g Fp(mo)q(dule)h(ma)o(y)
+e(no)o(w)h(b)q(e)h Fo(imp)n(orte)n(d)g Fp(in)o(to)f(some)g(other)f(mo)q
+(dule:)71 2335 y Fi(module)23 b(Main)g(\(main\))g(where)71
+2392 y(import)g(Tree)g(\()h(Tree\(Leaf,Branch\),)d(fringe)i(\))71
+2448 y(main)g(::)g(Dialogue)71 2504 y(main)g(=)h(print)f(\(fringe)g(\(Branch)
+g(\(Leaf)g(1\))g(\(Leaf)h(2\)\)\))0 2614 y Fp(The)16 b(v)m(arious)g(items)g
+(b)q(eing)g(imp)q(orted)g(in)o(to)g(and)g(exp)q(orted)g(out)f(of)g(a)g(mo)q
+(dule)i(are)e(called)i Fo(entities)p Fp(.)j(Note)15 b(the)p
+eop
+%%Page: 38 38
+bop 0 -40 a Fp(T-38)1557 b Fj(6)46 b(MODULES)0 105 y Fp(explicit)21
+b(imp)q(ort)d(list)h(in)h(the)e(imp)q(ort)h(declaration;)h(omitting)f(it)g(w)
+o(ould)g(cause)f(all)i(en)o(tities)f(exp)q(orted)g(from)0 162
+y Fi(Tree)c Fp(to)f(b)q(e)i(imp)q(orted.)71 244 y(The)c(en)o(tit)o(y)h
+Fi(main)e Fp(\(and)i(its)f(t)o(yping\))h(and)f(the)h(mo)q(dule)g(name)g
+Fi(Main)o Fp(,)g(in)g(the)g(ab)q(o)o(v)o(e)f(example,)h(ha)o(v)o(e)f(sp)q
+(ecial)0 300 y(signi\014cance,)17 b(as)e(sp)q(eci\014ed)i(in)f(the)f(Rep)q
+(ort:)71 383 y(\\A)d(Hask)o(ell)i Fo(pr)n(o)n(gr)n(am)g Fp(is)f(a)g
+(collection)i(of)d(mo)q(dules,)j(one)e(of)f(whic)o(h,)i(b)o(y)f(con)o(v)o(en)
+o(tion,)h(m)o(ust)e(b)q(e)i(called)h Fi(Main)0 439 y Fp(and)j(m)o(ust)f(exp)q
+(ort)g(the)h(v)m(alue)h Fi(main)o Fp(.)27 b(The)18 b Fo(value)g
+Fp(of)f(the)h(program)e(is)i(the)g(v)m(alue)h(of)e(the)h(iden)o(ti\014er)h
+Fi(main)e Fp(in)0 496 y(mo)q(dule)f Fi(Main)p Fp(,)f(and)g
+Fi(main)g Fp(m)o(ust)f(ha)o(v)o(e)h(t)o(yp)q(e)g Fi(Dialogue)o
+Fp(.")71 578 y(\(The)e(t)o(yp)q(e)g Fi(Dialogue)f Fp(relates)h(to)g(I/O,)g
+(and)h(is)f(discussed)i(in)f(Section)g(8.\))19 b(Th)o(us)13
+b(the)g(ab)q(o)o(v)o(e)g(t)o(w)o(o)f(mo)q(dules)0 634 y(together)i
+(constitute)i(a)f(v)m(alid)i(Hask)o(ell)f(program.)0 784 y
+Fg(6.1)56 b(Original)17 b(Names)h(and)h(Renaming)0 896 y Fp(Abstractly)d
+(asso)q(ciated)h(with)g(ev)o(ery)f(en)o(tit)o(y)g(is)h(its)g
+Fo(original)g(name)p Fp(|a)f(pair)h(consisting)g(of)f(the)g(name)h(of)f(the)0
+953 y(en)o(tit)o(y)d(and)h(the)f(name)g(of)g(the)h(mo)q(dule)g(in)h(whic)o(h)
+f(it)f(w)o(as)g(originally)i(de\014ned.)20 b(This)14 b(concept)g(is)g(useful)
+g(in)h(that)0 1009 y(it)f(allo)o(ws)g(an)f(en)o(tit)o(y)h(with)g(the)g(same)f
+(name)h(to)f(b)q(e)h(imp)q(orted)g(from)f(a)g(v)m(ariet)o(y)h(of)f
+(di\013eren)o(t)h(mo)q(dules,)h(without)0 1066 y(con\015ict,)h(as)f(long)g
+(as)g(the)g(original)h(name)g(is)f(the)h(same.)71 1148 y(En)o(tities)f(b)q
+(eing)i(imp)q(orted)f(can)f(also)g(b)q(e)h Fo(r)n(ename)n(d)p
+Fp(;)e(for)h(example:)71 1257 y Fi(import)23 b(Tree)g(\()h
+(Tree\(Leaf,Branch\),)d(fringe)i(\))238 1313 y(renaming)f(\(Leaf)i(to)f
+(Root,)g(Branch)g(to)h(Twig\))0 1541 y Fg(6.2)56 b(In)n(terfaces)18
+b(and)h(Impleme)o(n)n(tations)0 1653 y Fp(The)d(mo)q(dules)h
+Fi(Tree)e Fp(and)g Fi(Main)g Fp(sho)o(wn)h(ab)q(o)o(v)o(e)f(are)g(in)i
+(actualit)o(y)f(mo)q(dule)g Fo(implementations)p Fp(|they)g(con)o(tain)0
+1709 y(all)j(of)e(the)h(Hask)o(ell)g(co)q(de)g(to)g(completely)h(de\014ne)f
+(a)g(mo)q(dule.)28 b(The)18 b(information)g(passed)g(b)q(et)o(w)o(een)g(mo)q
+(dules)0 1766 y(during)f(exp)q(ort)e(and)h(imp)q(ort,)g(ho)o(w)o(ev)o(er,)f
+(is)h(more)f(abstract,)g(and)h(is)g(captured)g(formally)g(in)h(a)e(mo)q(dule)
+i Fo(inter-)0 1822 y(fac)n(e)p Fp(.)i(The)c(in)o(terface)g(for)f(a)g(mo)q
+(dule)i Fi(M)e Fp(con)o(tains)h(all)g(of)f(the)h(information)f(ab)q(out)h
+(the)f(en)o(tities)i(exp)q(orted)f(from)0 1879 y Fi(M)h Fp(that)f(is)i
+(needed)h(to)d(ensure)i(prop)q(er)f(t)o(yping)h(of)e(some)h(other)g(mo)q
+(dule)h Fi(N)f Fp(that)g(ma)o(y)f(imp)q(ort)i Fi(M)p Fp(.)22
+b(The)17 b(prop)q(er)0 1935 y(in)o(terfaces)e(for)g(the)g(mo)q(dules)i
+Fi(Tree)d Fp(and)i Fi(Main)e Fp(are:)71 2035 y Fi(interface)22
+b(Tree)i(\()f(Tree\(Leaf,Branch\),)f(fringe)h(\))g(where)71
+2092 y(data)g(Tree)g(a)h(=)g(Leaf)f(a)h(|)f(Branch)g(\(Tree)h(a\))f(\(Tree)g
+(a\))71 2148 y(fringe)g(::)g(Tree)h(a)f(->)h([a])71 2228 y(interface)e(Main)i
+(\(main\))f(where)71 2284 y(import)g(Tree)g(\()h(Tree\(Leaf,Branch\),)d
+(fringe)i(\))71 2341 y(main)g(::)g(Dialogue)71 2501 y Fp(Normally)12
+b(the)f(user)h(need)g(not)f(b)q(e)i(concerned)f(ab)q(out)g(mo)q(dule)g(in)o
+(terfaces,)g(since)h(they)f(are)f(usually)i(deriv)o(ed)0 2557
+y(automatically)k(from)f(the)h(mo)q(dule)h(implemen)o(tation.)27
+b(On)17 b(the)g(other)f(hand,)i(it)f(is)g(not)g(un)o(usual)h(to)e(w)o(an)o(t)
+g(to)0 2614 y(statically)f(debug)h(a)e(mo)q(dule)i(implemen)o(tation)g(that)e
+(imp)q(orts)h(some)f(other)g(mo)q(dule)i(whose)f(implemen)o(tation)p
+eop
+%%Page: 39 39
+bop 0 -40 a Fj(6.3)45 b(Abstract)14 b(Data)g(T)o(yp)q(es)1332
+b Fp(T-39)0 105 y(do)q(es)21 b(not)g(exist)g(y)o(et;)i(b)q(eing)f(able)g(to)e
+(explicitly)k(write)d(the)g(in)o(terface)g(for)g(this)g(imp)q(orted)g(mo)q
+(dule)i(w)o(ould)0 162 y(p)q(ermit)f(this.)41 b(Indeed,)24
+b(in)o(terfaces)e(supp)q(ort)g(top-do)o(wn,)h(successiv)o(e)g(re\014nemen)o
+(t,)g(soft)o(w)o(are)d(dev)o(elopmen)o(t)0 218 y(metho)q(dologies,)c(in)g
+(whic)o(h)g Fo(al)r(l)f Fp(in)o(terfaces)g(are)g(ideally)i(written)e
+Fo(\014rst)p Fp(.)0 493 y Fg(6.3)56 b(Abstract)19 b(Data)f(T)n(yp)r(es)0
+661 y Fp(Aside)j(from)f(con)o(trolling)h(namespaces,)g(mo)q(dules)g(pro)o
+(vide)g(the)f(only)h(w)o(a)o(y)e(to)g(build)j(abstract)d(data)h(t)o(yp)q(es)0
+717 y(\(ADTs\))c(in)i(Hask)o(ell.)27 b(F)l(or)17 b(example,)h(the)g(c)o
+(haracteristic)f(feature)g(of)g(an)g(ADT)g(is)h(that)f(the)g
+Fo(r)n(epr)n(esentation)0 774 y(typ)n(e)i Fp(is)h Fo(hidden)p
+Fp(;)h(all)f(op)q(erations)f(on)g(the)g(ADT)g(are)g(done)h(at)e(an)h
+(abstract)f(lev)o(el)j(whic)o(h)f(do)q(es)g(not)e(dep)q(end)0
+830 y(on)f(the)h(represen)o(tation.)26 b(F)l(or)16 b(example,)j(although)e
+(the)g Fi(Tree)g Fp(t)o(yp)q(e)g(is)h(simple)h(enough)f(that)e(w)o(e)h(migh)o
+(t)g(not)0 886 y(normally)e(mak)o(e)g(it)g(abstract,)e(a)h(suitable)i(ADT)f
+(for)f(it)h(migh)o(t)g(include)i(the)e(follo)o(wing)g(op)q(erations,)g(whic)o
+(h)g(w)o(e)0 943 y(sp)q(ecify)i(in)f(the)f(form)f(of)h(an)g(in)o(terface:)71
+1052 y Fi(interface)22 b(TreeADT)h(\(Tree,)g(leaf,)g(branch,)g(cell,)524
+1108 y(left,)g(right,)g(isLeaf,)g(isBranch\))g(where)71 1165
+y(data)g(Tree)g(a)71 1221 y(leaf)476 b(::)24 b(a)g(->)f(Tree)h(a)71
+1278 y(branch)428 b(::)24 b(Tree)f(a)h(->)g(Tree)f(a)h(->)f(Tree)g(a)71
+1334 y(cell)476 b(::)24 b(Tree)f(a)h(->)g(a)71 1391 y(left,)f(right)309
+b(::)24 b(Tree)f(a)h(->)g(Tree)f(a)71 1447 y(isLeaf)428 b(::)24
+b(Tree)f(a)h(->)g(Bool)0 1556 y Fp(A)15 b(mo)q(dule)i(implemen)o(tation)f
+(supp)q(orting)g(this)g(is:)71 1665 y Fi(module)23 b(TreeADT)g(\(Tree,)g
+(leaf,)g(branch,)g(cell,)452 1722 y(left,)h(right,)f(isLeaf\))g(where)71
+1801 y(data)g(Tree)g(a)310 b(=)24 b(Leaf)f(a)h(|)g(Branch)f(\(Tree)g(a\))h
+(\(Tree)f(a\))71 1881 y(leaf)476 b(=)24 b(Leaf)71 1937 y(branch)428
+b(=)24 b(Branch)71 1994 y(cell)47 b(\(Leaf)23 b(a\))238 b(=)24
+b(a)71 2050 y(left)47 b(\(Branch)23 b(l)g(r\))143 b(=)24 b(l)71
+2107 y(right)f(\(Branch)g(l)g(r\))143 b(=)24 b(r)71 2163 y(isLeaf)70
+b(\(Leaf)24 b(_\))166 b(=)24 b(True)71 2220 y(isLeaf)70 b(_)334
+b(=)24 b(False)0 2331 y Fp(Note)d(in)h(the)g(exp)q(ort)f(list)i(that)d(the)i
+(t)o(yp)q(e)f(name)h Fi(Tree)f Fp(app)q(ears)g(alone)h(\(i.e.)f(without)h
+(its)g(constructors\);)0 2388 y(similarly)l(,)e(in)f(the)e(in)o(terface)h
+(the)g Fi(data)f Fp(declaration)i(for)e Fi(Tree)g Fp(do)q(es)h(not)f(include)
+k(the)c(constructors.)27 b(Th)o(us)0 2444 y Fi(Leaf)17 b Fp(and)h
+Fi(Branch)f Fp(are)h(not)f(exp)q(orted,)h(and)g(the)g(only)h(w)o(a)o(y)d(to)h
+(build)j(or)e(tak)o(e)f(apart)g(trees)g(outside)i(of)e(the)0
+2501 y(mo)q(dule)f(is)f(b)o(y)g(using)h(the)f(v)m(arious)g(\(abstract\))e(op)
+q(erations.)20 b(Of)15 b(course,)g(the)g(adv)m(an)o(tage)f(of)h(this)g
+(information)0 2557 y(hiding)20 b(is)e(that)f(at)h(a)g(later)g(time)g(w)o(e)g
+(could)h Fo(change)e Fp(the)h(represen)o(tation)g(t)o(yp)q(e)g(without)g
+(a\013ecting)g(users)g(of)0 2614 y(the)d(t)o(yp)q(e.)p eop
+%%Page: 40 40
+bop 0 -40 a Fp(T-40)1368 b Fj(7)45 b(TYPING)15 b(PITF)-5 b(ALLS)0
+105 y Fg(6.4)56 b(Rules,)17 b(Rules,)g(and)j(More)e(Rules)0
+227 y Fp(Although)f(Hask)o(ell's)h(mo)q(dule)g(system)e(is)i(relativ)o(ely)g
+(conserv)m(ativ)o(e,)f(there)g(are)g(man)o(y)f(rules)i(concerning)g(the)0
+283 y(imp)q(ort)g(and)g(exp)q(ort)g(of)g(v)m(alues.)29 b(Most)17
+b(of)g(these)h(are)g(ob)o(vious|for)g(instance,)h(it)f(is)h(illegal)h(to)d
+(imp)q(ort)h(t)o(w)o(o)0 340 y(di\013eren)o(t)f(en)o(tities)h(ha)o(ving)f
+(the)f(same)h(name)f(in)o(to)h(the)g(same)f(scop)q(e.)25 b(Other)17
+b(rules)h(are)e(not)h(so)f(ob)o(vious|for)0 396 y(example,)f(an)e
+Fi(instance)g Fp(declaration)i(can)f(only)g(app)q(ear)g(in)h(the)f(mo)q(dule)
+g(in)h(whic)o(h)g(the)f(corresp)q(onding)h Fi(data)0 453 y
+Fp(or)g Fi(class)f Fp(declaration)i(app)q(ears.)k(The)c(reader)f(should)h
+(read)f(the)g(Rep)q(ort)h(for)e(details)j(\()p Fn(x)o Fp(5\).)0
+646 y Fq(7)69 b(T)n(yping)23 b(Pitfalls)0 783 y Fp(This)c(short)e(section)i
+(giv)o(e)f(an)g(in)o(tuitiv)o(e)i(description)f(of)f(a)g(few)g(common)g
+(problems)g(that)g(no)o(vices)h(run)f(in)o(to)0 840 y(using)e(Hask)o(ell's)g
+(t)o(yp)q(e)f(system.)0 1011 y Fg(7.1)56 b(Let-Bound)17 b(P)n(olymorphism)0
+1133 y Fp(An)o(y)i(language)h(using)g(the)f(Hindley-Milne)q(r)j(t)o(yp)q(e)d
+(system)g(has)g(what)f(is)i(called)h Fo(let-b)n(ound)f(p)n(olymorphism)p
+Fp(,)0 1189 y(b)q(ecause)g(iden)o(ti\014ers)g(not)e(b)q(ound)i(using)g(a)e
+Fi(let)g Fp(or)h Fi(where)f Fp(clause)h(\(or)f(at)g(the)h(top)g(lev)o(el)h
+(of)e(a)h(mo)q(dule\))g(are)0 1246 y(limited)14 b(with)e(resp)q(ect)h(to)e
+(their)h(p)q(olymorphism.)20 b(In)13 b(particular,)g(a)f Fo(lamb)n(da-b)n
+(ound)g Fp(function)h(\(i.e.,)f(one)g(passed)0 1302 y(as)k(argumen)o(t)g(to)f
+(another)h(function\))h(cannot)f(b)q(e)h(instan)o(tiated)g(in)g(t)o(w)o(o)e
+(di\013eren)o(t)i(w)o(a)o(ys.)22 b(F)l(or)15 b(example,)j(this)0
+1359 y(program)c(is)i(illegal:)71 1468 y Fi(let)23 b(f)h(g)47
+b(=)h(\(g)24 b([],)f(g)h('a'\))548 b(--)24 b(ill-typed)e(expression)71
+1524 y(in)h(f)h(\(\\x->x\))0 1633 y Fp(b)q(ecause)19 b Fi(g)p
+Fp(,)f(b)q(ound)h(to)e(a)h(lam)o(b)q(da)g(abstraction)g(whose)g(principal)i
+(t)o(yp)q(e)e(is)h Fi(a->a)o Fp(,)f(is)h(used)f(within)i Fi(f)d
+Fp(in)i(t)o(w)o(o)0 1690 y(di\013eren)o(t)c(w)o(a)o(ys:)k(once)d(with)f(t)o
+(yp)q(e)h Fi([a]->[a])n Fp(,)f(and)h(once)f(with)h(t)o(yp)q(e)f
+Fi(Char->Char)o Fp(.)0 1861 y Fg(7.2)56 b(Numeric)16 b(Ov)n(erloading)0
+1983 y Fp(It)f(is)g(easy)g(to)f(forget)g(at)g(times)h(that)g(n)o(umerals)g
+(are)f Fo(overlo)n(ade)n(d,)h Fp(and)g Fo(not)h(implicitly)g(c)n(o)n(er)n(c)n
+(e)n(d)d Fp(to)i(the)f(v)m(arious)0 2040 y(n)o(umeric)k(t)o(yp)q(es,)g(as)e
+(in)j(man)o(y)d(other)h(languages.)26 b(More)17 b(general)h(n)o(umeric)g
+(expressions)g(sometimes)f(cannot)0 2096 y(b)q(e)f(quite)g(so)f(generic.)20
+b(A)c(common)e(n)o(umeric)j(t)o(yping)e(error)f(is)i(something)g(lik)o(e)g
+(the)f(follo)o(wing:)71 2205 y Fi(average)22 b(xs)334 b(=)48
+b(sum)23 b(xs)h(/)g(length)f(xs)262 b(--)24 b(Wrong!)0 2314
+y(\(/\))c Fp(requires)h(fractional)f(argumen)o(ts,)g(but)h
+Fi(length)o Fp('s)f(result)g(is)h(an)f Fi(Int)p Fp(.)35 b(The)20
+b(t)o(yp)q(e)h(mismatc)o(h)f(m)o(ust)f(b)q(e)0 2371 y(corrected)c(with)h(an)f
+(explicit)i(co)q(ercion:)71 2480 y Fi(average)404 b(::)24 b(\(Fractional)e
+(a\))i(=>)f([a])h(->)f(a)71 2536 y(average)f(xs)334 b(=)48
+b(sum)23 b(xs)h(/)g(fromIntegral)e(\(length)h(xs\))p eop
+%%Page: 41 41
+bop 0 -40 a Fj(7.3)45 b(The)15 b(Monomorphism)g(Restriction)1118
+b Fp(T-41)0 105 y Fg(7.3)56 b(The)18 b(Monomorphism)e(Restriction)0
+213 y Fp(The)e(Hask)o(ell)h(t)o(yp)q(e)g(system)e(con)o(tains)i(a)f
+(restriction)g(related)h(to)e(t)o(yp)q(e)i(classes)f(that)g(is)h(not)e(found)
+i(in)g(ordinary)0 269 y(Hindley-Milne)q(r)23 b(t)o(yp)q(e)d(systems:)29
+b(the)20 b Fo(monomorphism)i(r)n(estriction)p Fp(.)34 b(The)21
+b(reason)f(for)f(this)i(restriction)f(is)0 326 y(related)c(to)e(a)h(subtle)h
+(t)o(yp)q(e)f(am)o(biguit)o(y)g(and)h(is)f(explained)j(in)d(full)i(detail)f
+(in)g(the)f(Rep)q(ort)h(\()p Fn(x)p Fp(4.5.4\).)i(A)d(simpler)0
+382 y(explanation)h(follo)o(ws:)71 461 y(The)g(monomorphism)f(restriction)i
+(sa)o(ys)e(that)g(an)o(y)g(iden)o(ti\014er)j(b)q(ound)e(b)o(y)g(a)g(pattern)f
+(binding)j(\(whic)o(h)e(in-)0 517 y(cludes)e(bindings)g(to)e(a)g(single)i
+(iden)o(ti\014er\),)g(and)e(ha)o(ving)h(no)f(explicit)j(t)o(yp)q(e)e
+(signature,)f(m)o(ust)g(b)q(e)h Fo(monomorphic)p Fp(.)0 574
+y(An)h(iden)o(ti\014er)h(is)f(monomorphic)g(if)f(is)h(either)h(not)e(o)o(v)o
+(erloaded,)g(or)g(is)h(o)o(v)o(erloaded)f(but)h(is)g(used)g(in)g(at)f(most)g
+(one)0 630 y(sp)q(eci\014c)k(o)o(v)o(erloading)e(and)h(is)f(not)g(exp)q
+(orted.)71 709 y(Violations)e(of)e(this)i(restriction)g(result)f(in)h(a)f
+(static)g(t)o(yp)q(e)h(error.)18 b(The)12 b(simplest)h(w)o(a)o(y)f(to)f(a)o
+(v)o(oid)h(the)g(problem)0 765 y(is)18 b(to)g(pro)o(vide)g(an)g(explicit)i(t)
+o(yp)q(e)e(signature.)28 b(Note)17 b(that)g Fo(any)h Fp(t)o(yp)q(e)g
+(signature)g(will)h(do)f(\(as)f(long)h(it)h(is)f(t)o(yp)q(e)0
+822 y(correct\).)71 900 y(A)12 b(common)h(violation)g(of)g(the)f(restriction)
+i(happ)q(ens)f(with)g(functions)h(de\014ned)g(in)f(a)g(higher-order)g
+(manner,)0 957 y(as)i(in)h(this)f(de\014nition)i(of)e Fi(sum)g
+Fp(from)f(the)i(Standard)f(Prelude:)71 1057 y Fi(sum)500 b(=)48
+b(foldl)23 b(\(+\))h(0)0 1166 y Fp(As)15 b(is,)h(this)f(w)o(ould)h(cause)f(a)
+g(static)g(t)o(yp)q(e)g(error.)k(W)l(e)d(can)f(\014x)h(the)f(problem)h(b)o(y)
+f(adding)h(the)f(t)o(yp)q(e)g(signature:)71 1275 y Fi(sum)500
+b(::)24 b(\(Num)f(a\))h(=>)f([a])h(->)f(a)0 1384 y Fp(Also)16
+b(note)f(that)f(this)i(problem)g(w)o(ould)f(not)g(ha)o(v)o(e)g(arisen)g(if)h
+(w)o(e)f(had)g(written:)71 1493 y Fi(sum)23 b(xs)429 b(=)48
+b(foldl)23 b(\(+\))h(0)f(xs)0 1602 y Fp(b)q(ecause)16 b(the)f(restriction)h
+(only)g(applies)h(to)d(pattern)h(bindings.)0 1766 y Fq(8)69
+b(Input/Output)0 1890 y Fp(The)17 b(I/O)h(system)e(in)i(Hask)o(ell)g(is)g
+(purely)g(functional,)g(y)o(et)f(has)g(all)h(the)f(expressiv)o(e)h(p)q(o)o(w)
+o(er)f(of)f(that)h(found)g(in)0 1946 y(con)o(v)o(en)o(tional)h(programming)f
+(languages.)27 b(T)l(o)18 b(ac)o(hiev)o(e)g(this,)g(Hask)o(ell)g(relies)h
+(critically)h(on)e(lazy)g(ev)m(aluation)0 2002 y(and)d(higher-order)h
+(functions,)g(the)f(k)o(ey)g(building)j(blo)q(c)o(ks)e(of)f(an)o(y)g
+(functional)h(program.)j(\()p Fn(x)p Fp(7\))71 2081 y(The)13
+b(Rep)q(ort)h(describ)q(es)i(t)o(w)o(o)c(equiv)m(alen)o(t)j(w)o(a)o(ys)e(to)g
+(do)h(I/O)g(in)g(Hask)o(ell:)20 b(the)14 b Fo(str)n(e)n(am-b)n(ase)n(d)e
+Fp(approac)o(h)i(and)0 2137 y(the)f Fo(c)n(ontinuation-b)n(ase)n(d)e
+Fp(approac)o(h.)19 b(The)13 b(former)f(is)h(probably)g(easier)g(to)f(explain)
+j(conceptually)l(,)f(and)f(indeed)0 2194 y(the)19 b(latter)f(is)h(de\014ned)h
+(in)f(terms)f(of)g(the)h(former)f(in)h(the)g(Rep)q(ort.)30
+b(Ho)o(w)o(ev)o(er,)18 b(for)g(practical)h(programming,)0 2250
+y(the)g(latter)f(\(con)o(tin)o(uation-based\))h(approac)o(h)g(is)g(the)g
+(preferred)g(metho)q(dology)l(,)g(and)g(that)f(is)i(what)e(w)o(e)g(will)0
+2307 y(concen)o(trate)d(on)g(in)h(this)g(section.)k(\()p Fn(x)p
+Fp(7.5\))0 2449 y Fg(8.1)56 b(In)n(tro)r(duction)18 b(to)g(Con)n(tin)n
+(uations)0 2557 y Fp(T)l(o)13 b(understand)g(this)h(metho)q(dology)l(,)f(it)g
+(is)g(helpful)i(to)e(ha)o(v)o(e)f(some)h(understanding)h(of)e(the)h(notion)h
+(of)e(a)h Fo(c)n(ontin-)0 2614 y(uation)p Fp(.)20 b(A)13 b(con)o(tin)o
+(uation)h(is)f(basically)i(a)e(\(p)q(ossibly)i(n)o(ullary\))f
+Fo(function)e Fp(that)h(maps)g(an)g(\\in)o(termediate)h(v)m(alue")p
+eop
+%%Page: 42 42
+bop 0 -40 a Fp(T-42)1417 b Fj(8)45 b(INPUT/OUTPUT)0 105 y Fp(\(p)q(ossibly)20
+b(empt)o(y\))e(to)g(\\the)g(rest)g(of)h(the)f(program.")29
+b(In)19 b(this)g(w)o(a)o(y)l(,)g(con)o(tin)o(uations)g(are)f(used)h(to)f
+(explicitly)0 162 y(manage)d(\\\015o)o(w)h(of)f(con)o(trol,")h(and)g(th)o(us)
+g(w)o(e)f(tend)i(to)e(de\014ne)i(functions)g(that,)e(instead)i(of)e
+(returning)i(with)f(an)0 218 y(answ)o(er,)g(will)j(apply)e(a)f(con)o(tin)o
+(uation)i(\(passed)e(in)i(as)e(an)h(argumen)o(t\))e(to)h(the)h(answ)o(er.)24
+b(Because)17 b(of)g(this,)g(the)0 274 y(resulting)f(programming)f(st)o(yle)g
+(is)h(often)f(called)i Fo(c)n(ontinuation)e(p)n(assing)g(style)p
+Fp(,)f(or)h(CPS)g(for)g(short.)71 359 y(T)l(o)e(giv)o(e)h(an)g(example)g(of)f
+(this)i(idea)f(without)g(reference)g(to)f(I/O,)h(let's)g(consider)g(the)g
+(use)g(of)g(con)o(tin)o(uations)0 416 y(to)i(manage)g(errors|i.e.,)g(to)f
+(create)i(the)f(e\013ect)g(of)g(a)g(non-lo)q(cal)i(exit,)f(or)f(call)h(to)f
+(an)g(error-handler.)24 b(A)17 b(con-)0 472 y(v)o(en)o(tional)f(w)o(a)o(y)e
+(of)h(handling)i(error)d(v)m(alues)i(in)g(Hask)o(ell)g(migh)o(t)g(b)q(e)f
+(the)h(follo)o(wing:)71 581 y Fi(data)23 b(Maybe)g(a)286 b(=)24
+b(Ok)g(a)f(|)h(Oops)f(String)71 638 y(f)548 b(::)24 b(Int)f(->)h(Maybe)f(Int)
+71 694 y(f)g(x)501 b(=)24 b(let)f(y)h(=)g(...)691 751 y(in)47
+b(if)24 b(y==0)47 b(then)g(Oops)24 b("divide)f(by)g(zero")786
+807 y(else)48 b(Ok)23 b(\(x/y\))0 916 y Fp(Here)c(the)g Fi(Maybe)f
+Fp(t)o(yp)q(e)h(is)g(used)g(to)f(enco)q(de)i(the)f(p)q(ossibilit)o(y)i(of)d
+(error)g(in)o(v)o(olving)i(a)f(particular)g(t)o(yp)q(e.)31
+b(No)o(w)0 973 y(supp)q(ose)14 b Fi(f)f Fp(is)h(used)g(in)g(con)o(text)e
+(somewhere;)i(for)f(example,)h(supp)q(ose)g(when)f(the)h(divide-b)o(y-zero)h
+(error)e(o)q(ccurs)0 1029 y(there)i(is)h(some)f(default)h(v)m(alue)g
+Fi(d)f Fp(that)g(is)g(appropriate)g(to)g(use)h(instead:)118
+1138 y Fi(case)24 b(f)f(z)h(of)166 1195 y(Ok)g(x)71 b(->)24
+b(x)166 1251 y(Oops)f(s)h(->)g(d)71 1414 y Fp(In)16 b(con)o(trast)f(to)h
+(this,)h(an)f(approac)o(h)g(to)f(handling)j(errors)e(based)g(on)h(explicit)h
+(con)o(tin)o(uations)f(migh)o(t)f(lo)q(ok)0 1470 y(something)f(lik)o(e)i
+(this:)71 1579 y Fi(f)548 b(::)24 b(Int)f(->)h(\(String)f(->)g(Int\))h(->)f
+(Int)71 1635 y(f)g(x)h(c)453 b(=)24 b(let)f(y)h(=)g(...)691
+1692 y(in)47 b(if)24 b(x==0)47 b(then)g(c)24 b("divide)f(by)h(zero")786
+1748 y(else)48 b(x/y)0 1864 y Fp(Note)17 b(that)f(an)h(error)f(con)o(tin)o
+(uation)i Fi(c)f Fp(is)g(explicitly)j(supplied)g(to)c Fi(f)h
+Fp(as)f(an)h(argumen)o(t.)1546 1847 y Fm(14)1608 1864 y Fp(No)o(w,)g(to)f
+(sim)o(ulate)0 1920 y(the)f(ab)q(o)o(v)o(e)g Fo(use)g Fp(of)g
+Fi(f)p Fp(,)g(w)o(e)f(w)o(ould)i(simply)g(write:)118 2029 y
+Fi(f)24 b(z)g(\(\\s)f(->)h(d\))71 2192 y Fp(The)12 b(trade-o\013s)f(b)q(et)o
+(w)o(een)h(con)o(v)o(en)o(tional)h(and)f(con)o(tin)o(uation-based)h(approac)o
+(hes)f(to)f(handling)j(suc)o(h)f(things)0 2248 y(as)i(errors)f(are)h(sub)s
+(jectiv)o(e.)20 b(The)c(passing)f(of)g(con)o(tin)o(uations)g(can)h(b)q(e)f
+(cum)o(b)q(ersome,)h(but)f(on)g(the)g(other)g(hand,)p 0 2295
+780 2 v 37 2322 a Fl(14)69 2338 y Fk(As)h(an)h(aside,)h(w)o(e)e(p)q(oin)o(t)h
+(out)g(that)g(an)f(ev)o(en)h(b)q(etter)g(solution)h(w)o(ould)g(exist)f(if)f
+(the)h(primitiv)o(e)h(arithmetic)g(functions)g(to)q(ok)0 2383
+y(con)o(tin)o(uation)e(argumen)o(ts)e(to)q(o!)j(If)12 b Ff(divide)f
+Fk(w)o(ere)h(suc)o(h)i(a)f(function)h(for)f Ff(/)g Fk(then)g(w)o(e)g(could)h
+(simply)h(write:)71 2472 y Ff(f)k(x)g(c)372 b(=)20 b(let)e(y)h(=)g(...)581
+2518 y(in)38 b(divide)17 b(x)j(y)f(c)p eop
+%%Page: 43 43
+bop 0 -40 a Fj(8.2)45 b(Con)o(tin)o(uation)15 b(Based)g(I/O)1271
+b Fp(T-43)0 105 y(the)12 b(enco)q(ding)g(of)f(error)g(in)o(to)h(sp)q(ecial)h
+(t)o(yp)q(es)e(is)h(also)g(cum)o(b)q(ersome.)18 b(The)12 b(programmer)e(m)o
+(ust)h(mak)o(e)g(a)g(judicious)0 162 y(c)o(hoice)16 b(based)g(on)f(her)g
+(particular)h(circumstances.)71 259 y(Before)e(mo)o(ving)g(on)g(to)f(I/O,)h
+(ho)o(w)o(ev)o(er,)f(w)o(e)h(p)q(oin)o(t)g(out)g(one)g(\014nal)h(adv)m(an)o
+(tage)f(of)f(con)o(tin)o(uations)i(b)o(y)f(noting)0 316 y(that)g(if)h
+Fi(f)g Fp(w)o(ere)f Fo(r)n(e)n(cursive)p Fp(,)g(the)h(error)f(v)m(alue)i(in)f
+(the)g(con)o(v)o(en)o(tional)g(approac)o(h)f(migh)o(t)h(ha)o(v)o(e)f(to)g(b)q
+(e)i(propagated)0 372 y(bac)o(k)c(through)f(ev)o(ery)h(lev)o(el)i(of)d
+(recursion,)i(whereas)f(in)h(the)f(con)o(tin)o(uation-based)h(approac)o(h,)e
+(the)i(con)o(tin)o(uation)0 429 y(is)f(called)h(directly)l(,)g(m)o(uc)o(h)f
+(lik)o(e)h(a)e(non-lo)q(cal)i(exit)f(to)e(an)i(error)f(handler!)19
+b(This)12 b(ma)o(y)f(ha)o(v)o(e)g(an)h(imp)q(ortan)o(t)f(impact)0
+485 y(on)k(e\016ciency)l(.)0 688 y Fg(8.2)56 b(Con)n(tin)n(uation)19
+b(Based)g(I/O)0 823 y Fp(Giv)o(en)12 b(this)f(bac)o(kground,)h(understanding)
+g(con)o(tin)o(uation-based)g(I/O)g(in)g(Hask)o(ell)g(should)g(b)q(e)f
+(straigh)o(tforw)o(ard;)0 879 y(there)k(are)g(only)h(t)o(w)o(o)e(small)i(t)o
+(wists.)71 977 y(First,)11 b(a)h(program)f(engaged)h(in)h(I/O)f(\\comm)o
+(unicates")g(to)f(the)h(outside)h(w)o(orld)f(\(nominally)l(,)i(the)e(op)q
+(erating)0 1033 y(system\))19 b(using)h(con)o(tin)o(uations.)32
+b(A)20 b(Hask)o(ell)g(program)e(engaged)i(in)g(I/O)g(is)g(required)g(to)f(ha)
+o(v)o(e)g(a)g(top-lev)o(el)0 1090 y(iden)o(ti\014er)j Fi(main)d
+Fp(whose)h(t)o(yp)q(e)g(is)h Fi(Dialogue)o Fp(;)h(this)e(is)h(the)f(t)o(yp)q
+(e)g(of)g(the)g(con)o(tin)o(uation)g(that)g(the)g(op)q(erating)0
+1146 y(system)15 b(is)g(exp)q(ecting.)71 1244 y(The)j(other)g(t)o(wist)f(is)i
+(that)f(not)f(only)i(is)g Fo(failur)n(e)f Fp(enco)q(ded)h(as)f(a)g(con)o(tin)
+o(uation,)h(but)g(so)e(is)i Fo(suc)n(c)n(ess)p Fp(,)e(since)0
+1301 y(w)o(e)d(need)i(to)e(con)o(trol)h(the)f(\015o)o(w)h(of)f(all)i(asp)q
+(ects)e(of)h(I/O.)g(Th)o(us)f(the)h(I/O)g(\\commands")f(in)i(Hask)o
+(ell|functions)0 1357 y(called)h Fo(tr)n(ansactions)p Fp(|tak)o(e)d
+Fo(two)h Fp(con)o(tin)o(uation)h(argumen)o(ts,)e(one)h(for)g(success)h(and)f
+(the)g(other)g(for)g(failure.)71 1455 y(The)d(simplest)h(thing)g(a)f(program)
+f(could)i(do)f(is)g Fo(halt)p Fp(.)19 b(T)l(o)12 b(do)g(that,)g(w)o(e)g(use)g
+(the)g(sp)q(ecial)i Fi(done)e Fp(con)o(tin)o(uation,)0 1512
+y(whose)j(t)o(yp)q(e)g(is)h Fi(Dialogue)o Fp(:)71 1622 y Fi(main)476
+b(=)48 b(done)71 1797 y Fp(F)l(or)18 b(a)g(little)i(more)f(sophistication,)h
+(supp)q(ose)f(w)o(e)g(wish)g(to)f(write)h(a)g(string)f Fi(s)h
+Fp(to)f(a)g(\014le)i(whose)f(name)f(is)0 1854 y Fi("ReadMe")o
+Fp(.)i(W)l(e)15 b(w)o(ould)h(do)f(this)g(in)h(Hask)o(ell)g(using)g(the)g
+Fi(writeFile)e Fp(transaction:)71 1963 y Fi(main)476 b(=)24
+b(writeFile)f("ReadMe")f(s)i(failCont)f(succCont)0 2072 y Fp(where)12
+b Fi(failCont)f Fp(and)h Fi(succCont)f Fp(are)h(failure)h(and)f(success)g
+(con)o(tin)o(uations,)h(resp)q(ectiv)o(ely)l(,)h(that)d(will)j(b)q(e)e(giv)o
+(en)0 2128 y(sp)q(eci\014c)17 b(v)m(alues)f(later.)k(The)c(t)o(yp)q(e)f(of)g
+Fi(writeFile)f Fp(is:)71 2237 y Fi(writeFile)356 b(::)24 b(Name)f(->)h
+(String)f(->)g(FailCont)g(->)h(SuccCont)f(->)g(Dialogue)71
+2294 y(type)g(Name)357 b(=)24 b(String)0 2403 y Fp(So)15 b(w)o(e)g(see)h
+(that)e(the)h(result)h(of)f(the)g(application)i(of)e Fi(writeFile)f
+Fp(has)h(the)g(appropriate)g(t)o(yp)q(e:)20 b Fi(Dialogue)o
+Fp(.)71 2501 y(But)g(what)f(exactly)h(are)g Fi(FailCont)e Fp(and)j
+Fi(SuccCont)n Fp(?)35 b(T)l(o)20 b(answ)o(er)f(that,)h(w)o(e)g(m)o(ust)f
+(understand)i(what)0 2557 y(kinds)16 b(of)e(\\in)o(termediate)h(v)m(alues")h
+(are)e(generated)h(b)o(y)f(the)h(v)m(arious)g(transactions.)k(F)l(or)14
+b(example,)i Fo(failur)n(e)e Fp(of)g(a)0 2614 y(transaction)h(ma)o(y)f
+(generate)h(an)o(y)g(of)g(the)g(follo)o(wing)h(kinds)g(of)f(errors:)p
+eop
+%%Page: 44 44
+bop 0 -40 a Fp(T-44)1417 b Fj(8)45 b(INPUT/OUTPUT)71 160 y
+Fi(data)23 b(IOError)285 b(=)24 b(WriteError)46 b(String)643
+216 y(|)24 b(ReadError)70 b(String)643 272 y(|)24 b(SearchError)e(String)643
+329 y(|)i(FormatError)e(String)643 385 y(|)i(OtherError)46
+b(String)0 494 y Fp(and)15 b(th)o(us)g Fi(FailCont)f Fp(is)i(de\014ned)h(as:)
+71 595 y Fi(type)23 b(FailCont)261 b(=)24 b(IOError)f(->)h(Dialogue)0
+704 y Fp(In)16 b(con)o(trast)e(to)g(failure,)i Fo(suc)n(c)n(ess)e
+Fp(of)g Fi(writeFile)g Fp(do)q(esn't)h(really)h(return)g Fo(anything)p
+Fp(,)e(so)h Fi(SuccCont)f Fp(is)i(simply:)71 813 y Fi(type)23
+b(SuccCont)261 b(=)24 b(Dialogue)0 922 y Fp(A)19 b(simple)h(failure)f(con)o
+(tin)o(uation)g(that)f(is)h(prede\014ned)h(in)f(Hask)o(ell)h(is)f(one)f(that)
+g(ignores)h(the)g(error)e(message)0 978 y(and)e(halts:)71 1078
+y Fi(abort)452 b(::)24 b(FailCont)71 1135 y(abort)f(err)357
+b(=)24 b(done)0 1244 y Fp(A)15 b(b)q(etter)g(one,)g(also)h(prede\014ned,)g
+(prin)o(ts)f(the)h(error)e(message)h(to)g Fi(stderror)f Fp(b)q(efore)h
+(halting:)71 1353 y Fi(exit)476 b(::)48 b(FailCont)71 1409
+y(exit)23 b(err)381 b(=)48 b(appendChan)22 b(stderr)h(msg)h(abort)f(done)715
+1466 y(where)g(msg)h(=)f(case)h(err)f(of)h(ReadError)70 b(s)24
+b(->)f(s)1288 1522 y(WriteError)46 b(s)24 b(->)f(s)1288 1579
+y(SearchError)f(s)i(->)f(s)1288 1635 y(FormatError)f(s)i(->)f(s)1288
+1692 y(OtherError)46 b(s)24 b(->)f(s)71 1850 y Fp(Returning)18
+b(no)o(w)g(to)f(the)g(previous)i(example,)g(if)f(what)f(w)o(e)g(w)o(an)o(ted)
+g(is)i(simply)g(to)e(halt)g(after)g(writing)i(to)0 1906 y(the)c(\014le,)h
+(and)g(prin)o(t)f(an)o(y)g(error)f(message)h(that)g(migh)o(t)g(arise,)g(w)o
+(e)g(w)o(ould)g(write:)71 2015 y Fi(main)476 b(=)24 b(writeFile)f("ReadMe")f
+(s)i(exit)f(done)71 2173 y Fp(The)15 b(transaction)g Fi(readFile)f
+Fp(returns)h(the)g(con)o(ten)o(ts)g(of)f(a)h(\014le,)h(and)g(th)o(us)f(its)g
+(t)o(yp)q(e)g(is)h(giv)o(en)g(b)o(y:)71 2282 y Fi(readFile)380
+b(::)24 b(Name)f(->)h(FailCont)f(->)g(StrCont)g(->)h(Dialogue)71
+2339 y(type)f(StrCont)285 b(=)24 b(String)f(->)h(Dialogue)0
+2448 y Fp(F)l(or)15 b(example,)g(w)o(e)g(could)h(use)g(it)f(to)g(read)g(the)g
+(\014le)i(previously)f(written:)71 2557 y Fi(main)476 b(=)24
+b(readFile)f("ReadMe")g(exit)g(\(\\s->...\))p eop
+%%Page: 45 45
+bop 0 -40 a Fj(8.2)45 b(Con)o(tin)o(uation)15 b(Based)g(I/O)1271
+b Fp(T-45)0 105 y(where)15 b(the)h Fi(...)e Fp(re\015ects)i(whatev)o(er)e(it)
+i(is)g(w)o(e)f(wish)g(to)g(do)g(with)h(what)e(w)o(e)h(ha)o(v)o(e)g(read.)71
+183 y(Pragmatically)l(,)f(it)h(ma)o(y)e(seem)i(that)e Fi(readFile)g
+Fp(m)o(ust)h(read)g(an)h(en)o(tire)f(\014le,)h(resulting)h(in)f(p)q(o)q(or)f
+(space)h(and)0 240 y(time)k(p)q(erformance)g(under)h(certain)g
+(circumstances.)32 b(Ho)o(w)o(ev)o(er,)18 b(this)i(is)f(not)g(the)g(case.)31
+b(The)19 b(k)o(ey)g(p)q(oin)o(t)g(is)0 296 y(that)c Fi(readFile)g
+Fp(returns)h(a)g(\\lazy")g(\(i.e.)23 b(non-strict\))16 b(list)h(of)f(c)o
+(haracters)f(\(recall)i(that)f(strings)g(are)f(just)h(lists)0
+353 y(of)e(c)o(haracters)g(in)i(Hask)o(ell\),)f(whose)g(elemen)o(ts)g(are)f
+(read)h(\\b)o(y)g(demand")g(just)f(lik)o(e)i(an)o(y)e(other)h(list.)20
+b(An)15 b(imple-)0 409 y(men)o(tation)f(can)g(b)q(e)h(exp)q(ected)h(to)e
+(implemen)o(t)h(this)g(demand-driv)o(en)h(b)q(eha)o(vior)f(b)o(y)f(reading)h
+(one)f(c)o(haracter)g(at)0 465 y(a)h(time)g(from)g(the)g(\014le.)71
+543 y(There)k(are)g(lots)h(of)f(other)g(transactions)g(a)o(v)m(ailable)i(in)f
+(the)g(Hask)o(ell)g(I/O)g(design,)h(whic)o(h)f(primarily)h(re-)0
+600 y(\015ects)d(the)g(desire)h(for)e(compatibilit)o(y)j(with)e(con)o(v)o(en)
+o(tional)g(op)q(erating)g(systems.)27 b(F)l(or)18 b(example,)h(there)f(is)g
+(an)0 656 y Fi(appendFile)e Fp(transaction)g(whic)o(h)i(writes)f(a)f(string)h
+(to)g(the)g(end)g(of)g(a)f(\014le.)26 b(There)18 b(are)e(also)h
+Fo(binary)g Fp(v)o(ersions)0 713 y(of)e Fi(readFile)o Fp(,)f
+Fi(writeFile)o Fp(,)h(and)g Fi(appendFile)f Fp(\()p Fn(x)p
+Fp(7\).)71 791 y(Also)h(included)j(among)c(the)h(standard)f(op)q(erations)i
+(are)e(those)h(whic)o(h)h(in)o(teract)f(with)g Fo(channels)p
+Fp(,)e(whic)o(h)j(in)0 847 y(Unix-land)k(includes)g(things)e(lik)o(e)h
+(standard-input,)g(standard-output,)f(etc.)27 b(The)19 b(t)o(w)o(o)d(most)h
+(imp)q(ortan)o(t)g(of)0 904 y(these)e(are:)71 1004 y Fi(readChan)380
+b(::)24 b(Name)f(->)262 b(FailCont)23 b(->)h(StrCont)47 b(->)23
+b(Dialogue)71 1060 y(appendChan)332 b(::)24 b(Name)f(->)h(String)f(->)g
+(FailCont)g(->)h(SuccCont)f(->)g(Dialogue)0 1169 y Fp(There)12
+b(is)g(no)g Fi(writeChan)f Fp(transaction,)h(since)h(the)f(output)f(is)i(alw)
+o(a)o(ys)e(app)q(ended)i(to)e(whatev)o(er)h(w)o(as)f(previously)0
+1226 y(written)k(\(th)o(us)g Fi(appendChan)f Fp(is)h(akin)h(to)f
+Fi(appendFile)n Fp(\).)71 1304 y(Note)g(that)h(c)o(hannel)h(names)f(are)g
+(just)f(strings)h(\(lik)o(e)h(\014le)g(names\).)23 b(There)16
+b(are)g(four)f(c)o(hannel)j(names)e(that)0 1360 y(are)f(alw)o(a)o(ys)f(supp)q
+(orted)i(b)o(y)f(a)g(prop)q(er)h(implemen)o(tation,)g(and)f(are)g(b)q(ound)h
+(to)f(the)g(follo)o(wing)h(iden)o(ti\014ers:)71 1469 y Fi(stdin)452
+b(=)48 b("stdin")71 1526 y(stdout)428 b(=)48 b("stdout")71
+1582 y(stderr)428 b(=)48 b("stderr")71 1639 y(stdecho)404 b(=)48
+b("stdecho")0 1750 y Fp(On)12 b(most)f(systems,)g Fi(stdout)p
+Fp(,)g Fi(stderr)p Fp(,)h(and)f Fi(stdecho)g Fp(all)h(represen)o(t)g(the)g
+(same)f(ph)o(ysical)i(c)o(hannel)g(\(nominally)l(,)0 1807 y(the)i(user's)g
+(terminal)h(displa)o(y\).)71 1885 y(Let's)k(no)o(w)g(consider)h(a)f(sligh)o
+(tly)i(bigger)f(program|one)f(that)f(writes)i(to)f(a)g(\014le,)i(reads)e(the)
+h(\014le)g(bac)o(k,)0 1941 y(compares)15 b(the)h(con)o(ten)o(ts)e(for)h
+(equalit)o(y)h(with)g(what)f(w)o(as)f(previously)j(written,)e(prin)o(ts)h(a)f
+(suitable)i(message)e(to)0 1998 y(standard)g(output,)f(and)i(halts:)71
+2107 y Fi(main)94 b(=)24 b(writeFile)f("ReadMe")g(s1)g(exit)h(\()309
+2163 y(readFile)47 b("ReadMe")94 b(exit)24 b(\(\\s2->)309 2220
+y(appendChan)f(stdout)g(\(if)g(s1==s2)g(then)h("contents)e(match")1001
+2276 y(else)i("something)e(intervened!"\))g(exit)309 2333 y(done\)\))0
+2444 y Fp(This)f(program)e(demonstrates)g(an)h(imp)q(ortan)o(t)f(asp)q(ect)i
+(of)e(Hask)o(ell)i(I/O|it)g(p)q(ermits)g Fo(nondeterminism)e
+Fp(in)0 2501 y(the)e(op)q(erating)g(system)f(\(if)h(it)g(didn't,)g(it)g(w)o
+(ould)g(hardly)h(b)q(e)f(practical!\),)g(y)o(et)f(in)o(ternally)j(programs)c
+(are)i(still)0 2557 y(referen)o(tially)d(transparen)o(t.)k(In)13
+b(this)g(example)h(there)f(is)g(the)f(p)q(ossibilit)o(y)j(\(alb)q(eit)f
+(small\))f(that)f(the)h(test)f Fi(s1==s2)0 2614 y Fp(will)17
+b(fail,)e(b)q(ecause)h(some)e(other)h(agen)o(t)f(ma)o(y)g(mo)q(dify)h(the)g
+(\014le)h(b)q(et)o(w)o(een)f(the)g(times)g(it)g(w)o(as)f(written)h(and)g
+(read.)p eop
+%%Page: 46 46
+bop 0 -40 a Fp(T-46)1417 b Fj(8)45 b(INPUT/OUTPUT)71 105 y
+Fp(Also)16 b(note)g(ho)o(w)g(this)g(program)f(is)i(formatted,)e(giving)i(it)f
+(an)g(\\imp)q(erativ)o(e)h(feel.")24 b(W)l(e)16 b(can)g(enhance)i(this)0
+162 y(st)o(yle)d(b)o(y)g(using)h(an)g(in\014x)g(apply)g(op)q(erator:)71
+271 y Fi(infixr)23 b(0)g($)71 327 y(f)g($)h(a)71 b(=)24 b(f)g(a)71
+407 y(main)94 b(=)24 b(writeFile)47 b("ReadMe")22 b(s1)i(exit)f($)309
+463 y(readFile)71 b("ReadMe")94 b(exit)23 b($)h(\\s2->)309
+520 y(appendChan)f(stdout)g(\(if)g(s1==s2)g(then)h("contents)e(match")1001
+576 y(else)i("somebody)e(intervened!"\))g(exit)i($)309 632
+y(done)0 742 y Fp(This)12 b(v)o(ersion)h(has)e(the)h(adv)m(an)o(tage)g(of)f
+(not)h(requiring)h(the)f(nesting)g(of)g(paren)o(theses,)g(whic)o(h)h(in)f
+(larger)g(programs)0 798 y(can)j(b)q(ecome)h(quite)g(anno)o(ying.)0
+1050 y Fg(8.3)56 b(T)-5 b(erminal)16 b(I/O)0 1208 y Fp(Sp)q(ecial)h(men)o
+(tion)d(should)i(b)q(e)f(made)g(of)f(reading)h(from)f(standard)g(input,)h(in)
+g(that)f(what)g(is)h(returned)g(is)g(a)f(lazy)0 1264 y(string,)f(just)g(as)g
+(for)g(a)g(\014le.)20 b(The)13 b(\014rst)g(issue)h(that)f(arises)g(is)h
+(whether)f(the)h(input)g(is)g(\\ec)o(ho)q(ed")f(on)g(the)h(terminal,)0
+1320 y(or)e(whether)h(the)g(user)f(is)h(required)h(to)e(do)h(so)f(explicitly)
+l(.)22 b(The)13 b(answ)o(er)f(is)h(that)f(w)o(e)g(ha)o(v)o(e)g(a)h(c)o
+(hoice!)20 b(The)12 b(default)0 1377 y(is)k(that)f(ec)o(hoing)i(is)f(\\on,")f
+(but)g(it)h(can)g(b)q(e)g(turned)h(o\013)d(\(or)h(on\))h(using)g(the)g
+Fi(echo)f Fp(transaction,)g(whic)o(h)h(tak)o(es)f(a)0 1433
+y(b)q(o)q(olean)h(argumen)o(t)f(along)g(with)g(the)h(\(ubiquitous\))g
+(failure)g(and)f(success)h(con)o(tin)o(uations:)71 1545 y Fi(echo)476
+b(::)24 b(Bool)f(->)h(FailCont)f(->)g(SuccCont)g(->)h(Dialogue)0
+1654 y Fp(T)l(urning)19 b(ec)o(hoing)f(o\013)f(w)o(ould)h(b)q(e)g(required)h
+(if,)f(for)f(example,)h(w)o(e)g(w)o(an)o(ted)f(to)g(write)g(a)h(screen-orien)
+o(ted)g(text)0 1710 y(editor.)71 1823 y(Since)13 b(the)f(result)g(of)f
+(reading)i(from)e Fi(stdin)g Fp(is)h(a)g(lazy)g(string,)g(that)f(means)h(it)g
+(only)g(has)g(to)f(b)q(e)h(done)h Fo(onc)n(e)e Fp(for)0 1880
+y(a)k(giv)o(en)h(program|indeed,)g(a)f(run-time)i(error)e(will)i(result)f(if)
+f(it)h(is)g(done)g(more)f(than)g(once.)21 b(But)16 b(this)g(raises)0
+1936 y(the)f(follo)o(wing)g(question:)20 b(if)c(ec)o(hoing)f(is)g(enabled,)h
+(the)f(input)h(stream)d(will)k(app)q(ear)e(on)f(the)h Fi(stdecho)f
+Fp(c)o(hannel)0 1993 y(\(whic)o(h)k(on)g(most)f(systems)h(is)g(synon)o(ymous)
+g(with)g Fi(stdout)o Fp(\);)h(but)f(then)g(ho)o(w)f(is)i(this)f(output)g
+(\\in)o(terlea)o(v)o(ed")0 2049 y(with)e(explicit)h(output)e(to)f(the)i(same)
+f(c)o(hannel?)71 2162 y(T)l(o)c(giv)o(e)h(a)g(formal)g(answ)o(er)f(to)h(this)
+g(question)h(requires)f(de\014ning)i(precisely)g(the)e(b)q(eha)o(vior)g(of)g
+(the)g(op)q(erating)0 2218 y(system;)j(that's)g(wh)o(y)g(in)i(the)e(App)q
+(endix)j(of)d(the)h(Rep)q(ort)g(a)g(sp)q(eci\014cation)h(of)e(the)h(op)q
+(erating)g(system)f(is)h(giv)o(en)0 2275 y(in)g(Hask)o(ell)g(co)q(de.)21
+b(Here,)15 b(w)o(e)g(simply)h(giv)o(e)f(an)h(op)q(erational)f(description)i
+(of)e(the)g(exp)q(ected)i(b)q(eha)o(vior.)71 2388 y(First,)e(w)o(e)h(m)o(ust)
+g(consider)h(whether)f(ec)o(hoing)h(is)g(enabled)g(or)f(disabled.)25
+b(With)16 b(ec)o(ho)g(enabled,)i(w)o(e)e(w)o(ould)0 2444 y(exp)q(ect)h(line)h
+(editing)f(functions)g(lik)o(e)g(\\rub)q(out")f(to)g(b)q(e)g(handled)i
+Fo(b)n(efor)n(e)e Fp(the)g(program)f(is)h(allo)o(w)o(ed)h(to)e(see)i(the)0
+2501 y(result,)i(and)f(indeed)i(that's)d(what)g(happ)q(ens)i(in)g(Hask)o
+(ell.)29 b(This)19 b(means)f(that)f(the)h(user)g(input)h(is)g(e\013ectiv)o
+(ely)0 2557 y(seen)e(\\line-at-a-time,")h(since)f(a)f(series)h(of)f(rub)q
+(outs)h(could)h(o)q(ccur)e(at)g(an)o(y)g(p)q(oin)o(t)h(in)h(the)e(line.)26
+b(Consider,)17 b(for)0 2614 y(example,)f(this)f(program:)p
+eop
+%%Page: 47 47
+bop 0 -40 a Fj(8.4)45 b(Finer)15 b(Lev)o(el)i(of)d(Con)o(trol)1311
+b Fp(T-47)71 160 y Fi(main)285 b(=)24 b(echo)f(flag)h(exit)262
+b($)500 216 y(readChan)23 b(stdin)g(exit)143 b($)23 b(\\s->)500
+272 y(appendChan)g(stdout)g(s)g(exit)h($)500 329 y(done)0 438
+y Fp(If)13 b Fi(flag)e Fp(is)i Fi(True)p Fp(,)f(ec)o(hoing)h(will)h(b)q(e)f
+(enabled,)h(and)e(the)h(user)f(will)i(b)q(e)f(able)g(to)f(t)o(yp)q(e)g(an)g
+(en)o(tire)h(line,)h(with)f(correc-)0 494 y(tions)k(b)q(eing)h(dutifully)h
+(pro)q(cessed.)25 b(When)17 b(a)f(new-line)j(c)o(haracter)d(is)h(t)o(yp)q
+(ed,)g(the)g Fi(appendChan)e Fp(transaction)0 551 y(will)20
+b(then)f(b)q(e)g(able)g(to)f(\\see")g(the)h(result,)g(and)g(will)h(th)o(us)e
+(displa)o(y)h(the)g(line)h(just)e(t)o(yp)q(ed,)h(with)g(corrections.)0
+607 y(This)d(pro)q(cess)f(will)i(then)f(rep)q(eat)f(for)g(subsequen)o(t)h
+(lines;)g(in)g(other)f(w)o(ords,)f(the)h(ec)o(hoing)h(and)g(explicit)h
+(output)0 664 y(are)f(in)o(terlea)o(v)o(ed)h(line-at-a-time.)26
+b(Note)16 b(that)g(this)h(program)e(is)i(essen)o(tially)h(in)f(an)g
+(in\014nite)h(lo)q(op,)f(unless)h(the)0 720 y(user)h(terminates)h(the)f
+(input)h(sequence)h(\(suc)o(h)e(as)g(via)h(Cn)o(trl-D)f(in)h(a)f(Unix)h(en)o
+(vironmen)o(t\),)g(in)g(whic)o(h)g(case)0 777 y Fi(appendChan)14
+b Fp(can)h(\014nish)i(its)e(task.)71 858 y(On)j(the)h(other)f(hand,)h(if)f
+Fi(flag)g Fp(is)h Fi(False)o Fp(,)g(ec)o(hoing)g(is)f(disabled,)j(and)d
+Fi(appendChan)f Fp(will)j(see)f(the)f(input)0 915 y(c)o(haracter-b)o(y-c)o
+(haracter.)g(Th)o(us)12 b(the)g(e\013ect)f(of)h Fi(appendChan)e
+Fp(will)k(b)q(e)f(to)e(do)h(c)o(haracter-b)o(y-c)o(haracter)f(ec)o(hoing!)71
+996 y(The)17 b(other)f(factor)g(in)i(determining)g(the)g(in)o(terlea)o(ving)g
+(b)q(eha)o(vior)f(is)h(the)f(degree)g(to)f(whic)o(h)i(the)f(program)0
+1052 y Fo(dep)n(ends)j Fp(on)h(the)g(input)h(stream.)36 b(F)l(or)20
+b(example,)j(a)e(program)f(that)g(prin)o(ts)h(one)g Fi("X")g
+Fp(for)f(ev)o(ery)h(10)f(input)0 1109 y(c)o(haracters)14 b(will)j(b)q(eha)o
+(v)o(e)f(as)f(exp)q(ected;)h(here)f(is)h(suc)o(h)f(a)g(program:)71
+1218 y Fi(main)94 b(=)24 b(readChan)f(stdin)g(exit)g($)h(\\s->)309
+1274 y(let)g(loop)f(n)48 b([])310 b(=)23 b(done)405 1331 y(loop)g(n)h
+(\(x:xs\))f(|)g(n==10)48 b(=)23 b(appendChan)g(stdout)g("X")g(exit)h($)1001
+1387 y(loop)95 b(1)48 b(xs)739 1444 y(|)23 b(True)72 b(=)23
+b(loop)h(\(n+1\))f(xs)309 1500 y(in)h(loop)f(1)h(s)0 1612 y
+Fp(This)19 b(program)e(also)h(demonstrates)g(ho)o(w)f(to)h(write)g(a)g(lo)q
+(op)h(\(i.e.)f(a)g(recursion\))g(using)h(con)o(tin)o(uations.)30
+b(\(See)0 1668 y Fn(x)p Fp(7.7)14 b(for)h(another)g(example)h(of)f(sync)o
+(hronizing)h(input)h(with)e(output.\))71 1750 y(There)g(are)g(sev)o(eral)g(v)
+o(ery)g(useful)h(prede\014ned)h(functions)f(in)g(Hask)o(ell)g(that)f(mak)o(e)
+f(in)o(teractions)i(with)f(stan-)0 1806 y(dard)20 b(input)h(and)f(output)g
+(relativ)o(ely)h(painless.)36 b(These)21 b(are)e Fi(print)p
+Fp(,)h Fi(prints)p Fp(,)g(and)h Fi(interact)o Fp(,)f(whic)o(h)h(are)0
+1862 y(describ)q(ed)c(in)f(Section)g Fn(x)p Fp(7.5)f(of)f(the)i(Rep)q(ort.)0
+2009 y Fg(8.4)56 b(Finer)18 b(Lev)n(el)f(of)i(Con)n(trol)0
+2120 y Fp(Sometimes)c(\(although)f(rarely\))g(the)h(user)f(will)i(need)g(a)e
+(\014ner)h(lev)o(el)h(of)e(con)o(trol)g(o)o(v)o(er)f(I/O)i(than)f(that)g(pro)
+o(vided)0 2176 y(b)o(y)g(the)f(standard)h(set)f(of)g(I/O)h(transactions)f
+(pro)o(vided)i(in)f(Hask)o(ell)h(\(for)e(example,)h(sometimes)g(it)g(is)g
+(necessary)0 2233 y(to)f(explicitly)k(op)q(en)e(and)f(close)h(\014les\).)20
+b(This)15 b(fact)e(is)i(recognized)g(in)g(App)q(endix)h Fn(x)p
+Fp(C,)e(where)g(an)g(alternativ)o(e)g(set)0 2289 y(of)h(I/O)g(op)q(erations)h
+(is)f(suggested)h(and)f(that)f(some)h(implemen)o(tations)i(ma)o(y)d(supp)q
+(ort.)p eop
+%%Page: 48 48
+bop 0 -40 a Fp(T-48)1597 b Fj(9)45 b(ARRA)l(YS)0 105 y Fq(9)69
+b(Arra)n(ys)0 236 y Fp(Ideally)l(,)13 b(arra)o(ys)d(in)i(a)f(functional)h
+(language)f(w)o(ould)g(b)q(e)h(regarded)f(simply)h(as)f(functions)h(from)e
+(indices)j(to)d(v)m(alues,)0 292 y(but)16 b(pragmatically)l(,)g(in)h(order)e
+(to)g(assure)h(e\016cien)o(t)g(access)g(to)f(arra)o(y)g(elemen)o(ts,)h(w)o(e)
+f(need)i(to)e(b)q(e)h(sure)g(w)o(e)g(can)0 349 y(tak)o(e)h(adv)m(an)o(tage)g
+(of)h(the)g(sp)q(ecial)h(prop)q(erties)g(of)e(the)h(domains)g(of)g(these)g
+(functions,)h(whic)o(h)f(are)g(isomorphic)0 405 y(to)h(\014nite)i(con)o
+(tiguous)f(subsets)g(of)f(the)h(in)o(tegers.)34 b(Hask)o(ell,)21
+b(therefore,)f(do)q(es)g(not)g(treat)f(arra)o(ys)f(as)h(general)0
+462 y(functions)d(with)f(an)h(application)g(op)q(eration,)g(but)f(as)g
+(abstract)f(data)g(t)o(yp)q(es)i(with)f(a)g(subscript)h(op)q(eration.)71
+546 y(Tw)o(o)11 b(main)h(approac)o(hes)g(to)f(functional)j(arra)o(ys)c(ma)o
+(y)i(b)q(e)g(discerned:)20 b Fo(incr)n(emental)11 b Fp(and)h
+Fo(monolithic)g Fp(de\014ni-)0 603 y(tion.)20 b(In)15 b(the)f(incremen)o(tal)
+h(case,)f(w)o(e)g(ha)o(v)o(e)g(a)g(function)h(that)e(pro)q(duces)i(an)g(empt)
+o(y)e(arra)o(y)g(of)h(a)g(giv)o(en)h(size)g(and)0 659 y(another)f(that)f(tak)
+o(es)g(an)h(arra)o(y)l(,)f(an)h(index,)h(and)f(a)g(v)m(alue,)h(pro)q(ducing)g
+(a)f(new)g(arra)o(y)f(that)g(di\013ers)h(from)f(the)h(old)0
+716 y(one)i(only)g(at)f(the)h(giv)o(en)h(index.)23 b(Ob)o(viously)l(,)17
+b(a)e(naiv)o(e)i(implemen)o(tation)g(of)e(suc)o(h)h(an)g(arra)o(y)f(seman)o
+(tics)h(w)o(ould)0 772 y(b)q(e)h(in)o(tolerably)g(ine\016cien)o(t,)g
+(requiring)g(a)e(new)h(cop)o(y)g(of)g(an)f(arra)o(y)g(for)g(eac)o(h)h
+(incremen)o(tal)h(rede\014nition;)h(th)o(us,)0 829 y(serious)13
+b(attempts)e(at)g(using)i(this)f(approac)o(h)g(emplo)o(y)h(sophisticated)g
+(static)f(analysis)g(and)h(clev)o(er)g(run-time)f(de-)0 885
+y(vices)j(to)f(a)o(v)o(oid)h(excessiv)o(e)g(cop)o(ying.)20
+b(The)15 b(monolithic)h(approac)o(h,)e(on)g(the)h(other)f(hand,)h(constructs)
+f(an)g(arra)o(y)0 941 y(all)k(at)f(once,)g(without)g(reference)h(to)f(in)o
+(termediate)g(arra)o(y)f(v)m(alues.)27 b(Although)18 b(Hask)o(ell)g(has)f(an)
+g(incremen)o(tal)0 998 y(arra)o(y)d(up)q(date)i(op)q(erator,)e(the)h(main)h
+(thrust)e(of)h(the)g(arra)o(y)f(facilit)o(y)j(is)e(monolithic.)0
+1155 y Fg(9.1)56 b(Index)18 b(t)n(yp)r(es)0 1270 y Fp(The)d(Standard)h
+(Prelude)g(de\014nes)g(a)f(t)o(yp)q(e)g(class)h(of)f(arra)o(y)f(indices:)71
+1379 y Fi(class)47 b(\(Ord)23 b(a\))h(=>)f(Ix)h(a)47 b(where)166
+1436 y(range)166 b(::)24 b(\(a,a\))f(->)h([a])166 1492 y(index)166
+b(::)24 b(\(a,a\))f(a)h(->)f(Int)166 1549 y(inRange)118 b(::)24
+b(\(a,a\))f(->)h(a)f(->)h(Bool)0 1658 y Fp(Instance)12 b(declarations)g(are)e
+(pro)o(vided)i(for)f Fi(Int)o Fp(,)h Fi(Integer)o Fp(,)f Fi(Char)p
+Fp(,)g Fi(Bool)p Fp(,)g(and)h(tuples)g(of)e Fi(Ix)h Fp(t)o(yp)q(es;)h(in)g
+(addition,)0 1714 y(instances)17 b(ma)o(y)e(b)q(e)i(automatically)f(deriv)o
+(ed)h(for)f(en)o(umerated)g(and)g(tuple)h(t)o(yp)q(es.)23 b(W)l(e)16
+b(regard)f(the)i(primitiv)o(e)0 1771 y(t)o(yp)q(es)j(as)f(v)o(ector)g
+(indices)i(and)f(tuples)h(as)e(indices)i(of)f(m)o(ultidimensional)i
+(rectangular)e(arra)o(ys.)31 b(Note)20 b(that)0 1827 y(the)c(\014rst)g
+(argumen)o(t)f(of)h(eac)o(h)g(of)f(the)h(op)q(erations)h(of)e(class)h
+Fi(Ix)g Fp(is)h(a)e(pair)i(of)e(indices;)j(these)f(are)e(t)o(ypically)j(the)0
+1883 y Fo(b)n(ounds)g Fp(\(\014rst)f(and)h(last)g(indices\))i(of)e(an)g(arra)
+o(y)l(.)28 b(F)l(or)17 b(example,)j(the)e(b)q(ounds)h(of)f(a)f(10-elemen)o
+(t,)i(zero-origin)0 1940 y(v)o(ector)13 b(with)h Fi(Int)f Fp(indices)j(w)o
+(ould)e(b)q(e)h Fi(\(0,9\))o Fp(,)f(while)h(a)e(100)g(b)o(y)h(100)f(1-origin)
+h(matrix)f(migh)o(t)h(ha)o(v)o(e)f(the)h(b)q(ounds)0 1996 y
+Fi(\(\(1,1\),\(100,100\)\))n Fp(.)38 b(\(In)22 b(man)o(y)e(other)h
+(languages,)i(suc)o(h)f(b)q(ounds)g(w)o(ould)g(b)q(e)g(written)f(in)h(a)f
+(form)g(lik)o(e)0 2053 y Fi(1:100,)i(1:100)o Fp(,)17 b(but)g(the)g(presen)o
+(t)f(form)g(\014ts)h(the)g(t)o(yp)q(e)g(system)f(b)q(etter,)h(since)g(eac)o
+(h)g(b)q(ound)h(is)f(of)f(the)h(same)0 2109 y(t)o(yp)q(e)e(as)g(a)g(general)h
+(index.\))71 2194 y(The)g Fi(range)g Fp(op)q(eration)g(tak)o(es)g(a)f(b)q
+(ounds)j(pair)e(and)h(pro)q(duces)g(the)f(list)h(of)f(indices)i(lying)g(b)q
+(et)o(w)o(een)e(those)0 2250 y(b)q(ounds,)g(in)g(index)g(order.)k(F)l(or)14
+b(example,)617 2357 y Fi(range)23 b(\(0,4\))72 b Fn(\))i Fi([0,1,2,3,4])151
+2468 y(range)23 b(\(\(0,0\),\(1,2\)\))72 b Fn(\))i Fi([\(0,0\),)22
+b(\(0,1\),)h(\(0,2\),)h(\(1,0\),)f(\(1,1\),)g(\(1,2\)])0 2557
+y Fp(The)17 b Fi(inRange)g Fp(predicate)h(determines)g(whether)f(an)g(index)i
+(lies)f(b)q(et)o(w)o(een)g(a)e(giv)o(en)i(pair)g(of)e(b)q(ounds.)27
+b(\(F)l(or)16 b(a)0 2614 y(tuple)d(t)o(yp)q(e,)f(this)g(test)f(is)h(p)q
+(erformed)g(comp)q(onen)o(t)o(wise.\))19 b(Finally)l(,)14 b(the)e
+Fi(index)f Fp(op)q(eration)h(is)g(what)f(is)i(needed)g(to)p
+eop
+%%Page: 49 49
+bop 0 -40 a Fj(9.2)45 b(Arra)o(y)14 b(Creation)1451 b Fp(T-49)0
+105 y(address)13 b(a)g(particular)h(elemen)o(t)g(of)f(an)g(arra)o(y:)k(Giv)o
+(en)d(a)f(b)q(ounds)h(pair)g(and)f(an)g(in-range)h(index,)g(the)g(op)q
+(eration)0 162 y(yields)j(the)e(zero-origin)h(ordinal)g(of)f(the)g(index)i
+(within)f(the)f(range;)g(for)g(example:)712 259 y Fi(index)23
+b(\(1,9\))g(2)73 b Fn(\))h Fi(1)569 357 y(index)23 b(\(\(0,0\),\(1,2\)\))f
+(\(1,1\))73 b Fn(\))g Fi(5)0 501 y Fg(9.2)56 b(Arra)n(y)19
+b(Creation)0 610 y Fp(Hask)o(ell's)h(monolithic)h(arra)o(y)d(creation)i
+(function)h(forms)d(an)i(arra)o(y)e(from)h(a)g(pair)h(of)f(b)q(ounds)i(and)f
+(a)f(list)h(of)0 666 y(index-v)m(alue)e(pairs)d(\(an)g Fo(asso)n(ciation)h
+(list)p Fp(\):)71 778 y Fi(array)452 b(::)24 b(\(Ix)f(a\))h(=>)g(\(a,a\))f
+(->)g([Assoc)g(a)h(b])g(->)f(Array)g(a)h(b)0 887 y Fp(Notice)15
+b(the)f(t)o(yp)q(e)h Fi(Assoc)o Fp(;)f(to)g(impro)o(v)o(e)g(the)h(readabilit)
+o(y)g(of)f(arra)o(y)f(expressions,)i(the)f(pairs)h(in)g(the)g(asso)q(ciation)
+0 944 y(list)h(are)f(not)g(of)f(the)i(ordinary)f(sort,)f(but)h(of)g(another)g
+(tuple)h(t)o(yp)q(e)f(with)h(the)f(data)g(constructor)f Fi(\(:=\))p
+Fp(:)71 1053 y Fi(data)47 b(Assoc)23 b(a)h(b)214 b(=)48 b(a)24
+b(:=)f(b)0 1162 y Fp(Here,)15 b(for)g(example,)g(is)h(a)f(de\014nition)i(of)e
+(an)g(arra)o(y)f(of)h(the)g(squares)g(of)g(n)o(um)o(b)q(ers)g(from)f(1)h(to)g
+(100:)71 1271 y Fi(squares)404 b(=)48 b(array)23 b(\(1,100\))g([i)h(:=)f(i)h
+(*)g(i)f(|)h(i)g(<-)f([1..100]])0 1380 y Fp(This)17 b(arra)o(y)e(expression)j
+(is)f(t)o(ypical)g(in)h(using)f(a)f(list)h(comprehension)h(for)e(the)h(asso)q
+(ciation)g(list;)g(in)h(fact,)e(this)0 1436 y(usage)e(results)h(in)g(arra)o
+(y)e(expressions)i(m)o(uc)o(h)f(lik)o(e)h(the)g Fo(arr)n(ay)g(c)n(ompr)n
+(ehensions)e Fp(of)h(the)g(language)h(Id[4].)k(Arra)o(y)0 1493
+y(subscripting)f(is)f(p)q(erformed)g(with)g(the)g(in\014x)g(op)q(erator)f
+Fi(!)p Fp(,)g(and)h(the)g(b)q(ounds)g(of)f(an)h(arra)o(y)e(can)i(b)q(e)g
+(extracted)0 1549 y(with)f(the)f(function)h Fi(bounds)o Fp(:)748
+1606 y Fi(squares!7)72 b Fn(\))h Fi(49)628 1687 y(bounds)24
+b(squares)72 b Fn(\))h Fi(\(1,100\))0 1768 y Fp(W)l(e)15 b(migh)o(t)f
+(generalize)j(this)e(example)g(b)o(y)g(parameterizing)h(the)e(b)q(ounds)i
+(and)f(the)g(function)g(to)g(b)q(e)g(applied)i(to)0 1824 y(eac)o(h)e(index:)
+71 1924 y Fi(mkArray)404 b(::)24 b(\(Ix)f(a\))h(=>)g(\(a)f(->)h(b\))f(->)h
+(\(a,a\))f(->)h(Array)f(a)h(b)71 1981 y(mkArray)e(f)i(bnds)238
+b(=)48 b(array)23 b(bnds)g([i)h(:=)g(f)f(i)h(|)g(i)f(<-)h(range)f(bnds])0
+2090 y Fp(Th)o(us,)15 b(w)o(e)g(could)h(de\014ne)g Fi(squares)e
+Fp(as)h Fi(mkArray)23 b(\(\\i)h(->)f(i)h(*)g(i\))f(\(1,100\))o
+Fp(.)71 2170 y(Man)o(y)12 b(arra)o(ys)g(are)h(de\014ned)i(recursiv)o(ely;)g
+(that)e(is,)g(with)h(the)g(v)m(alues)g(of)f(some)g(elemen)o(ts)h(dep)q
+(ending)i(on)d(the)0 2226 y(v)m(alues)j(of)f(others.)20 b(Here,)15
+b(for)f(example,)i(w)o(e)f(ha)o(v)o(e)g(a)f(function)i(returning)g(an)f(arra)
+o(y)f(of)h(Fib)q(onacci)i(n)o(um)o(b)q(ers:)71 2335 y Fi(fibs)94
+b(::)24 b(Int)g(->)f(Array)g(Int)h(Int)71 2392 y(fibs)f(n)47
+b(=)h(a)g(where)23 b(a)h(=)f(array)g(\(0,n\))h(\([0)f(:=)h(1,)f(1)h(:=)g(1])f
+(++)954 2448 y([i)g(:=)h(a!\(i-2\))f(+)g(a!\(i-1\))g(|)h(i)g(<-)f([2..n]]\))0
+2557 y Fp(Another)18 b(example)i(of)e(suc)o(h)h(a)f(recurrence)h(is)g(the)g
+Fo(n)i Fp(b)o(y)e Fo(n)i(wavefr)n(ont)d Fp(matrix,)h(in)g(whic)o(h)h(elemen)o
+(ts)f(of)f(the)0 2614 y(\014rst)f(ro)o(w)e(and)j(\014rst)e(column)i(all)g(ha)
+o(v)o(e)e(the)h(v)m(alue)h Fo(1)24 b Fp(and)17 b(other)f(elemen)o(ts)i(are)e
+(sums)h(of)g(their)g(neigh)o(b)q(ors)h(to)p eop
+%%Page: 50 50
+bop 0 -40 a Fp(T-50)1597 b Fj(9)45 b(ARRA)l(YS)0 105 y Fp(the)15
+b(w)o(est,)f(north)o(w)o(est,)g(and)h(north:)71 214 y Fi(wavefront)165
+b(::)24 b(Int)f(->)h(Array)f(\(Int,Int\))g(Int)71 271 y(wavefront)f(n)119
+b(=)48 b(a)g(where)524 327 y(a)24 b(=)f(array)h(\(\(1,1\),\(n,n\)\))643
+383 y(\([\(1,j\))f(:=)h(1)g(|)f(j)h(<-)g([1..n]])e(++)667 440
+y([\(i,1\))h(:=)h(1)g(|)f(i)h(<-)g([2..n]])e(++)667 496 y([\(i,j\))h(:=)h
+(a!\(i,j-1\))e(+)i(a!\(i-1,j-1\))f(+)g(a!\(i-1,j\))954 553
+y(|)g(i)h(<-)g([2..n],)e(j)i(<-)g([2..n]]\))0 662 y Fp(The)13
+b(w)o(a)o(v)o(efron)o(t)d(matrix)i(is)h(so)f(called)i(b)q(ecause)g(in)f(a)f
+(parallel)i(implemen)o(tation,)g(the)f(recurrence)g(dictates)g(that)0
+718 y(the)f(computation)h(can)f(b)q(egin)h(with)g(the)f(\014rst)g(ro)o(w)f
+(and)i(column)g(in)g(parallel)h(and)e(pro)q(ceed)h(as)f(a)g(w)o(edge-shap)q
+(ed)0 775 y(w)o(a)o(v)o(e,)17 b(tra)o(v)o(elling)i(from)e(north)o(w)o(est)g
+(to)g(southeast.)28 b(It)18 b(is)g(imp)q(ortan)o(t)g(to)f(note,)h(ho)o(w)o
+(ev)o(er,)g(that)f(no)h(order)f(of)0 831 y(computation)e(is)h(sp)q(eci\014ed)
+h(b)o(y)e(the)h(asso)q(ciation)f(list.)71 959 y(In)h(eac)o(h)h(of)e(our)h
+(examples)h(so)f(far,)f(w)o(e)h(ha)o(v)o(e)g(giv)o(en)h(a)f(unique)h(asso)q
+(ciation)g(for)e(eac)o(h)i(index)g(of)f(the)g(arra)o(y)0 1015
+y(and)j(only)f(for)g(the)h(indices)h(within)g(the)e(b)q(ounds)h(of)f(the)h
+(arra)o(y)l(,)e(and)i(indeed,)h(w)o(e)e(m)o(ust)g(do)g(this)h(in)g(general)0
+1072 y(for)14 b(an)h(arra)o(y)f(b)q(e)i(fully)h(de\014ned.)k(An)15
+b(asso)q(ciation)h(with)f(an)g(out-of-b)q(ounds)h(index)g(results)f(in)h(an)f
+(error;)f(if)i(an)0 1128 y(index)g(is)e(missing)i(or)d(app)q(ears)i(more)f
+(than)g(once,)g(ho)o(w)o(ev)o(er,)g(there)g(is)h(no)f(immediate)i(error,)d
+(but)h(the)h(v)m(alue)g(of)0 1185 y(the)g(arra)o(y)f(at)g(that)g(index)i(is)g
+(then)f(unde\014ned,)i(so)d(that)h(subscripting)h(the)f(arra)o(y)f(with)h
+(suc)o(h)g(an)g(index)h(yields)0 1241 y(an)f(error.)0 1542
+y Fg(9.3)56 b(Accum)n(ulation)0 1721 y Fp(W)l(e)14 b(can)g(relax)g(the)g
+(restriction)g(that)f(an)h(index)h(app)q(ear)f(at)g(most)f(once)h(in)g(the)g
+(asso)q(ciation)h(list)f(b)o(y)g(sp)q(ecifying)0 1777 y(ho)o(w)h(to)g(com)o
+(bine)h(m)o(ultiple)i(v)m(alues)f(asso)q(ciated)e(with)h(a)g(single)g(index;)
+h(the)f(result)g(is)g(called)h(an)f Fo(ac)n(cumulate)n(d)0
+1834 y(arr)n(ay)p Fp(:)71 1943 y Fi(accumArray)22 b(::)i(\(Ix)f(a\))h(->)f
+(\(b)h(->)f(c)h(->)g(b\))f(->)h(b)g(->)f(\(a,a\))g(->)h([Assoc)f(a)h(c])f(->)
+h(Array)f(a)h(b)0 2054 y Fp(The)15 b(\014rst)g(argumen)o(t)g(of)g
+Fi(accumArray)e Fp(is)j(the)g Fo(ac)n(cumulating)g(function)p
+Fp(,)e(the)i(second)f(is)h(an)f(initial)j(v)m(alue)e(\(the)0
+2111 y(same)g(for)f(eac)o(h)i(elemen)o(t)g(of)e(the)i(arra)o(y\),)d(and)i
+(the)h(remaining)g(argumen)o(ts)e(are)h(b)q(ounds)h(and)f(an)h(asso)q
+(ciation)0 2167 y(list,)e(as)f(with)h(the)g Fi(array)e Fp(function.)21
+b(T)o(ypically)l(,)16 b(the)f(accum)o(ulating)g(function)g(is)g
+Fi(\(+\))p Fp(,)f(and)h(the)f(initial)j(v)m(alue,)0 2224 y(zero;)f(for)g
+(example,)h(this)f(function)h(tak)o(es)f(a)f(pair)i(of)f(b)q(ounds)h(and)f(a)
+g(list)h(of)f(v)m(alues)h(\(of)e(an)h(index)i(t)o(yp)q(e\))e(and)0
+2280 y(yields)h(a)e(histogram;)f(that)g(is,)i(a)e(table)i(of)f(the)g(n)o(um)o
+(b)q(er)h(of)e(o)q(ccurrences)j(of)d(eac)o(h)i(v)m(alue)g(within)h(the)e(b)q
+(ounds:)71 2389 y Fi(hist)285 b(::)24 b(\(Ix)f(a,)h(Integral)f(b\))g(=>)h
+(\(a,a\))f(->)h([a])f(->)h(Array)f(a)h(b)71 2446 y(hist)f(bnds)g(is)95
+b(=)48 b(accumArray)22 b(\(+\))i(0)g(bnds)f([i)h(:=)f(1)h(|)g(i)f(<-)h(is,)f
+(inRange)g(bnds)h(i])0 2557 y Fp(Supp)q(ose)c(w)o(e)e(ha)o(v)o(e)h(a)f
+(collection)j(of)d(measuremen)o(ts)h(on)g(the)f(in)o(terv)m(al)i([)p
+Fo(a)s Fh(;)8 b Fo(b)s Fp(\))o(,)20 b(and)f(w)o(e)f(w)o(an)o(t)g(to)g(divide)
+j(the)0 2614 y(in)o(terv)m(al)16 b(in)o(to)f(decades)h(and)g(coun)o(t)f(the)g
+(n)o(um)o(b)q(er)h(of)e(measuremen)o(ts)h(within)i(eac)o(h:)p
+eop
+%%Page: 51 51
+bop 0 -40 a Fj(9.4)45 b(Incremen)o(tal)16 b(up)q(dates)1348
+b Fp(T-51)71 160 y Fi(decades)213 b(::)24 b(\(RealFrac)f(a\))g(=>)h(a)g(->)f
+(a)h(->)f([a])h(->)f(Array)h(Int)f(Int)71 216 y(decades)f(a)i(b)119
+b(=)48 b(hist)23 b(\(0,9\))g(.)h(map)g(decade)524 272 y(where)f(decade)g(x)h
+(=)g(floor)f(\(\(x)g(-)h(a\))g(*)f(s\))667 329 y(s)191 b(=)24
+b(10)f(/)h(\(b)g(-)f(a\))0 572 y Fg(9.4)56 b(Incremen)n(tal)16
+b(up)r(dates)0 691 y Fp(In)d(addition)g(to)e(the)i(monolithic)g(arra)o(y)e
+(creation)h(functions,)h(Hask)o(ell)g(also)f(has)g(an)g(incremen)o(tal)i
+(arra)o(y)c(up)q(date)0 747 y(function,)15 b(written)g(as)f(the)h(in\014x)g
+(op)q(erator)f Fi(//)p Fp(;)g(the)h(simplest)h(case,)e(an)h(arra)o(y)e
+Fi(a)h Fp(with)h(elemen)o(t)h Fi(i)e Fp(up)q(dated)i(to)0 804
+y Fi(v)p Fp(,)e(is)i(written)e Fi(a)24 b(//)g([i)f(:=)h(v])p
+Fp(.)19 b(The)c(reason)g(for)f(the)g(square)h(brac)o(k)o(ets)f(is)h(that)f
+(the)h(left)g(argumen)o(t)f(of)h Fi(\(//\))0 860 y Fp(is)h(an)f(asso)q
+(ciation)g(list,)h(usually)h(con)o(taining)f(a)e(prop)q(er)i(subset)f(of)g
+(the)g(indices)j(of)c(the)i(arra)o(y:)71 969 y Fi(\(//\))285
+b(::)24 b(\(Ix)f(a\))h(=>)g(Array)f(a)h(b)f(->)h([Assoc)f(a)h(b])f(->)h
+(Array)f(a)h(b)0 1078 y Fp(As)15 b(with)h(the)f Fi(array)g
+Fp(function,)h(the)f(indices)i(in)f(the)g(asso)q(ciation)g(list)g(m)o(ust)e
+(b)q(e)i(unique)h(for)e(the)g(v)m(alues)i(to)d(b)q(e)0 1135
+y(de\014ned.)21 b(F)l(or)15 b(example,)g(here)h(is)g(a)f(function)h(to)e(in)o
+(terc)o(hange)i(t)o(w)o(o)e(ro)o(ws)g(of)h(a)f(matrix:)71 1243
+y Fi(swapRows)22 b(::)i(\(Ix)f(a,)h(Ix)g(b,)f(Enum)g(b\))h(=>)g(a)f(->)h(a)g
+(->)f(Array)g(\(a,b\))h(c)f(->)h(Array)f(\(a,b\))g(c)71 1300
+y(swapRows)f(i)i(i')g(a)f(=)48 b(a)24 b(//)f(\([\(i,j\))47
+b(:=)24 b(a!\(i',j\))e(|)i(j)g(<-)f([jLo..jHi]])g(++)667 1356
+y([\(i',j\))g(:=)h(a!\(i,)f(j\))g(|)h(j)g(<-)f([jLo..jHi]]\))524
+1413 y(where)g(\(\(iLo,jLo\),\(iHi,jHi\)\))e(=)j(bounds)f(a)0
+1522 y Fp(The)15 b(concatenation)f(here)h(of)g(t)o(w)o(o)e(separate)h(list)h
+(comprehensions)h(o)o(v)o(er)d(the)i(same)f(list)i(of)e Fi(j)g
+Fp(indices)j(is,)d(ho)o(w-)0 1578 y(ev)o(er,)i(a)h(sligh)o(t)g
+(ine\016ciency;)i(it's)d(lik)o(e)i(writing)f(t)o(w)o(o)e(lo)q(ops)i(where)g
+(one)f(will)i(do)f(in)g(an)g(imp)q(erativ)o(e)g(language.)0
+1635 y(Nev)o(er)e(fear,)g(w)o(e)f(can)i(p)q(erform)f(the)g(equiv)m(alen)o(t)i
+(of)e(a)g(lo)q(op)g(fusion)h(optimization)g(in)g(Hask)o(ell:)71
+1744 y Fi(swapRows)22 b(i)i(i')g(a)f(=)48 b(a)24 b(//)f([assoc)g(|)h(j)g(<-)f
+([jLo..jHi],)858 1800 y(assoc)g(<-)h([\(i,)f(j\))h(:=)f(a!\(i',j\),)1097
+1857 y(\(i',j\))g(:=)g(a!\(i,)h(j\)])f(])524 1913 y(where)g
+(\(\(iLo,jLo\),\(iHi,jHi\)\))e(=)j(bounds)f(a)0 2156 y Fg(9.5)56
+b(An)19 b(example:)j(Matrix)c(Multiplication)0 2275 y Fp(W)l(e)13
+b(complete)h(our)f(in)o(tro)q(duction)h(to)e(Hask)o(ell)i(arra)o(ys)e(with)h
+(the)g(familiar)h(example)g(of)e(matrix)h(m)o(ultiplication,)0
+2331 y(taking)k(adv)m(an)o(tage)f(of)g(o)o(v)o(erloading)h(to)f(de\014ne)i(a)
+e(fairly)i(general)f(function.)25 b(Since)18 b(only)g(m)o(ultiplication)h
+(and)0 2388 y(addition)c(on)f(the)f(elemen)o(t)i(t)o(yp)q(e)f(of)f(the)h
+(matrices)g(is)g(in)o(v)o(olv)o(ed,)h(w)o(e)e(get)h(a)f(function)i(that)e(m)o
+(ultiplies)j(matrices)0 2444 y(of)h(an)o(y)g(n)o(umeric)h(t)o(yp)q(e)g
+(unless)h(w)o(e)e(try)g(hard)g(not)g(to.)26 b(Additionally)l(,)20
+b(if)e(w)o(e)f(are)g(careful)h(to)f(apply)h(only)g Fi(\(!\))0
+2501 y Fp(and)f(the)h(op)q(erations)f(of)g Fi(Ix)g Fp(to)g(indices,)i(w)o(e)e
+(get)g(genericit)o(y)h(o)o(v)o(er)e(index)j(t)o(yp)q(es,)e(and)h(in)g(fact,)f
+(the)g(four)g(ro)o(w)0 2557 y(and)e(column)h(index)f(t)o(yp)q(es)g(need)h
+(not)e(all)i(b)q(e)f(the)g(same.)k(F)l(or)14 b(simplicit)o(y)l(,)j(ho)o(w)o
+(ev)o(er,)d(w)o(e)g(require)i(that)e(the)h(left)0 2614 y(column)g(indices)g
+(and)f(righ)o(t)g(ro)o(w)e(indices)k(b)q(e)f(of)e(the)h(same)f(t)o(yp)q(e,)h
+(and)g(moreo)o(v)o(er,)e(that)h(the)h(b)q(ounds)g(b)q(e)h(equal:)p
+eop
+%%Page: 52 52
+bop 0 -40 a Fp(T-52)1597 b Fj(9)45 b(ARRA)l(YS)71 160 y Fi(matMult)213
+b(::)24 b(\(Ix)f(a,)h(Ix)g(b,)f(Ix)h(c,)f(Num)h(d\))f(=>)524
+216 y(Array)g(\(a,b\))g(d)h(->)g(Array)f(\(b,c\))g(d)h(->)f(Array)h(\(a,c\))f
+(d)71 272 y(matMult)f(x)i(y)119 b(=)48 b(array)23 b(resultBounds)667
+329 y([\(i,j\))g(:=)h(sum)f([x!\(i,k\))g(*)h(y!\(k,j\))f(|)g(k)h(<-)g(range)f
+(\(lj,uj\)])1025 385 y(|)h(i)g(<-)f(range)g(\(li,ui\),)1073
+442 y(j)h(<-)f(range)g(\(lj',uj'\))g(])261 498 y(where)h
+(\(\(li,lj\),\(ui,uj\)\))212 b(=)48 b(bounds)23 b(x)405 555
+y(\(\(li',lj'\),\(ui',uj'\)\))116 b(=)48 b(bounds)23 b(y)405
+611 y(resultBounds)452 668 y(|)h(\(lj,uj\)==\(li',ui'\))93
+b(=)48 b(\(\(li,lj'\),\(ui,uj'\)\))452 724 y(|)24 b(otherwise)309
+b(=)24 b(error)f("matMult:)g(incompatible)f(bounds")0 833 y
+Fp(As)16 b(an)h(aside,)g(w)o(e)f(can)g(also)h(de\014ne)g Fi(matMult)f
+Fp(using)h Fi(accumArray)n Fp(,)g(resulting)g(in)g(a)f(presen)o(tation)h
+(that)e(more)0 890 y(closely)h(resem)o(bles)g(the)g(usual)g(form)o(ulation)f
+(in)h(an)f(imp)q(erativ)o(e)h(language:)71 999 y Fi(matMult)22
+b(x)i(y)119 b(=)48 b(accumArray)22 b(\(+\))i(0)g(resultBounds)786
+1055 y([\(i,j\))g(:=)f(x!\(i,k\))g(*)h(y!\(k,j\))977 1112 y(|)g(i)g(<-)f
+(range)h(\(li,ui\),)1025 1168 y(j)g(<-)f(range)h(\(lj',uj'\))1025
+1224 y(k)g(<-)f(range)h(\(lj,uj\))46 b(])261 1281 y(where)24
+b(\(\(li,lj\),\(ui,uj\)\))212 b(=)48 b(bounds)23 b(x)405 1337
+y(\(\(li',lj'\),\(ui',uj'\)\))116 b(=)48 b(bounds)23 b(y)405
+1394 y(resultBounds)452 1450 y(|)h(\(lj,uj\)==\(li',ui'\))93
+b(=)48 b(\(\(li,lj'\),\(ui,uj'\)\))452 1507 y(|)24 b(otherwise)309
+b(=)24 b(error)f("matMult:)g(incompatible)f(bounds")71 1718
+y Fp(W)l(e)16 b(can)h(generalize)h(further)e(b)o(y)h(making)g(the)f(function)
+i(higher-order,)f(simply)h(replacing)g Fi(sum)e Fp(and)g Fi(\(*\))0
+1775 y Fp(b)o(y)f(functional)i(parameters:)71 1883 y Fi(genMatMult)141
+b(::)24 b(\(Ix)f(a,)h(Ix)g(b,)f(Ix)h(c\))f(=>)524 1940 y(\([f])g(->)h(g\))f
+(->)h(\(d)g(->)f(e)h(->)g(f\))f(->)524 1996 y(Array)g(\(a,b\))g(d)h(->)g
+(Array)f(\(b,c\))g(e)h(->)f(Array)h(\(a,c\))f(g)71 2053 y(genMatMult)f(f)i(g)
+g(x)f(y)48 b(=)f(array)24 b(resultBounds)643 2109 y([\(i,j\))f(:=)h(f)g
+([x!\(i,k\))e(`g`)i(y!\(k,j\))f(|)h(k)f(<-)h(range)f(\(lj,uj\)])858
+2166 y(|)h(i)g(<-)f(range)g(\(li,ui\),)906 2222 y(j)h(<-)f(range)g
+(\(lj',uj'\))g(])261 2279 y(where)h(\(\(li,lj\),\(ui,uj\)\))212
+b(=)48 b(bounds)23 b(x)405 2335 y(\(\(li',lj'\),\(ui',uj'\)\))116
+b(=)48 b(bounds)23 b(y)405 2392 y(resultBounds)452 2448 y(|)h
+(\(lj,uj\)==\(li',ui'\))93 b(=)48 b(\(\(li,lj'\),\(ui,uj'\)\))452
+2504 y(|)24 b(otherwise)309 b(=)24 b(error)f("matMult:)g(incompatible)f
+(bounds")0 2614 y Fp(APL)16 b(fans)f(will)h(recognize)g(the)g(usefulness)g
+(of)f(functions)h(lik)o(e)g(the)g(follo)o(wing:)p eop
+%%Page: 53 53
+bop 1857 -40 a Fp(T-53)71 160 y Fi(genMatMult)22 b(maximum)h(\(-\))71
+216 y(genMatMult)f(and)i(\(==\))0 328 y Fp(With)15 b(the)g(\014rst)f(of)g
+(these,)h(the)g(argumen)o(ts)f(are)g(n)o(umeric)i(matrices,)e(and)h(the)g(\()
+p Fo(i)5 b Fh(;)j Fo(j)f Fp(\))m(-th)15 b(elemen)o(t)g(of)g(the)g(result)0
+384 y(is)g(the)g(maxim)o(um)f(di\013erence)i(b)q(et)o(w)o(een)f(corresp)q
+(onding)h(elemen)o(ts)f(of)f(the)h Fo(i)5 b Fp(-th)14 b(ro)o(w)g(and)h
+Fo(j)6 b Fp(-th)15 b(column)h(of)e(the)0 441 y(inputs.)30 b(In)18
+b(the)h(second)f(case,)h(the)f(argumen)o(ts)f(are)h(matrices)g(of)g(an)o(y)g
+(equalit)o(y)h(t)o(yp)q(e,)f(and)h(the)f(result)h(is)f(a)0
+497 y(Bo)q(olean)d(matrix)f(in)h(whic)o(h)g(elemen)o(t)g(\()p
+Fo(i)5 b Fh(;)j Fo(j)f Fp(\))k(is)k Fi(True)f Fp(if)g(and)h(only)g(if)f(the)g
+Fo(i)5 b Fp(-th)14 b(ro)o(w)g(of)f(the)i(\014rst)e(argumen)o(t)h(and)0
+553 y Fo(j)7 b Fp(-th)15 b(column)h(of)f(the)g(second)h(are)e(equal)i(as)f(v)
+o(ectors.)71 629 y(Notice)k(that)f(the)h(elemen)o(t)g(t)o(yp)q(es)g(of)g
+Fi(genMatMult)e Fp(need)j(not)e(b)q(e)i(the)e(same,)i(but)e(merely)i
+(appropriate)0 685 y(for)c(the)i(function)f(parameter)g Fi(g)p
+Fp(.)25 b(W)l(e)17 b(could)h(generalize)h(still)f(further)f(b)o(y)g(dropping)
+h(the)f(requiremen)o(t)h(that)0 742 y(the)i(\014rst)f(column)i(index)f(and)g
+(second)g(ro)o(w)f(index)i(t)o(yp)q(es)f(b)q(e)g(the)g(same;)h(clearly)l(,)h
+(t)o(w)o(o)c(matrices)i(could)g(b)q(e)0 798 y(considered)14
+b(conformable)g(as)e(long)i(as)e(the)i(lengths)f(of)g(the)g(columns)h(of)e
+(the)i(\014rst)e(and)i(the)f(ro)o(ws)f(of)g(the)h(second)0
+855 y(are)k(equal.)28 b(The)18 b(reader)g(ma)o(y)f(wish)h(to)f(deriv)o(e)h
+(this)h(still)g(more)e(general)h(v)o(ersion.)27 b(\()p Fc(Hin)o(t:)e
+Fp(Use)18 b(the)g Fi(index)0 911 y Fp(op)q(eration)d(to)g(determine)h(the)f
+(lengths.\))0 1070 y Fq(10)69 b(Ac)n(kno)n(wledgemen)n(ts)0
+1190 y Fp(Thanks)20 b(to)g(P)o(atricia)h(F)l(asel)f(and)h(Mark)f(Mundt)g(at)g
+(Los)g(Alamos,)i(and)e(Nic)o(k)h(Carriero,)g(Charles)g(Consel,)0
+1247 y(Amir)f(Kishon,)h(Sandra)e(Lo)q(osemore,)h(Martin)f(Odersky)l(,)h(John)
+g(P)o(eterson,)g(and)f(Da)o(vid)h(Ro)q(c)o(h)o(b)q(erg)f(at)g(Y)l(ale)0
+1303 y(Univ)o(ersit)o(y)i(for)f(their)g(quic)o(k)i(readings)e(of)g(earlier)h
+(drafts)f(of)g(this)h(man)o(uscript.)35 b(Sp)q(ecial)23 b(thanks)d(to)f(John)
+0 1360 y(P)o(eterson)c(for)f(getting)h(the)h(bugs)f(out)g(of)f(our)h(Hask)o
+(ell)h(co)q(de.)0 1519 y Fq(References)0 1636 y Fp([1])22 b(R.)d(Bird)h(and)f
+(P)l(.)g(W)l(adler.)32 b Fo(Intr)n(o)n(duction)19 b(to)h(F)m(unctional)f(Pr)n
+(o)n(gr)n(amming)p Fp(.)31 b(Pren)o(tice)20 b(Hall,)g(New)g(Y)l(ork,)71
+1692 y(1988.)0 1780 y([2])i(P)l(.)14 b(Hudak.)20 b(Conception,)c(ev)o
+(olution,)f(and)g(application)i(of)e(functional)h(programming)e(languages.)20
+b Fo(A)o(CM)71 1836 y(Computing)c(Surveys)p Fp(,)e(21\(3\):359{411,)d(1989.)0
+1924 y([3])22 b(P)l(.)c(Hudak,)h(S.)f(P)o(eyton)f(Jones,)i(and)g(P)l(.)f(W)l
+(adler)g(\(editors\).)29 b(Rep)q(ort)18 b(on)g(the)h(Programming)e(Language)
+71 1981 y(Hask)o(ell,)23 b(A)e(Non-strict)g(Purely)h(Functional)g(Language)f
+(\(Version)g(1.2\).)36 b Fo(A)o(CM)20 b(SIGPLAN)g(Notic)n(es)p
+Fp(,)71 2037 y(27\(5\),)13 b(Ma)o(y)h(1992.)0 2125 y([4])22
+b(R.S.)c(Nikhil.)30 b(Id)18 b(\(v)o(ersion)g(90.0\))f(reference)h(man)o(ual.)
+29 b(T)l(ec)o(hnical)19 b(rep)q(ort,)f(Massac)o(h)o(usetts)f(Institute)h(of)
+71 2181 y(T)l(ec)o(hnology)l(,)d(Lab)q(oratory)f(for)h(Computer)g(Science,)i
+(Septem)o(b)q(er)e(1990.)0 2269 y([5])22 b(J.)15 b(Rees)h(and)g(W.)f(Clinger)
+h(\(eds.\).)k(The)c(revised)928 2252 y Fm(3)964 2269 y Fp(rep)q(ort)f(on)h
+(the)f(algorithmic)h(language)g(Sc)o(heme.)21 b Fo(SIG-)71
+2325 y(PLAN)15 b(Notic)n(es)p Fp(,)f(21\(12\):37{79)o(,)e(Decem)o(b)q(er)k
+(1986.)0 2413 y([6])22 b(G.L.)14 b(Steele)j(Jr.)i Fo(Common)e(Lisp:)j(The)c
+(L)n(anguage)p Fp(.)j(Digital)d(Press,)e(Burlington,)i(Mass.,)e(1984.)0
+2501 y([7])22 b(P)l(.)f(W)l(adler.)39 b(Ho)o(w)21 b(to)g(replace)i(failure)g
+(b)o(y)e(a)h(list)g(of)f(successes.)40 b(In)22 b Fo(Pr)n(o)n(c)n(e)n(e)n
+(dings)e(of)i(Confer)n(enc)n(e)e(on)71 2557 y(F)m(unctional)e(Pr)n(o)n(gr)n
+(amming)h(L)n(anguages)g(and)h(Computer)h(A)o(r)n(chite)n(ctur)n(e,)f(LNCS)e
+(V)m(ol.)h(201)p Fp(,)h(pages)f(113{)71 2614 y(128.)14 b(Springer)i(V)l
+(erlag,)f(1985.)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/xinterface/xman.dvi b/doc/xinterface/xman.dvi
new file mode 100644
index 0000000..0306db9
--- /dev/null
+++ b/doc/xinterface/xman.dvi
Binary files differ