diff options
author | Yale AI Dept <ai@nebula.cs.yale.edu> | 1993-07-14 13:08:00 -0500 |
---|---|---|
committer | Duncan McGreggor <duncan.mcgreggor@rackspace.com> | 1993-07-14 13:08:00 -0500 |
commit | 4e987026148fe65c323afbc93cd560c07bf06b3f (patch) | |
tree | 26ae54177389edcbe453d25a00c38c2774e8b7d4 /doc |
Import to github.
Diffstat (limited to 'doc')
-rw-r--r-- | doc/announcement | 64 | ||||
-rw-r--r-- | doc/comparison | 291 | ||||
-rw-r--r-- | doc/lisp-interface/lisp-interface.dvi | bin | 0 -> 23156 bytes | |||
-rw-r--r-- | doc/manual/haskell.dvi | bin | 0 -> 68832 bytes | |||
-rw-r--r-- | doc/optimizer/optimizer.dvi | bin | 0 -> 25624 bytes | |||
-rw-r--r-- | doc/tutorial/tutorial.ps | 6257 | ||||
-rw-r--r-- | doc/xinterface/xman.dvi | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000..b45e902 --- /dev/null +++ b/doc/lisp-interface/lisp-interface.dvi diff --git a/doc/manual/haskell.dvi b/doc/manual/haskell.dvi Binary files differnew file mode 100644 index 0000000..a789515 --- /dev/null +++ b/doc/manual/haskell.dvi diff --git a/doc/optimizer/optimizer.dvi b/doc/optimizer/optimizer.dvi Binary files differnew file mode 100644 index 0000000..8d0d2bc --- /dev/null +++ b/doc/optimizer/optimizer.dvi 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 Binary files differnew file mode 100644 index 0000000..0306db9 --- /dev/null +++ b/doc/xinterface/xman.dvi |