100% found this document useful (1 vote)
417 views1,879 pages

Haskell Programming 0.12.0 Ereader PDF

Uploaded by

Name
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
417 views1,879 pages

Haskell Programming 0.12.0 Ereader PDF

Uploaded by

Name
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 1879

J

3FBEFS GFFECBDL
ƌ"TUPOJTIJOHMZ JOTJHIUGVM FYBNQMFT 5IJT CPPL JT B MPU MJLF
IBWJOH B HPPE UFBDIFS  JU OFWFS GBJMT UP QSPWJEF UIF MPXFOE
JOGPSNBUJPO FWFO UIPVHI * IBWF BMSFBEZ NPWFE PO 4P KVTU
MJLF B HPPE UFBDIFS JTOƊU QSFTVNQUVPVT JO XIBU *ƊN TVQQPTFE
UP LOPX XIJDI NJHIU GPSDF NF UP USZ BOE TBWF GBDF JO DBTF *
EP OPU ZFU
JOGPSNBUJPO DPOWFOJFOUMZ SFTVSGBDFTƍ Ƈ %BWJE
%FVUTDI

ƌ8IFO !IBTLFMMCPPL JT EPOF JU XJMM CF BO VOFYQFDUFE NJMF


TUPOF GPS IBTLFMM 5IFSF XJMM GPSFWFS CF )BTLFMM CFGPSF BOE
)BTLFMM BǒFSƍ Ƈ +BTPO ,VISU

ƌ* GFFM TBGF SFDPNNFOEJOH )BTLFMM UP CFHJOOFST OPX UIBU


!IBTLFMMCPPL JT BWBJMBCMF XIJDI JT WFSZ CFHJOOFSGSJFOEMZƍ Ƈ
(BCSJFM (PO[BMF[

ƌƍ4USVDUVSF BOE *OUFSQSFUBUJPO PG $PNQVUFS 1SPHSBNTƍ IBT


JUT DSFEJU CVU !IBTLFMMCPPL JT OPX NZ  SFDPNNFOEBUJPO
GPS '1 CFHJOOFSTƍ Ƈ *SJP .VTTLPQG

ƌ5IF CPPL JT MPOH CVU OPU TMPXƇB MBSHF GSBDUJPO PG JU JT


NBEF VQ PG FYBNQMFT BOE FYFSDJTFT :PV DBO UFMM JUƊT XSJUUFO
CZ TPNFPOF XIPƊT UBVHIU )BTLFMM UP QSPHSBNNFST CFGPSFƍ Ƈ
$ISJTUPQIFS +POFT
JJ

ƌ* BMSFBEZ IBWF B MPU PG FYQFSJFODF XJUI )BTLFMM CVU *ƊWF


OFWFS GFMU DPOƶEFOU JO JU UIF XBZ UIJT CPPL IBT NBEF NF GFFMƍ
Ƈ "MBJO 0Ɗ%FB

ƌ3FBM EFBM XJUI !IBTLFMMCPPL JT UIBU ZPV EPOƊU KVTU MFBSO


)BTLFMM ZPV HFU B IBOET PO FYQFSJFODF BT UP XIZ GVODUJPOBM
QSPHSBNNJOH XPSLTƍ Ƈ (FPSHF .BLSZEBLJT

ƌ0OF PG NZ HPBMT UIJT ZFBS JT UP FWBOHFMJ[F !IBTLFMMCPPL


BOE !)BTLFMM'PS.BD * UIJOL UIFTF UPPMT XJMM NBLF BOZPOF
XIP VTFT UIFN CFUUFS * XBOU UP HFU DPNGPSUBCMF XJUI JU TP UIBU
* DBO TIJǒ IPX * UIJOL BCPVU 4XJǒƍ Ƈ +BOJF $MBZUPO
$POUFOUT

3FBEFS GFFECBDL                           J

$POUFOUT JJJ
"VUIPSTƊ QSFGBDF                            YY
"DLOPXMFEHFNFOUT                         YYW
*OUSPEVDUJPO                              YYJY
8IZ 5IJT #PPL                            YYJY
" GFX XPSET UP OFX QSPHSBNNFST                YYYJW
)BTLFWBOHFMJTN                            YYYW
8IBUƊT JO UIJT CPPL                         YYYJY
#FTU QSBDUJDFT GPS FYBNQMFT BOE FYFSDJTFT           YMJJJ

 "MM :PV /FFE JT -BNCEB 


 "MM :PV /FFE JT -BNCEB                
 8IBU JT GVODUJPOBM QSPHSBNNJOH         
 8IBU JT B GVODUJPO                   
 5IF TUSVDUVSF PG MBNCEB UFSNT           
 #FUB SFEVDUJPO                      
 .VMUJQMF BSHVNFOUT                   
 &WBMVBUJPO JT TJNQMJƶDBUJPO              
 $PNCJOBUPST                       
JJJ
$0/5&/54 JW

 %JWFSHFODF                        
 4VNNBSZ                         
 $IBQUFS &YFSDJTFT                    
 "OTXFST                          
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  

 )FMMP )BTLFMM 
 )FMMP )BTLFMM                       
 *OUFSBDUJOH XJUI )BTLFMM DPEF            
 6OEFSTUBOEJOH FYQSFTTJPOT              
 'VODUJPOT                         
 &WBMVBUJPO                         
 *OƶY PQFSBUPST                      
 %FDMBSJOH WBMVFT                     
 "SJUINFUJD GVODUJPOT JO )BTLFMM           
 1BSFOUIFTJ[BUJPO                     
 -FU BOE XIFSF                      
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  

 4USJOHT 
 1SJOUJOH TUSJOHT                      
 " ƶSTU MPPL BU UZQFT                   
 1SJOUJOH TJNQMF TUSJOHT                 
$0/5&/54 W

 5PQMFWFM WFSTVT MPDBM EFƶOJUJPOT          


 5ZQFT PG DPODBUFOBUJPO GVODUJPOT          
 $PODBUFOBUJPO BOE TDPQJOH              
 .PSF MJTU GVODUJPOT                   
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         

 #BTJD EBUBUZQFT 


 #BTJD %BUBUZQFT                     
 8IBU BSF UZQFT                     
 "OBUPNZ PG B EBUB EFDMBSBUJPO            
 /VNFSJD UZQFT                      
 $PNQBSJOH WBMVFT                    
 (P PO BOE #PPM NF                   
 5VQMFT                           
 -JTUT                             
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         
 /BNFT BOE WBSJBCMFT                  

 5ZQFT 
 5ZQFT                            
 8IBU BSF UZQFT GPS                   
 )PX UP SFBE UZQF TJHOBUVSFT             
 $VSSZJOH                          
 1PMZNPSQIJTN                      
$0/5&/54 WJ

 5ZQF JOGFSFODF                      


 "TTFSUJOH UZQFT GPS EFDMBSBUJPOT           
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  

 5ZQFDMBTTFT 
 5ZQFDMBTTFT                        
 8IBU BSF UZQFDMBTTFT                  
 #BDL UP #PPM                       
 &R                              
 8SJUJOH UZQFDMBTT JOTUBODFT              
 /VN                             
 5ZQFEFGBVMUJOH UZQFDMBTTFT             
 0SE                             
 &OVN                            
 4IPX                            
 3FBE                             
 *OTUBODFT BSF EJTQBUDIFE CZ UZQF          
 (JNNF NPSF PQFSBUJPOT               
 $IBQUFS &YFSDJTFT                    
 $IBQUFS %FƶOJUJPOT                   
 5ZQFDMBTT JOIFSJUBODF QBSUJBM            
 'PMMPXVQ SFTPVSDFT                  

 .PSF GVODUJPOBM QBUUFSOT 


$0/5&/54 WJJ

 .BLF JU GVODZ                      


 "SHVNFOUT BOE QBSBNFUFST              
 "OPOZNPVT GVODUJPOT                 
 1BUUFSO NBUDIJOH                    
 $BTF FYQSFTTJPOT                     
 )JHIFSPSEFS GVODUJPOT                
 (VBSET                           
 'VODUJPO DPNQPTJUJPO                 
 1PJOUGSFF TUZMF                      
 %FNPOTUSBUJOH DPNQPTJUJPO             
 $IBQUFS &YFSDJTFT                    
 $IBQUFS %FƶOJUJPOT                   
 'PMMPXVQ SFTPVSDFT                  

 3FDVSTJPO 
 3FDVSTJPO                         
 'BDUPSJBM                          
 #PUUPN                           
 'JCPOBDDJ OVNCFST                   
 *OUFHSBM EJWJTJPO GSPN TDSBUDI            
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         

 -JTUT 
 -JTUT                             
 5IF MJTU EBUBUZQF                     
$0/5&/54 WJJJ

 1BUUFSO NBUDIJOH PO MJTUT               


 -JTUƊT TZOUBDUJD TVHBS                  
 6TJOH SBOHFT UP DPOTUSVDU MJTUT            
 &YUSBDUJOH QPSUJPOT PG MJTUT              
 -JTU DPNQSFIFOTJPOT                  
 4QJOFT BOE OPOTUSJDU FWBMVBUJPO           
 5SBOTGPSNJOH MJTUT PG WBMVFT             
 'JMUFSJOH MJTUT PG WBMVFT                 
 ;JQQJOH MJTUT                        
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  

 'PMEJOH MJTUT 


 'PMET                            
 #SJOHJOH ZPV JOUP UIF GPME               
 3FDVSTJWF QBUUFSOT                    
 'PME SJHIU                         
 'PME MFǒ                          
 )PX UP XSJUF GPME GVODUJPOT              
 'PMEJOH BOE FWBMVBUJPO                 
 4VNNBSZ                         
 4DBOT                            
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  
$0/5&/54 JY

 "MHFCSBJD EBUBUZQFT 


 "MHFCSBJD EBUBUZQFT                   
 %BUB EFDMBSBUJPOT SFWJFX                
 %BUB BOE UZQF DPOTUSVDUPST              
 5ZQF DPOTUSVDUPST BOE LJOET             
 %BUB DPOTUSVDUPST BOE WBMVFT             
 8IBUƊT B UZQF BOE XIBUƊT EBUB            
 %BUB DPOTUSVDUPS BSJUJFT                
 8IBU NBLFT UIFTF EBUBUZQFT BMHFCSBJD      
 OFXUZQF                          
 4VN UZQFT                         
 1SPEVDU UZQFT                       
 /PSNBM GPSN                       
 $POTUSVDUJOH BOE EFDPOTUSVDUJOH WBMVFT     
 'VODUJPO UZQF JT FYQPOFOUJBM             
 )JHIFSLJOEFE EBUBUZQFT               
 -JTUT BSF QPMZNPSQIJD                 
 #JOBSZ 5SFF                        
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         

 4JHOBMJOH BEWFSTJUZ 


 4JHOBMJOH BEWFSTJUZ                   
 )PX * MFBSOFE UP TUPQ XPSSZJOH BOE MPWF /PUIJOH
 #MFBUJOH FJUIFS                      
 ,JOET B UIPVTBOE TUBST JO ZPVS UZQFT       
$0/5&/54 Y

 $IBQUFS &YFSDJTFT                    


 %FƶOJUJPOT                         

 #VJMEJOH QSPKFDUT 


 .PEVMFT                          
 .BLJOH QBDLBHFT XJUI 4UBDL             
 8PSLJOH XJUI B CBTJD QSPKFDU             
 .BLJOH PVS QSPKFDU B MJCSBSZ             
 .PEVMF FYQPSUT                     
 .PSF PO JNQPSUJOH NPEVMFT             
 .BLJOH PVS QSPHSBN JOUFSBDUJWF          
 EP TZOUBY BOE *0                     
 )BOHNBO HBNF                     
 4UFQ 0OF *NQPSUJOH NPEVMFT            
 4UFQ 5XP (FOFSBUJOH B XPSE MJTU          
 4UFQ 5ISFF .BLJOH B QV[[MF             
 "EEJOH B OFXUZQF                    
 $IBQUFS FYFSDJTFT                    
 'PMMPXVQ SFTPVSDFT                  

 5FTUJOH 
 5FTUJOH                           
 " RVJDL UPVS PG UFTUJOH GPS UIF VOJOJUJBUFE    
 $POWFOUJPOBM UFTUJOH                  
 &OUFS 2VJDL$IFDL                    
 .PSTF DPEF                        
$0/5&/54 YJ

 ,JDLJOH BSPVOE 2VJDL$IFDL             


 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  

 .POPJE 4FNJHSPVQ 


 .POPJET BOE TFNJHSPVQT               
 8IBU XF UBML BCPVU XIFO XF UBML BCPVU BMHFCSBT
 .POPJE                           
 )PX .POPJE JT EFƶOFE JO )BTLFMM         
 &YBNQMFT PG VTJOH .POPJE              
 8IZ *OUFHFS EPFTOƊU IBWF B .POPJE        
 8IZ CPUIFS                       
 -BXT                             
 %JƵFSFOU JOTUBODF TBNF SFQSFTFOUBUJPO      
 3FVTJOH BMHFCSBT CZ BTLJOH GPS BMHFCSBT      
 .BEOFTT                          
 #FUUFS MJWJOH UISPVHI 2VJDL$IFDL         
 4FNJHSPVQ                         
 $IBQUFS FYFSDJTFT                    
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  

 'VODUPS 
 'VODUPS                           
 8IBUƊT B GVODUPS                    
$0/5&/54 YJJ

 5IFSFƊT B XIPMF MPU PG GNBQ HPJOH SPVOE     


 -FUƊT UBML BCPVU ԕ CBCZ                 
 'VODUPS -BXT                       
 5IF (PPE UIF #BE BOE UIF 6HMZ          
 $PNNPOMZ VTFE GVODUPST               
 5SBOTGPSNJOH UIF VOBQQMJFE UZQF BSHVNFOU   
 2VJDL$IFDLJOH 'VODUPS JOTUBODFT         
 &YFSDJTFT *OTUBODFT PG 'VOD             
 *HOPSJOH QPTTJCJMJUJFT                  
 " TPNFXIBU TVSQSJTJOH GVODUPS           
 .PSF TUSVDUVSF NPSF GVODUPST            
 *0 'VODUPS                         
 8IBU JG XF XBOU UP EP TPNFUIJOH EJƵFSFOU   
 'VODUPST BSF VOJRVF UP B EBUBUZQF          
 $IBQUFS FYFSDJTFT                    
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  

 "QQMJDBUJWF 
 "QQMJDBUJWF                        
 %FƶOJOH "QQMJDBUJWF                  
 'VODUPS WT "QQMJDBUJWF                 
 "QQMJDBUJWF GVODUPST BSF NPOPJEBM GVODUPST   
 "QQMJDBUJWF JO VTF                    
 "QQMJDBUJWF MBXT                     
 :PV LOFX UIJT XBT DPNJOH              
$0/5&/54 YJJJ

 ;JQ-JTU .POPJE                     


 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  

 .POBE 
 .POBE                           
 4PSSZ ƈ .POBE JT OPU B CVSSJUP           
 %P TZOUBY BOE NPOBET                 
 &YBNQMFT PG .POBE VTF                
 .POBE MBXT                        
 "QQMJDBUJPO BOE DPNQPTJUJPO            
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPO                         
 'PMMPXVQ SFTPVSDFT                  

 "QQMZJOH TUSVDUVSF 


 "QQMJFE TUSVDUVSF                    
 .POPJE                           
 'VODUPS                           
 "QQMJDBUJWF                        
 .POBE                           
 "O FOEUPFOE FYBNQMF 63- TIPSUFOFS     
 5IBUƊT B XSBQ                       
 'PMMPXVQ SFTPVSDFT                  

 'PMEBCMF 
$0/5&/54 YJW

 'PMEBCMF                          


 5IF 'PMEBCMF DMBTT                    
 3FWFOHF PG UIF NPOPJET                
 %FNPOTUSBUJOH 'PMEBCMF JOTUBODFT         
 4PNF CBTJD EFSJWFE PQFSBUJPOT           
 $IBQUFS &YFSDJTFT                    
 'PMMPXVQ SFTPVSDFT                  

 5SBWFSTBCMF 
 5SBWFSTBCMF                        
 5IF 5SBWFSTBCMF UZQFDMBTT EFƶOJUJPO        
 TFRVFODF"                         
 USBWFSTF                           
 4P XIBUƊT USBWFSTBCMF GPS               
 .PSTF DPEF SFWJTJUFE                  
 "YJOH UFEJPVT DPEF                   
 %P BMM UIF UIJOHT                     
 5SBWFSTBCMF JOTUBODFT                  
 5SBWFSTBCMF -BXT                    
 2VBMJUZ $POUSPM                     
 $IBQUFS &YFSDJTFT                    
 'PMMPXVQ SFTPVSDFT                  

 3FBEFS 
 3FBEFS                           
 " OFX CFHJOOJOH                     
$0/5&/54 YW

 5IJT JT 3FBEFS                      


 #SFBLJOH EPXO UIF 'VODUPS PG GVODUJPOT     
 #VU VI 3FBEFS                     
 'VODUJPOT IBWF BO "QQMJDBUJWF UPP         
 5IF .POBE PG GVODUJPOT                
 3FBEFS .POBE CZ JUTFMG JT LJOEB CPSJOH      
 :PV DBO DIBOHF XIBU DPNFT CFMPX CVU OPU BCPWF
 :PV UFOE UP TFF 3FBEFS5 OPU 3FBEFS        
 $IBQUFS &YFSDJTFT                    
 'PMMPXVQ SFTPVSDFT                  

 4UBUF 
 4UBUF                             
 8IBU JT TUBUF                       
 3BOEPN OVNCFST                    
 5IF 4UBUF OFXUZQF                    
 5ISPX EPXO                       
 8SJUF 4UBUF GPS ZPVSTFMG                
 (FU B DPEJOH KPC XJUI POF XFJSE USJDL       
 $IBQUFS FYFSDJTFT                    
 'PMMPXVQ SFTPVSDFT                  

 1BSTFS DPNCJOBUPST 


 1BSTFS DPNCJOBUPST                   
 " GFX NPSF XPSET PG JOUSPEVDUJPO         
 6OEFSTUBOEJOH UIF QBSTJOH QSPDFTT         
$0/5&/54 YWJ

 1BSTJOH GSBDUJPOT                     


 )BTLFMMƊT QBSTJOH FDPTZTUFN              
 "MUFSOBUJWF                         
 1BSTJOH DPOƶHVSBUJPO ƶMFT               
 $IBSBDUFS BOE UPLFO QBSTFST             
 1PMZNPSQIJD QBSTFST                  
 .BSTIBMMJOH GSPN BO "45 UP B EBUBUZQF      
 $IBQUFS &YFSDJTFT                    
 %FƶOJUJPOT                         
 'PMMPXVQ SFTPVSDFT                  

 $PNQPTJOH UZQFT 


 $PNQPTJOH UZQFT                    
 $PNNPO GVODUJPOT BT UZQFT             
 5XP MJUUMF GVODUPST TJUUJOƊ JO B USFF
-*'5*/(                      
 5XJOQMJDBUJWF                       
 5XPOBE                          
 &YFSDJTFT $PNQPTF *OTUBODFT            
 .POBE USBOTGPSNFST                  
 *EFOUJUZ5                          
 'JOEJOH B QBUUFSO                    

 .POBE USBOTGPSNFST 


 .POBE USBOTGPSNFST                  
 .BZCF5                           
$0/5&/54 YWJJ

 &JUIFS5                           


 3FBEFS5                          
 4UBUF5                            
 5ZQFT ZPV QSPCBCMZ EPOƊU XBOU UP VTF       
 3FDPWFSJOH BO PSEJOBSZ UZQF GSPN B USBOTGPSNFS
 -FYJDBMMZ JOOFS JT TUSVDUVSBMMZ PVUFS        
 .POBE5SBOT                       
 .POBE*0 BLB [PPN[PPN              
 .POBE USBOTGPSNFST JO VTF              
 .POBET EP OPU DPNNVUF               
 5SBOTGPSN JG ZPV XBOU UP               
 $IBQUFS &YFSDJTFT                    
 'PMMPXVQ SFTPVSDFT                  

 /POTUSJDUOFTT 
 -B[JOFTT                          
 0CTFSWBUJPOBM #PUUPN 5IFPSZ            
 0VUTJEF JO JOTJEF PVU                  
 8IBU EPFT UIF PUIFS XBZ MPPL MJLF         
 $BMM CZ OBNF DBMM CZ OFFE              
 /POTUSJDU FWBMVBUJPO DIBOHFT XIBU XF DBO EP 
 5IVOL -JGF                        
 4IBSJOH JT DBSJOH                     
 3FGVUBCMF BOE JSSFGVUBCMF QBUUFSOT         
 #BOHQBUUFSOT                      
 4USJDU BOE 4USJDU%BUB                  
$0/5&/54 YWJJJ

 "EEJOH TUSJDUOFTT                     


 $IBQUFS &YFSDJTFT                    
 'PMMPXVQ SFTPVSDFT                  

 #BTJD MJCSBSJFT 


 #BTJD MJCSBSJFT BOE EBUB TUSVDUVSFT          
 #FODINBSLJOH XJUI $SJUFSJPO            
 1SPƶMJOH ZPVS QSPHSBNT                
 $POTUBOU BQQMJDBUJWF GPSNT              
 .BQ                             
 4FU                              
 4FRVFODF                          
 7FDUPS                            
 4USJOH UZQFT                        
 $IBQUFS &YFSDJTFT                    
 'PMMPXVQ SFTPVSDFT                  

 *0 
 *0                              
 8IFSF *0 FYQMBOBUJPOT HP BTUSBZ          
 5IF SFBTPO XF OFFE UIJT UZQF            
 4IBSJOH                           
 *0 EPFTOƊU EJTBCMF TIBSJOH GPS FWFSZUIJOH     
 1VSJUZ JT MPTJOH NFBOJOH                
 *0ƊT 'VODUPS "QQMJDBUJWF BOE .POBE       
 8FMM UIFO IPX EP XF .7BS             
$0/5&/54 YJY

 $IBQUFS &YFSDJTFT                    


 'PMMPXVQ SFTPVSDFT                  

 8IFO UIJOHT HP XSPOH 


 &YDFQUJPOT                         
 5IF &YDFQUJPO DMBTT BOE NFUIPET          
 5IJT NBDIJOF LJMMT QSPHSBNT             
 8BOU FJUIFS 5SZ                    
 5IF VOCFBSBCMF JNQSFDJTJPO PG USZJOH       
 8IZ UISPX*0                      
 .BLJOH PVS PXO FYDFQUJPO UZQFT          
 4VSQSJTJOH JOUFSBDUJPO XJUI CPUUPN         
 "TZODISPOPVT &YDFQUJPOT               
 'PMMPXVQ 3FBEJOH                   

 'JOBM QSPKFDU 


 'JOBM QSPKFDU                        
 ƶOHFSE                           
 &YQMPSJOH ƶOHFS                     
 4MJHIUMZ NPEFSOJ[FE ƶOHFSE             
 $IBQUFS &YFSDJTFT                    
$0/5&/54 YY

"VUIPSTƊ QSFGBDF
$ISJTƊT TUPSZ
*ƊWF CFFO QSPHSBNNJOH GPS PWFS  ZFBST  PG UIFN QSPGFT
TJPOBMMZ *ƊWF XPSLFE QSJNBSJMZ JO $PNNPO -JTQ $MPKVSF BOE
1ZUIPO * CFDBNF JOUFSFTUFE JO )BTLFMM BCPVU  ZFBST BHP
)BTLFMM XBT UIF MBOHVBHF UIBU NBEF NF BXBSF UIBU QSPHSFTT
JT CFJOH NBEF JO QSPHSBNNJOH MBOHVBHF SFTFBSDI BOE UIBU
UIFSF BSF CFOFƶUT UP VTJOH B MBOHVBHF XJUI B EFTJHO JOGPSNFE
CZ LOPXMFEHF PG UIPTF BEWBODFNFOUT
*ƊWF IBE UZQF FSSPST JO $MPKVSF UIBU NVMUJQMF QSPGFTTJPOBM
$MPKVSF EFWT JODMVEJOH NZTFMG
DPVMEOƊU SFTPMWF JO MFTT UIBO
 IPVST CFDBVTF PG UIF TPVSDFUPTJOL EJTUBODF DBVTFE CZ EZ
OBNJD UZQJOH 8F IBE DPQJPVT UFTUT 8F BEEFE printlnT FW
FSZXIFSF 8F UFTUFE JOEJWJEVBM GVODUJPOT GSPN UIF 3&1- *U
TUJMM UPPL BHFT *U XBT POMZ  MJOFT PG $MPKVSF * EJE ƶOBMMZ
ƶY JU BOE GPVOE JU XBT EVF UP WFDUPST JO $MPKVSF JNQMFNFOUJOH
IFn 5IF DSB[Z WBMVFT UIBU QSPQBHBUFE GSPN UIF IFn VTBHF PG
UIF WFDUPS BMMPXFE NBMGPSNFE EBUB UP QSPQBHBUF EPXOXBSE
GBS BXBZ GSPN UIF PSJHJO PG UIF QSPCMFN *ƊWF IBE TJNJMBS IBQ
QFO JO 1ZUIPO BOE $PNNPO -JTQ BT XFMM 5IF TBNF JTTVF
JO )BTLFMM XPVME CF USJWJBMMZ SFTPMWFE JO B NJOVUF PS MFTT CF
DBVTF UIF UZQFDIFDLFS XJMM JEFOUJGZ QSFDJTFMZ XIFSF ZPV XFSF
JODPOTJTUFOU
* VTF )BTLFMM CFDBVTF * XBOU UP CF BCMF UP SFGBDUPS XJUIPVU
$0/5&/54 YYJ

GFBS CFDBVTF * XBOU NBJOUFOBODF UP CF TPNFUIJOH * EPOƊU SF


TFOU TP * DBO SFVTF DPEF GSFFMZ 5IJT EPFTOƊU DPNF XJUIPVU
MFBSOJOH OFX UIJOHT 5IF EJƵFSFODF CFUXFFO QFPQMF UIBU BSF
ƌHPPE BU NBUIƍ XIP ƌEP JU JO UIFJS IFBEƍ BOE QSPGFTTJPOBM NBUI
FNBUJDJBOT JT UIBU UIF MBUUFS TIPX UIFJS XPSL BOE VTF UPPMT UIBU
IFMQ UIFN HFU UIF KPC EPOF 8IFO ZPVƊSF VTJOH B EZOBNJDBMMZ
UZQFE MBOHVBHF ZPVƊSF GPSDJOH ZPVSTFMG VOOFDFTTBSJMZ UP EP JU
ƌJO ZPVS IFBEƍ "T B IVNBO XJUI MJNJUFE XPSLJOH NFNPSZ *
XBOU BMM UIF IFMQ * DBO HFU UP SFBTPO BCPVU BOE XSJUF DPSSFDU
DPEF )BTLFMM QSPWJEFT UIBU IFMQ
)BTLFMM JT OPU B EJƸDVMU MBOHVBHF UP VTF ƈ RVJUF UIF PQQPTJUF
*ƊN OPX BCMF UP UBDLMF QSPCMFNT UIBU * DPVMEOƊU IBWF UBDLMFE
XIFO * XBT QSJNBSJMZ B $MPKVSF $PNNPO -JTQ PS 1ZUIPO
VTFS )BTLFMM JT EJƸDVMU UP UFBDI FƵFDUJWFMZ BOE UIF JOFƵFDUJWF
QFEBHPHZ IBT NBEF JU IBSE GPS NBOZ QFPQMF UP MFBSO
*U EPFTOƊU IBWF UP CF UIBU XBZ
*ƊWF TQFOU UIF MBTU UXP ZFBST BDUJWFMZ UFBDIJOH )BTLFMM PO
MJOF BOE JO QFSTPO "MPOH UIF XBZ * TUBSUFE LFFQJOH OPUFT
PO FYFSDJTFT BOE NFUIPET PG UFBDIJOH TQFDJƶD DPODFQUT BOE
UFDIOJRVFT UIBU XPSLFE 5IPTF OPUFT FWFOUVBMMZ UVSOFE JOUP
NZ HVJEF GPS MFBSOJOH )BTLFMM *ƊN TUJMM MFBSOJOH IPX UP UFBDI
)BTLFMM CFUUFS CZ XPSLJOH XJUI QFPQMF MPDBMMZ JO "VTUJO 5FYBT
BT XFMM BT POMJOF JO UIF *3$ DIBOOFM * NBEF GPS CFHJOOFST UP
HFU IFMQ XJUI MFBSOJOH )BTLFMM
* XSPUF UIJT CPPL CFDBVTF * IBE B IBSE UJNF MFBSOJOH )BTLFMM
BOE * EPOƊU XBOU PUIFST UP TUSVHHMF UIF XBZ * EJE
$0/5&/54 YYJJ

+VMJFƊT TUPSZ
* NFU $ISJT "MMFO JO TQSJOH  8F NFU PO 5XJUUFS BOE
RVJDLMZ CFDBNF GSJFOET "T BOZPOF XIP IBT FODPVOUFSFE
$ISJT ƈ QSPCBCMZ JO BOZ NFEJVN CVU DFSUBJOMZ PO 5XJUUFS ƈ
LOPXT JU EPFTOƊU UBLF MPOH CFGPSF IF TUBSUT VSHJOH ZPV UP MFBSO
)BTLFMM
* UPME IJN * IBE OP JOUFSFTU JO QSPHSBNNJOH * UPME IJN
OPUIJOH BOE OPCPEZ IBE FWFS CFFO BCMF UP JOUFSFTU NF JO QSP
HSBNNJOH CFGPSF 8IFO $ISJT MFBSOFE PG NZ CBDLHSPVOE
JO MJOHVJTUJDT IF UIPVHIU * NJHIU CF JOUFSFTUFE JO OBUVSBM MBO
HVBHF QSPDFTTJOH BOE FYIPSUFE NF UP MFBSO )BTLFMM GPS UIBU
QVSQPTF * SFNBJOFE VODPOWJODFE
5IFO IF USJFE B EJƵFSFOU BQQSPBDI )F XBT TQFOEJOH B MPU PG
UJNF HBUIFSJOH BOE FWBMVBUJOH SFTPVSDFT GPS UFBDIJOH )BTLFMM
BOE SFƶOJOH IJT QFEBHPHJDBM UFDIOJRVFT BOE IF DPOWJODFE NF
UP USZ UP MFBSO )BTLFMM TP UIBU IF DPVME HBJO UIF FYQFSJFODF
PG UFBDIJOH B DPEFOFPQIZUF 'JOBMMZ XJUI BO ƌBOZUIJOH GPS
TDJFODFƍ BUUJUVEF * HBWF JO
$ISJT IBE BMSFBEZ LOPXO UIBU UIF BWBJMBCMF )BTLFMM MFBSOJOH
NBUFSJBMT FBDI IBE QSPCMFNT CVU * EPOƊU UIJOL FWFO IF SFBMJ[FE
KVTU IPX GSVTUSBUJOH UIFZ XPVME CF UP NF "MM PG UIF NBUFSJBMT
* SBO BDSPTT SFMJFE PO B CBDLHSPVOE XJUI PUIFS QSPHSBNNJOH
MBOHVBHFT BOE MFǒ NBOZ UFSNT VOEFƶOFE PS FYQMBJOFE GFB
UVSFT PG )BTLFMM CZ BOBMPHZ PǒFO GBVMUZ
UP GFBUVSFT PG PUIFS
MBOHVBHFT ƈ GFBUVSFT * IBE OP FYQFSJFODF XJUI
$0/5&/54 YYJJJ

8IFO * TBZ * IBE OP QSPHSBNNJOH FYQFSJFODF * SFBMMZ USVMZ


NFBO JU * IBE UP TUBSU GSPN MFBSOJOH XIBU B DPNQJMFS EPFT
XIBU WFSTJPO DPOUSPM NFBOT XIBU DPOTUJUVUFT TJEF FƵFDUT XIBU
JT B MJCSBSZ XIBU JT B NPEVMF XIBU PO FBSUI JT B TUBDL PWFSƷPX
"U UIF UJNF PG UIJT XSJUJOH UIBU JT XIFSF * XBT MFTT UIBO B ZFBS
BHP CZ UIF UJNF XF ƶOJTI XSJUJOH UIJT CPPL BOE JU JT QVCMJTIFE
JU XJMM CF BMNPTU UXP ZFBST
* EJEOƊU UIJOL * XPVME TUJDL XJUI JU *U XBT UPP GSVTUSBUJOH UPP
UJNFDPOTVNJOH BOE * TBX OP QSBDUJDBM QVSQPTF JO JU BOZXBZ
* GFMU MJLF * XPVMEOƊU CF BCMF UP MFBSO JU 8PSLJOH XJUI $ISJT
LFQU NF NPUJWBUFE BOE JOUFSFTUFE UIPVHI
&WFOUVBMMZ BT IF SFBMJ[FE UIBU B OFX UZQF PG CPPL GPS MFBSO
JOH )BTLFMM XBT OFDFTTBSZ IF EFDJEFE UP XSJUF POF * BHSFFE BU
UIF UJNF UP CF IJT HVJOFB QJH )F XPVME TFOE NF DIBQUFST BOE
* XPVME MFBSO )BTLFMM GSPN UIFN BOE TFOE GFFECBDL 5ISPVHI
UIF GBMM XF XPSLFE MJLF UIJT PO BOE PƵ JO TIPSU CVSTUT &WFO
UVBMMZ XF GPVOE JU NPSF FƸDJFOU GPS NF UP UBLF PO BVUIPSTIJQ
EVUJFT 8F EFWFMPQFE B XSJUJOH QSPDFTT XIFSF $ISJT NBEF
UIF ƶSTU QBTT BU B DIBQUFS TDBƵPMEJOH UIF NBUFSJBM JU OFFEFE UP
DPWFS 5IFO * ƶMMFE JO UIF QBSUT UIBU * VOEFSTUPPE BOE DBNF
VQ XJUI RVFTUJPOT UIBU XPVME FMBCPSBUF BOE DMBSJGZ UIF QBSUT *
EJEOƊU BMSFBEZ LOPX )F BOTXFSFE NZ RVFTUJPOT VOUJM * VOEFS
TUPPE BOE * DPOUJOVFE BEEJOH UP BOE SFƶOJOH XIBU XBT UIFSF
8F FBDI XSPUF FYFSDJTFT ƈ * XSJUF NVDI FBTJFS POFT UIBO IF
EPFT CVU UIF WBSJFUZ JT CFOFƶDJBM
* IBWF USJFE UISPVHIPVU UIF QSPDFTT UP LFFQ UIJOLJOH GSPN
$0/5&/54 YYJW

UIF QFSTQFDUJWF PG UIF BCTPMVUF CFHJOOFS 'PS POF UIJOH *


XBOUFE NZ PXO VOEFSTUBOEJOH PG )BTLFMM UP EFFQFO BT * XSPUF
TP * LFQU RVFTUJPOJOH UIF UIJOHT * UIPVHIU * LOFX "MTP * XBOUFE
UIJT CPPL UP CF BDDFTTJCMF UP FWFSZPOF
*O JOUFSBDUJOH XJUI PUIFS )BTLFMM MFBSOFST * PǒFO IFBS UIBU
PUIFS NBUFSJBMT MFBWF UIFN GFFMJOH MJLF )BTLFMM JT EJƸDVMU BOE
NZTUFSJPVT B QSPHSBNNJOH MBOHVBHF CFTU MFǒ UP XJ[BSET
*U EPFTOƊU IBWF UP CF UIBU XBZ
$0/5&/54 YYW

"DLOPXMFEHFNFOUT
5IJT CPPL EFWFMPQFE PVU PG NBOZ FƵPSUT UP UFBDI BOE MFBSO
)BTLFMM POMJOF BOE PƵ 8F DPVME OPU IBWF EPOF UIJT XJUIPVU
UIF IFMQ PG UIF HSPXJOH DPNNVOJUZ PG GSJFOEMZ )BTLFMMFST BT
XFMM BT UIF )BTLFMM MFBSOFST XIP IBWF HSBDJPVTMZ PƵFSFE UJNF
UP IFMQ VT NBLF UIF CPPL CFUUFS
'JSTU BOE GPSFNPTU XF PXF B IVHF EFCU PG HSBUJUVEF UP PVS
ƶSTUSPVOE SFWJFXFST "OHFMB .BZ 0Ɗ$POOPS BOE .BSUJO 7ML
GPS UIFJS USFNFOEPVT QBUJFODF 8F IBWF TFOU UIFN FBDI TPNF
WFSZ SPVHI NBUFSJBM BOE UIFZ IBWF CFFO XJMMJOH UP XPSL XJUI
JU BOE TFOE EFUBJMFE GFFECBDL BCPVU XIBU XPSLFE BOE XIBU
EJEOƊU 5IFJS SFWJFXT IFMQFE FOTVSF UIF CPPL JT TVJUBCMF GPS
CPUI CFHJOOFST BOE DPNQSFIFOTJWF "MTP UIFZƊSF CPUI KVTU
XPOEFSGVM QFPQMF BMM BSPVOE
.BSUJO %F.FMMP %BOJFM (FF BOE 4JNPO :BOH IBWF FBDI
TFOU VT NBOZ
TNBSU DSJUJDJTNT BOE IFMQGVM TVHHFTUJPOT 5IF
CPPL XPVME IBWF CFFO TIPSUFS XJUIPVU UIFJS IFMQ XF UIJOL
CVU JUƊT NVDI NPSF UIPSPVHI BOE DMFBS OPX
" OVNCFS PG QFPQMF IBWF DPOUSJCVUFE GFFECBDL BOE UFDI
OJDBM SFWJFX GPS MJNJUFE QBSUT PG UIF CPPL 5IBOLT UP 4FBO
$IBMNFST &SJL EF $BTUSP -PQP "MQ .FTUBOPHVMMBSJ +VBO "M
CFSUP 4BODIF[ +POBUIBO 'FSHVTPO %FCPSBI /FXUPO .BUU
1BSTPOT 1FUFS )BSQFOEJOH +PTI $BSUXSJHIU &SJD .FSUFOT
BOE (FPSHF .BLSZEBLJT XIP IBWF BMM PƵFSFE DSJUJRVFT PG PVS
XSJUJOH BOE PVS UFDIOJDBM DPWFSBHF PG EJƵFSFOU UPQJDT
$0/5&/54 YYWJ

8F IBWF TPNF WFSZ BDUJWF FBSMZ BDDFTT SFBEFST XIP TFOE VT


B TUSFBN PG GFFECBDL FWFSZUIJOH GSPN NJOPS UZQPHSBQIJDBM
FSSPST UIFZ ƶOE UP RVFTUJPOT BCPVU FYFSDJTFT BOE XFƊSF QMFBTFE
BOE HSBUFGVM UP IBWF UIFJS JOQVU 5IF CPPL XPVME CF NFTTJFS
BOE UIF FYFSDJTFT MFTT VTFGVM JG OPU GPS UIFJS IFMQ +VMJFO #BMFZ
BOE +BTPO 3PTF,VISU IBWF CFFO QBSUJDVMBSMZ PVUTUBOEJOH PO
UIJT GSPOU OPU POMZ SFQSFTFOUJOH B OPOUSJWJBM QPSUJPO PG PVS
SFBEFS GFFECBDL PWFS UIF DPVSTF PG TFWFSBM SFMFBTFT PG UIF CPPL
CVU BMTP DBUDIJOH UIJOHT OPCPEZ FMTF OPUJDFE
5IF CPPL DPWFS XBT EFTJHOFE CZ %BWJE %FVUTDI TLPSF@EF
PO 5XJUUFS
 )F UPPL QJUZ PO UIF TUBUF PG PVS QSFWJPVT PSJHJOBM
TVQFS TQFDJBM FBSMZ BDDFTT DPWFS BOE UPPL JU VQPO IJNTFMG UP
SFEFTJHO JU 8F MJLFE JU TP NVDI XF BTLFE IJN UP SFEP UIF CPPL
XFC TJUF BT XFMM )FƊT B UBMFOUFE EFTJHOFS BOE XFƊSF HSBUFGVM
GPS BMM UIF XPSL IFƊT EPOF GPS VT
" TQFDJBM UIBOLZPV JT PXFE UP 4PSZV .PSPOVLJ +VMJFƊT TPO
XIP BHSFFE UP USZ UP VTF UIF CPPL UP UFBDI IJNTFMG )BTLFMM BOE
BMMPXFE VT UP VTF IJT GFFECBDL BOE PDDBTJPOBMMZ CMPH BCPVU IJT
QSPHSFTT
" XBSN IFMMP UP BMM UIF SFBEJOH HSPVQT CPUI POMJOF BOE
JO NFBUTQBDF UIBU IBWF GPSNFE UP XPSL UISPVHI UIF CPPL
UPHFUIFS 8FƊWF IBE TPNF HSFBU GFFECBDL GSPN UIFTF HSPVQT
BOE IPQF UP WJTJU XJUI ZPV BMM TPNFEBZ 8FƊSF EFMJHIUFE UP TFF
UIF )BTLFMM DPNNVOJUZ HSPXJOH
8F XPVME BMTP MJLF UP UIBOL .JDIBFM /FBMF GPS CFJOH GVOOZ
BOE MFUUJOH VT VTF TPNFUIJOH IF TBJE PO 5XJUUFS BT BO FQJHSBQI
$0/5&/54 YYWJJ

4PNF EBZ XF IPQF UP CVZ UIF HFOUMFNBO B CFFS


5IBOL ZPV BT XFMM UP 4UFWFO 1SPDUPS GPS IBWJOH IPTUFE VT PO
IJT 'VODUJPOBM (FFLFSZ QPEDBTU BOE UP "EBN 4UBDPWJBL BOE
+FSPE 4BOUP GPS JOWJUJOH VT POUP UIFJS QPEDBTU 5IF $IBOHFMPH
ƈ BOE UP ;BLJ .BOJBO GPS CSJOHJOH VT UP "EBN BOE +FSPEƊT
BUUFOUJPO

$ISJT * XPVME MJLF UP UIBOL UIF QBSUJDJQBOUT JO UIF #haskell-


beginners *3$ DIBOOFM UIF UFBDIFST BOE UIF TUVEFOUT XIP IBWF
IFMQFE NF QSBDUJDF BOE SFƶOF NZ UFBDIJOH UFDIOJRVFT .BOZ
PG UIF FYFSDJTFT BOE BQQSPBDIFT JO UIF CPPL XPVMEƊWF OFWFS
IBQQFOFE XJUIPVU UIF XPOEFSGVM )BTLFMM *3$ DPNNVOJUZ UP
MFBSO GSPN
* PXF "MFY ,VSJMJO $BSUFS 4DIPOXBME "JEBO $PZOF BOE
.BSL 8PUUPO UIBOLT GPS CFJOH UIFSF XIFO * XBT SFBMMZ CBE BU
UFBDIJOH CFJOH LJOE BOE QBUJFOU GSJFOET BOE GPS HJWJOH NF
BEWJDF XIFO * OFFEFE JU * XPVMEOƊU IBWF TDSBUDIFE UIJT JUDI
XJUIPVU ZƊBMM

+VMJF * XPVME MJLF UP TFOE B TQFDJBM TIPVUPVU UP UIF "VTUJO


)BTLFMM NFFUVQ HSPVQ FTQFDJBMMZ %BO -JFO BOE UP UIF )BTLFMM
5XJUUFS DPNNVOJUZ GPS NBLJOH NF GFFM XFMDPNF 5IF MJTU PG
)BTLFMMFST XIP IBWF SFTQPOEFE UP UIF LWFUDIFT BOE DPOGVTJPOT
PG B )BTLFMM CFHJOOFS XJUI IFMQ IVNPS BOE BEWJDF XPVME CF
WFSZ MPOH JOEFFE
$0/5&/54 YYWJJJ

.Z IVTCBOE BOE DIJMESFO IBWF UPMFSBUFE NF TQFOEJOH VO


DPVOUBCMF IPVST JNNFSTFE JO UIF EBSL BSUT PG UIVOLFSZ * BN
HSBUFGVM GPS UIFJS MPWF QBUJFODF BOE TVQQPSU BOE IPQF UIBU
NZ LJET XJMM SFNFNCFS UIJT UIBU JUƊT OFWFS UPP MBUF UP MFBSO
TPNFUIJOH OFX #FTPT NJKPT
'JOBMMZ B XBSN UIBOLZPV UP PVS GSJFOE (FPSHF .BLSZEBLJT
GPS UIF POHPJOH EJTQFOTBUJPO PG XJTEPN PO NBUUFST UP EP XJUI
NBUI QSPHSBNNJOH UIF XFJSEJOH XBZ BOE MJGF
"OZ FSSPST JO UIF CPPL PG DPVSTF SFNBJO UIF TPMF SFTQPOTJ
CJMJUZ PG UIF BVUIPST
$0/5&/54 YYJY

*OUSPEVDUJPO
8FMDPNF UP B OFX XBZ UP MFBSO )BTLFMM 1FSIBQT ZPV BSF
DPNJOH UP UIJT CPPL GSVTUSBUFE CZ QSFWJPVT BUUFNQUT UP MFBSO
)BTLFMM 1FSIBQT ZPV IBWF POMZ UIF GBJOUFTU OPUJPO PG XIBU
)BTLFMM JT 1FSIBQT ZPV BSF DPNJOH IFSF CFDBVTF ZPV BSF OPU
DPOWJODFE UIBU BOZUIJOH XJMM FWFS CF CFUUFS UIBO $PNNPO
-JTQ4DBMB3VCZXIBUFWFS MBOHVBHF ZPV MPWF BOE ZPV XBOU
UP BSHVF XJUI VT 1FSIBQT ZPV XFSF KVTU MPPLJOH GPS UIF 
CJMMJPOUI OC UIJT OVNCFS NBZ CF JOBDDVSBUF
NPOBE UVUPSJBM
DFSUBJO UIBU UIJT UJNF BSPVOE ZPV XJMM VOEFSTUBOE NPOBET
PODF BOE GPS BMM 8IBUFWFS ZPVS TJUVBUJPO XFMDPNF BOE SFBE
PO *U JT PVS HPBM IFSF UP NBLF )BTLFMM BT DMFBS QBJOMFTT BOE
QSBDUJDBM BT XF DBO OP NBUUFS XIBU QSJPS FYQFSJFODFT ZPVƊSF
CSJOHJOH UP UIF UBCMF

8IZ 5IJT #PPL


*G ZPV BSF OFX UP QSPHSBNNJOH FOUJSFMZ )BTLFMM JT B HSFBU
ƶSTU MBOHVBHF )BTLFMM JT B HFOFSBM QVSQPTF GVODUJPOBM QSP
HSBNNJOH MBOHVBHF *UƊT BQQMJDBCMF WJSUVBMMZ BOZXIFSF POF
XPVME VTF B QSPHSBN UP TPMWF B QSPCMFN TBWF GPS TPNF TQFDJƶD
FNCFEEFE BQQMJDBUJPOT *G ZPV DPVME XSJUF TPǒXBSF UP TPMWF B

'VODUJPOBM QSPHSBNNJOH JT B TUZMF PG QSPHSBNNJOH JO XIJDI GVODUJPO DBMMT SBUIFS
UIBO B TFSJFT PG JOTUSVDUJPOT GPS UIF DPNQVUFS UP FYFDVUF BSF UIF QSJNBSZ DPOTUSVDUT PG
ZPVS QSPHSBN 8IBU JU JT EPFTOƊU NBUUFS NVDI SJHIU OPX )BTLFMM DPNQMFUFMZ FNCPEJFT
UIF GVODUJPOBM TUZMF TP JU XJMM CFDPNF DMFBS PWFS UIF DPVSTF PG UIF CPPL
$0/5&/54 YYY

QSPCMFN ZPV DPVME QSPCBCMZ VTF )BTLFMM


*G ZPV BSF BMSFBEZ B QSPHSBNNFS ZPV NBZ CF MPPLJOH UP
FOSJDI ZPVS TLJMMT CZ MFBSOJOH )BTLFMM GPS B WBSJFUZ PG SFBTPOT
ƈ GSPN MPWF PG QVSF GVODUJPOBM QSPHSBNNJOH JUTFMG UP XBOUJOH
UP XSJUF GVODUJPOBM 4DBMB DPEF UP ƶOEJOH B CSJEHF UP 1VSF4DSJQU
PS *ESJT -BOHVBHFT TVDI BT +BWB BSF HSBEVBMMZ BEPQUJOH GVOD
UJPOBM DPODFQUT CVU NPTU XFSF OPU EFTJHOFE UP CF GVODUJPOBM
MBOHVBHFT #FDBVTF )BTLFMM JT B QVSF GVODUJPOBM MBOHVBHF JU JT
B GFSUJMF FOWJSPONFOU GPS NBTUFSJOH GVODUJPOBM QSPHSBNNJOH
5IBU XBZ PG UIJOLJOH BOE QSPCMFN TPMWJOH JT VTFGVM OP NBUUFS
XIBU PUIFS MBOHVBHFT ZPV NJHIU LOPX PS MFBSO 8FƊWF IFBSE
GSPN SFBEFST XIP BSF ƶOEJOH UIJT CPPL VTFGVM UP UIFJS XPSL JO
EJWFSTF MBOHVBHFT TVDI BT 4DBMB ' 'SFHF 4XJǒ 1VSF4DSJQU
*ESJT BOE &MN
)BTLFMM IBT B CJU PG B SFQVUBUJPO GPS CFJOH EJƸDVMU 8SJUJOH
)BTLFMM NBZ TFFN UP CF NPSF EJƸDVMU VQ GSPOU OPU KVTU CFDBVTF
PG UIF IBTTMF PG MFBSOJOH B MBOHVBHF UIBU JT TZOUBDUJDBMMZ BOE
DPODFQUVBMMZ EJƵFSFOU GSPN B MBOHVBHF ZPV BMSFBEZ LOPX CVU
BMTP CFDBVTF PG GFBUVSFT TVDI BT TUSPOH UZQJOH UIBU FOGPSDF
TPNF EJTDJQMJOF JO IPX ZPV XSJUF ZPVS DPEF #VU XIBU TFFNT
MJLF B CVH JT B GFBUVSF )VNBOT VOGPSUVOBUFMZ IBWF SFMBUJWFMZ
MJNJUFE BCJMJUJFT PG TIPSUUFSN NFNPSZ BOE DPODFOUSBUJPO
FWFO JG XF EPOƊU MJLF UP BENJU JU 8F DBOOPU USBDL BMM SFMFWBOU
NFUBEBUB BCPVU PVS QSPHSBNT JO PVS IFBET 6TJOH VQ XPSLJOH
NFNPSZ GPS BOZUIJOH B DPNQVUFS DBO EP GPS VT JT DPVOUFS
QSPEVDUJWF BOE DPNQVUFST BSF WFSZ HPPE BU LFFQJOH USBDL PG
$0/5&/54 YYYJ

EBUB GPS VT JODMVEJOH NFUBEBUB TVDI BT UZQFT


8F EPOƊU XSJUF )BTLFMM CFDBVTF XFƊSF HFOJVTFT ƈ XF VTF
UPPMT MJLF )BTLFMM CFDBVTF XFƊSF OPU HFOJVTFT BOE UIFZ IFMQ VT
(PPE UPPMT MJLF )BTLFMM FOBCMF VT UP XPSL GBTUFS NBLF GFXFS
NJTUBLFT BOE IBWF NPSF JOGPSNBUJPO BCPVU XIBU PVS DPEF JT
TVQQPTFE UP EP BT XF SFBE JU
8F VTF )BTLFMM CFDBVTF JU JT FBTJFS PWFS UIF MPOH SVO
BOE FOBCMFT
VT UP EP B CFUUFS KPC 5IBUƊT JU 5IFSFƊT B SBNQVQ SFRVJSFE JO
PSEFS UP HFU TUBSUFE CVU UIBU DBO CF BNFMJPSBUFE XJUI QBUJFODF
BOE B XJMMJOHOFTT UP XPSL UISPVHI FYFSDJTFT

0, CVU * XBT KVTU MPPLJOH GPS B NPOBE UVUPSJBM


5IF CBE OFXT JT MPPLJOH GPS BO FBTZ SPVUF JOUP )BTLFMM BOE
GVODUJPOBM QSPHSBNNJOH JT IPX B MPU PG QFPQMF FOE VQ UIJOL
JOH JUƊT ƌUPP IBSEƍ GPS UIFN 5IF HPPE OFXT JT XF IBWF B MPU
PG FYQFSJFODF UFBDIJOH BOE XF EPOƊU XBOU UIBU UP IBQQFO UP
BOZPOF CVU FTQFDJBMMZ OPU ZPV HFOUMF SFBEFS
8F FODPVSBHF ZPV UP GPSHFU XIBU ZPV NJHIU BMSFBEZ LOPX
BCPVU QSPHSBNNJOH BOE DPNF BU UIJT DPVSTF JO )BTLFMM XJUI B
CFHJOOFSƊT NJOETFU .BLF ZPVSTFMG BO FNQUZ WFTTFM SFBEZ UP
MFU UIF UZQFT ƷPX UISPVHI ZPV
*G ZPV BSF BO FYQFSJFODFE QSPHSBNNFS MFBSOJOH )BTLFMM JT
NPSF MJLF MFBSOJOH UP QSPHSBN BMM PWFS BHBJO -FBSOJOH )BTLFMM
JNQPTFT OFX XBZT PG UIJOLJOH BCPVU BOE TUSVDUVSJOH QSPHSBNT
PO NPTU QFPQMF BMSFBEZ DPNGPSUBCMF XJUI BO JNQFSBUJWF PS
$0/5&/54 YYYJJ

VOUZQFE QSPHSBNNJOH MBOHVBHF 5IJT NBLFT JU IBSEFS UP


MFBSO OPU CFDBVTF JU JT JOUSJOTJDBMMZ IBSEFS CVU CFDBVTF NPTU
QFPQMF XIP IBWF MFBSOFE BU MFBTU B DPVQMF PG QSPHSBNNJOH
MBOHVBHFT BSF BDDVTUPNFE UP UIF QSPDFTT CFJOH USJWJBM BOE
UIFJS FYQFDUBUJPOT IBWF CFFO TFU JO B XBZ UIBU MFOET JUTFMG UP
CVSOPVU BOE GBJMVSF
*G )BTLFMM JT ZPVS ƶSTU MBOHVBHF PS FWFO JG JU JT OPU ZPV NBZ
IBWF OPUJDFE B TQFDJƶD QSPCMFN XJUI NBOZ )BTLFMM MFBSOJOH
SFTPVSDFT UIFZ BTTVNF B DFSUBJO MFWFM PG CBDLHSPVOE XJUI
QSPHSBNNJOH TP UIFZ GSFRVFOUMZ FYQMBJO )BTLFMM DPODFQUT JO
UFSNT CZ BOBMPHZ PS CZ DPOUSBTU PG QSPHSBNNJOH DPODFQUT
GSPN PUIFS MBOHVBHFT 5IJT JT DPOGVTJOH GPS UIF TUVEFOU XIP
EPFTOƊU LOPX UIPTF PUIFS MBOHVBHFT CVU XF QPTJU UIBU JU JT KVTU
BT VOIFMQGVM GPS FYQFSJFODFE QSPHSBNNFST .PTU BUUFNQUT UP
DPNQBSF )BTLFMM XJUI PUIFS MBOHVBHFT POMZ MFBE UP B TVQFSƶDJBM
VOEFSTUBOEJOH PG )BTLFMM BOE NBLJOH BOBMPHJFT UP MPPQT BOE
PUIFS TVDI DPOTUSVDUT DBO MFBE UP CBE JOUVJUJPOT BCPVU IPX
)BTLFMM DPEF XPSLT 'PS BMM PG UIFTF SFBTPOT XF IBWF USJFE UP
BWPJE SFMZJOH PO LOPXMFEHF PG PUIFS QSPHSBNNJOH MBOHVBHFT
+VTU BT ZPV DBOƊU BDIJFWF ƷVFODZ JO B IVNBO MBOHVBHF TP MPOH
BT ZPV BSF TUJMM BUUFNQUJOH EJSFDU USBOTMBUJPOT PG DPODFQUT BOE
TUSVDUVSFT GSPN ZPVS OBUJWF MBOHVBHF UP UIF UBSHFU MBOHVBHF
JUƊT CFTU UP MFBSO UP VOEFSTUBOE )BTLFMM PO JUT PXO UFSNT
$0/5&/54 YYYJJJ

#VU *ƊWF IFBSE )BTLFMM JT IBSE


5IFSFƊT B XJME SVNPS UIBU HPFT BSPVOE UIF JOUFSOFU GSPN UJNF
UP UJNF BCPVU OFFEJOH B 1I% JO NBUIFNBUJDT BOE BO VOEFS
TUBOEJOH PG NPOBET KVTU UP XSJUF ƌIFMMP XPSMEƍ JO )BTLFMM
8F XJMM XSJUF ƌIFMMP XPSMEƍ JO $IBQUFS  8FƊSF HPJOH UP EP
TPNF BSJUINFUJD CFGPSF UIBU UP HFU ZPV VTFE UP GVODUJPO TZOUBY
BOE BQQMJDBUJPO JO )BTLFMM CVU ZPV XJMM OPU OFFE B 1I% JO
NPOBEPMPHZ UP XSJUF JU
*O USVUI UIFSF XJMM CF B NPOBE VOEFSMZJOH PVS ƌIFMMP XPSME ƍ
BOE CZ UIF FOE PG UIF CPPL ZPV XJMM VOEFSTUBOE NPOBET
CVU ZPVƊMM CF JOUFSBDUJOH XJUI NPOBEJD DPEF MPOH CFGPSF ZPV
VOEFSTUBOE IPX JU BMM XPSLT :PVƊMM ƶOE BU UJNFT UIJT CPPL
HPFT JOUP NPSF EFUBJM UIBO ZPV TUSJDUMZ OFFE UP CF BCMF UP XSJUF
)BTLFMM TVDDFTTGVMMZ 5IFSF JT OP QSPCMFN XJUI UIBU :PV EP
OPU OFFE UP VOEFSTUBOE FWFSZUIJOH JO IFSF QFSGFDUMZ PO UIF
ƶSTU USZ
:PV BSF OPU B 4QBSUBO XBSSJPS XIP NVTU DPNF CBDL XJUI
ZPVS TIJFME PS PO JU 3FUVSOJOH MBUFS UP JOWFTUJHBUF UIJOHT NPSF
EFFQMZ JT BO FƸDJFOU UFDIOJRVF OPU B GBJMVSF

8SJUJOH ƌIFMMP XPSMEƍ JO B OFX QSPHSBNNJOH MBOHVBHF JT B TUBOEBSE TPSU PG ƌCBCZƊT
ƶSTU QSPHSBN ƍ TP UIF JEFB IFSF JT UIBU JG JUƊT EJƸDVMU UP XSJUF B ƌIFMMP XPSMEƍ QSPHSBN
UIFO UIF MBOHVBHF NVTU CF JNQPTTJCMF 5IFSF BSF MBOHVBHFT UIBU IBWF QVSQPTFMZ NBEF JU
JOIVNBOMZ EJƸDVMU UP XSJUF TVDI QSPHSBNT CVU )BTLFMM JT OPU POF PG UIFN
$0/5&/54 YYYJW

" GFX XPSET UP OFX QSPHSBNNFST


8FƊWF USJFE WFSZ IBSE UP NBLF UIJT CPPL BT BDDFTTJCMF BT QPTTJ
CMF OP NBUUFS ZPVS MFWFM PG QSFWJPVT FYQFSJFODF 8F IBWF LFQU
DPNQBSJTPOT BOE NFOUJPOT PG PUIFS MBOHVBHFT UP B NJOJNVN
BOE XF QSPNJTF UIBU JG XF DPNQBSF TPNFUIJOH JO )BTLFMM UP
TPNFUIJOH JO BOPUIFS MBOHVBHF UIBU DPNQBSJTPO JT OPU JUTFMG
DSVDJBM UP VOEFSTUBOEJOH UIF )BTLFMM ƈ JUƊT KVTU B MJUUMF FYUSB GPS
UIPTF XIP EP LOPX UIF PUIFS MBOHVBHF
)PXFWFS FTQFDJBMMZ BT UIF CPPL QSPHSFTTFT BOE UIF FYFSDJTFT
BOE QSPKFDUT HFU NPSF ƌSFBM ƍ UIFSF BSF HPJOH UP CF UFSNT BOE
DPODFQUT UIBU XF EP OPU IBWF UIF TQBDF UP FYQMBJO GVMMZ CVU
UIBU BSF SFMBUJWFMZ XFMM LOPXO BNPOH QSPHSBNNFST :PV NBZ
IBWF UP EP JOUFSOFU TFBSDIFT GPS UFSNT MJLF +40/ 5IF OFYU
TFDUJPO PG UIJT JOUSPEVDUJPO SFGFSFODFT UIJOHT UIBU ZPV NBZ OPU
LOPX BCPVU CVU QSPHSBNNFST XJMM ƈ EPOƊU QBOJD 8F UIJOL
ZPVƊMM TUJMM HFU TPNFUIJOH PVU PG SFBEJOH JU CVU JG OPU JUƊT OPU
TPNFUIJOH UP XPSSZ BCPVU 5IF GBDU UIBU ZPV EPOƊU LOPX FWFSZ
UFSN JO UIJT CPPL CFGPSF ZPV DPNF UP JU JT OPU B TJHO UIBU ZPV
DBOƊU MFBSO )BTLFMM PS BSFOƊU SFBEZ GPS UIJT JUƊT POMZ B TJHO UIBU
ZPV EPOƊU LOPX FWFSZUIJOH ZFU BOE TJODF OP POF EPFT ZPVƊSF JO
ƶOF DPNQBOZ
"MPOH UIPTF TBNF MJOFT UIJT CPPL EPFT OPU PƵFS NVDI JO
TUSVDUJPO PO VTJOH UIF UFSNJOBM BOE UFYU FEJUPS 5IF JOTUSVD
UJPOT QSPWJEFE BTTVNF ZPV LOPX IPX UP ƶOE ZPVS XBZ BSPVOE
ZPVS UFSNJOBM BOE VOEFSTUBOE IPX UP EP TJNQMF UBTLT MJLF
$0/5&/54 YYYW

NBLF B EJSFDUPSZ PS PQFO B ƶMF %VF UP UIF OVNCFS PG UFYU


FEJUPST BWBJMBCMF XF EP OPU QSPWJEF TQFDJƶD JOTUSVDUJPOT GPS
BOZ PG UIFN
*G ZPV OFFE IFMQ PS XPVME MJLF UP TUBSU HFUUJOH UP LOPX UIF
DPNNVOJUJFT PG GVODUJPOBM QSPHSBNNFST UIFSF BSF TFWFSBM
PQUJPOT 5IF 'SFFOPEF *3$ DIBOOFM #haskell-beginners IBT
UFBDIFST XIP XJMM CF HMBE UP IFMQ ZPV BOE UIFZ FTQFDJBMMZ
XFMDPNF RVFTUJPOT SFHBSEJOH TQFDJƶD QSPCMFNT UIBU ZPV BSF
USZJOH UP TPMWF 5IFSF BSF BMTP 4MBDL DIBOOFMT BOE TVCSFEEJUT
XIFSF )BTLFMMFST DPOHSFHBUF BMPOH XJUI B QMFUIPSB PG )BTLFMM
PSJFOUFE CMPHT NBOZ PG XIJDI BSF NFOUJPOFE JO GPPUOPUFT
BOE SFDPNNFOEFE SFBEJOHT UISPVHIPVU UIF CPPL .BOZ PG
PVS SFBEFST BMTP QSPHSBN JO MBOHVBHFT MJLF 4XJǒ BOE 4DBMB TP
ZPV NBZ XBOU UP JOWFTUJHBUF UIPTF DPNNVOJUJFT BT XFMM

)BTLFWBOHFMJTN
5IF SFTU PG UIJT JOUSPEVDUJPO XJMM HJWF TPNF CBDLHSPVOE PG
)BTLFMM BOE XJMM NBLF SFGFSFODF UP PUIFS QSPHSBNNJOH MBO

*G ZPVƊSF RVJUF OFX BOE VOTVSF XIBU UP EP BCPVU UFYU FEJUPST ZPV NJHIU DPOTJEFS
"UPN *UƊT GSFF PQFOTPVSDF BOE DPOƶHVSBCMF 4VCMJNF 5FYU IBT TFSWFE +VMJF XFMM UISPVHI
PVU UIF XSJUJOH PG UIF CPPL CVU JT OPU GSFF $ISJT VTFT &NBDT NPTU PG UIF UJNF &NBDT
JT WFSZ QPQVMBS BNPOH QSPHSBNNFST CVU IBT JUT PXO MFBSOJOH DVSWF 7JN JT BOPUIFS
QPQVMBS UFYU FEJUPS XJUI JUT PXO MFBSOJOH DVSWF *G ZPV IBWF OP FYQFSJFODF XJUI &NBDT PS
7JN XFƊE SFBMMZ SFDPNNFOE TUJDLJOH XJUI TPNFUIJOH MJLF 4VCMJNF PS "UPN GPS OPX

'SFFOPEF *3$ *OUFSOFU 3FMBZ $IBU
JT B OFUXPSL PG DIBOOFMT GPS UFYUVBM DIBU 5IFSF
BSF PUIFS *3$ OFUXPSLT BSPVOE BT XFMM BT PUIFS HSPVQ DIBU QMBUGPSNT CVU UIF 'SFFOPEF
*3$ DIBOOFMT GPS )BTLFMM BSF QPQVMBS NFFUJOH QMBDFT GPS UIF )BTLFMM DPNNVOJUZ 5IFSF
BSF TFWFSBM XBZT UP BDDFTT 'SFFOPEF *3$ JODMVEJOH *STTJ BOE )FY$IBU JG ZPVƊSF JOUFSFTUFE
JO HFUUJOH UP LOPX UIF DPNNVOJUZ JO UIFJS OBUVSBM IBCJUBU
$0/5&/54 YYYWJ

HVBHFT BOE TUZMFT *G ZPVƊSF B OFX QSPHSBNNFS JU JT QPTTJCMF


OPU BMM PG UIJT XJMM NBLF TFOTF BOE UIBUƊT PLBZ 5IF SFTU PG UIF
CPPL JT XSJUUFO XJUI CFHJOOFST JO NJOE BOE UIF GFBUVSFT XFƊSF
PVUMJOJOH XJMM NBLF NPSF TFOTF BT ZPV XPSL UISPVHI UIF CPPL
8FƊSF HPJOH UP DPNQBSF )BTLFMM B CJU XJUI PUIFS MBOHVBHFT
UP EFNPOTUSBUF XIZ XF UIJOL VTJOH )BTLFMM JT WBMVBCMF )BTLFMM
JT B MBOHVBHF JO B QSPHSFTTJPO PG MBOHVBHFT EBUJOH CBDL UP 
XIFO .- XBT JOWFOUFE CZ 3PCJO .JMOFS BOE PUIFST BU UIF
6OJWFSTJUZ PG &EJOCVSHI .- XBT JUTFMG JOƷVFODFE CZ *48*.
XIJDI XBT JO UVSO JOƷVFODFE CZ "-(0-  BOE -JTQ 8F
NFOUJPO UIJT MJOFBHF CFDBVTF )BTLFMM JTOƊU OFX 5IF NPTU QPQ
VMBS JNQMFNFOUBUJPO PG )BTLFMM UIF (MBTHPX )BTLFMM $PNQJMFS
()$
JT NBUVSF BOE XFMMNBEF )BTLFMM CSJOHT UPHFUIFS TPNF
OJDF EFTJHO DIPJDFT UIBU NBLF GPS B MBOHVBHF UIBU PƵFST NPSF
FYQSFTTJWFOFTT UIBO 3VCZ CVU NPSF UZQF TBGFUZ UIBO BOZ MBO
HVBHF QSFTFOUMZ JO XJEF VTF DPNNFSDJBMMZ
*O  UIF "-(0- EJBMFDU IBE UIF GPMMPXJOH GFBUVSFT
CVJMU JOUP UIF MBOHVBHF

 6TFSEFƶOFE SFDPSE UZQFT

 6TFSEFƶOFE TVN UZQFT VOJPOT OPU MJNJUFE UP TJNQMF


FOVNFSBUJPOT


 4XJUDIDBTF FYQSFTTJPOT TVQQPSUJOH UIF TVN UZQFT

 $PNQJMFUJNF FOGPSDFE DPOTUBOU WBMVFT EFDMBSFE XJUI =


SBUIFS UIBO :=
$0/5&/54 YYYWJJ

 6OJƶFE TZOUBY GPS VTJOH WBMVF BOE SFGFSFODF UZQFT ƈ OP


NBOVBM QPJOUFS EFSFGFSFODJOH

 $MPTVSFT XJUI MFYJDBM TDPQJOH XJUIPVU UIJT NBOZ GVOD


UJPOBM QBUUFSOT GBMM BQBSU


 *NQMFNFOUBUJPOBHOPTUJD QBSBMMFMJ[FE FYFDVUJPO PG QSP


DFEVSFT

 .VMUJQBTT DPNQJMBUJPO ƈ ZPV DBO EFDMBSF TUVƵ BǒFS ZPV


VTF JU

"T PG UIF FBSMZ TU DFOUVSZ NBOZ QPQVMBS MBOHVBHFT VTFE


DPNNFSDJBMMZ EPOƊU IBWF BOZUIJOH FRVJWBMFOU UP PS CFUUFS UIBO
XIBU "-(0- IBE 8F NFOUJPO UIJT CFDBVTF XF CFMJFWF
UFDIOPMPHJDBM QSPHSFTT JO DPNQVUFS TDJFODF QSPHSBNNJOH
BOE QSPHSBNNJOH MBOHVBHFT JT QPTTJCMF EFTJSBCMF BOE DSJUJDBM
UP TPǒXBSF CFDPNJOH B USVF FOHJOFFSJOH EJTDJQMJOF #Z UIBU
XF NFBO UIBU XIJMF UIF QISBTF ƌTPǒXBSF FOHJOFFSJOHƍ JT JO
DPNNPO VTF FOHJOFFSJOH EJTDJQMJOFT JOWPMWF UIF BQQMJDBUJPO
PG CPUI TDJFOUJƶD BOE QSBDUJDBM LOPXMFEHF UP UIF DSFBUJPO BOE
NBJOUFOBODF PG CFUUFS TZTUFNT "T UIF BWBJMBCMF NBUFSJBMT
DIBOHF BOE BT LOPXMFEHF HSPXT TP NVTU FOHJOFFST
)BTLFMM MFWFSBHFT NPSF PG UIF EFWFMPQNFOUT JO QSPHSBN
NJOH MBOHVBHFT JOWFOUFE TJODF "-(0- UIBO NPTU MBOHVBHFT
JO QPQVMBS VTF CVU XJUI UIF BEEFE CFOFƶU PG B NBUVSF JNQMF
NFOUBUJPO BOE TPVOE EFTJHO 4PNFUJNFT XF IFBS )BTLFMM CF
JOH EJTNJTTFE BT ƌBDBEFNJDƍ CFDBVTF JU JT SFMBUJWFMZ VQUPEBUF
$0/5&/54 YYYWJJJ

XJUI UIF DVSSFOU TUBUF PG NBUIFNBUJDT BOE DPNQVUFS TDJFODF


SFTFBSDI *O PVS WJFX UIBU QSPHSFTT JT HPPE BOE IFMQT VT TPMWF
QSBDUJDBM QSPCMFNT JO NPEFSO DPNQVUJOH BOE TPǒXBSF EFTJHO
1SPHSFTT JT QPTTJCMF BOE EFTJSBCMF CVU JU JT OPU NPOPUPOJD PS
JOFWJUBCMF 5IF IJTUPSZ PG UIF XPSME JT SJEEMFE XJUI FYBNQMFT
PG VOFWFO QSPHSFTT 'PS FYBNQMF JU JT FTUJNBUFE UIBU TDVSWZ
LJMMFE UXP NJMMJPO TBJMPST CFUXFFO UIF ZFBST  BOE 
8FTUFSO DVMUVSF IBT GPSHPUUFO UIF DVSF GPS TDVSWZ NVMUJQMF
UJNFT "T FBSMZ BT  UIF 4VSHFPO (FOFSBM PG UIF &BTU *O
EJB $PNQBOZ SFDPNNFOEFE CSJOHJOH DJUSVT PO WPZBHFT GPS
TDVSWZ *U TBWFE MJWFT CVU UIF VOEFSTUBOEJOH PG XIZ DJUSVT
DVSFE TDVSWZ XBT JODPSSFDU 5IJT MFE UP UIF VTF PG MJNFT XIJDI
IBWF B MPXFS WJUBNJO $ DPOUFOU UIBO MFNPOT BOE TDVSWZ SF
UVSOFE VOUJM BTDPSCJD BDJE XBT EJTDPWFSFE JO  *OEJTDJQMJOF
BOE TUVCCPSOOFTT UIF #SJUJTI /BWZ TUVDL XJUI MJNFT EFTQJUF
TBJMPST DPOUJOVJOH UP EJF GSPN TDVSWZ
DBO IPME CBDL QSPHSFTT
8FƊE SBUIFS IBWF B EPDUPS XIP JT XJMMJOH UP VOEFSTUBOE UIBU
IF NBLFT NJTUBLFT XJMM CF SFTQPOTJWF UP OFX JOGPSNBUJPO
BOE FWFO BDUJWFMZ TFFL UP FYQBOE IJT VOEFSTUBOEJOH SBUIFS
UIBO POF UIBU IVOLFST EPXO XJUI B QFU UIFPSZ JOGPSNFE CZ
BOFDEPUF
5IFSF BSF PUIFS XBZT UP QSFWFOU TDVSWZ KVTU BT UIFSF BSF
PUIFS QSPHSBNNJOH MBOHVBHFT ZPV DBO VTF UP XSJUF TPǒXBSF
0S QFSIBQT ZPV BSF BO FYQMPSFS XIP EPFTOƊU CFMJFWF TDVSWZ
DBO IBQQFO UP ZPV #VU QBDLJOH MFNPOT QSPWJEFT TPNF JO
TVSBODF PO UIPTF MPOH WPZBHFT 4JNJMBSMZ IBWJOH )BTLFMM JO
$0/5&/54 YYYJY

ZPVS UPPMLJU FWFO XIFO JUƊT OPU ZPVS POMZ UPPM QSPWJEFT UZQF
TBGFUZ BOE QSFEJDUBCJMJUZ UIBU DBO JNQSPWF ZPVS TPǒXBSF EFWFM
PQNFOU #VHHZ TPǒXBSF NJHIU OPU MJUFSBMMZ NBLF ZPVS UFFUI
GBMM PVU CVU TPǒXBSF QSPCMFNT BSF GBS GSPN USJWJBM BOE XIFO
UIFSF BSF CFUUFS XBZT UP TPMWF UIPTF QSPCMFNT ƈ OPU QFSGFDU
CVU CFUUFS ƈ JUƊT XPSUI ZPVS UJNF UP JOWFTUJHBUF UIFN
4FU ZPVS MJNFT BTJEF GPS OPX BOE KPJO VT BU UIF MFNPOBEF
TUBOE

8IBUƊT JO UIJT CPPL


5IJT CPPL JT NPSF PG B DPVSTF UIBO B CPPL TPNFUIJOH UP
CF XPSLFE UISPVHI 5IFSF BSF FYFSDJTFT TQSJOLMFE MJCFSBMMZ
UISPVHIPVU UIF CPPL XF FODPVSBHF ZPV UP EP UIFN FWFO
XIFO UIFZ TFFN TJNQMF 5IPTF FYFSDJTFT BSF XIFSF UIF NBKPS
JUZ PG ZPVS FQJQIBOJFT XJMM DPNF GSPN /P BNPVOU PG DIBUUFS
JOH OP NBUUFS IPX XFMM TUSVDUVSFE BOE TVJUFE UP ZPVS UFNQFS
BNFOU XJMM CF BT FƵFDUJWF BT EPJOH UIF XPSL *G ZPV EP HFU UP
B MBUFS DIBQUFS BOE ƶOE ZPV EJE OPU VOEFSTUBOE B DPODFQU PS
TUSVDUVSF XFMM FOPVHI ZPV NBZ XBOU UP SFUVSO UP BO FBSMJFS
DIBQUFS BOE EP NPSF FYFSDJTFT VOUJM ZPV VOEFSTUBOE JU
8F CFMJFWF UIBU TQBDFE SFQFUJUJPO BOE JUFSBUJWF EFFQFOJOH
BSF FƵFDUJWF TUSBUFHJFT GPS MFBSOJOH BOE UIF TUSVDUVSF PG UIF
CPPL SFƷFDUT UIJT :PV NBZ OPUJDF XF NFOUJPO TPNFUIJOH
POMZ CSJFƷZ BU ƶSTU UIFO SFUVSO UP JU PWFS BOE PWFS "T ZPVS
FYQFSJFODF XJUI )BTLFMM EFFQFOT ZPV IBWF B CBTF GSPN XIJDI
$0/5&/54 YM

UP NPWF UP B EFFQFS MFWFM PG VOEFSTUBOEJOH 5SZ OPU UP XPSSZ


UIBU ZPV EPOƊU VOEFSTUBOE TPNFUIJOH DPNQMFUFMZ UIF ƶSTU UJNF
XF NFOUJPO JU #Z NPWJOH UISPVHI UIF FYFSDJTFT BOE SFUVSOJOH
UP DPODFQUT ZPV DBO EFWFMPQ B TPMJE JOUVJUJPO GPS GVODUJPOBM
QSPHSBNNJOH
5IF FYFSDJTFT JO UIF ƶSTU GFX DIBQUFST BSF EFTJHOFE UP SBQJEMZ
GBNJMJBSJ[F ZPV XJUI CBTJD )BTLFMM TZOUBY BOE UZQF TJHOBUVSFT
CVU ZPV TIPVME FYQFDU FYFSDJTFT UP HSPX NPSF DIBMMFOHJOH
JO FBDI TVDDFTTJWF DIBQUFS 8IFSF QPTTJCMF SFBTPO UISPVHI
UIF DPEF TBNQMFT BOE FYFSDJTFT JO ZPVS IFBE ƶSTU UIFO UZQF
UIFN PVU ƈ FJUIFS JOUP UIF 3&1- PS JOUP B TPVSDF ƶMF ƈ BOE
DIFDL UP TFF JG ZPV XFSF SJHIU 5IJT XJMM NBYJNJ[F ZPVS BCJMJUZ
UP VOEFSTUBOE BOE SFBTPO BCPVU QSPHSBNT BOE BCPVU )BTLFMM
-BUFS FYFSDJTFT NBZ CF EJƸDVMU *G ZPV HFU TUVDL PO BO FYFSDJTF
GPS BO FYUFOEFE QFSJPE PG UJNF QSPDFFE BOE SFUVSO UP JU BU B
MBUFS EBUF
8F DPWFS B NJY PG QSBDUJDBM BOE BCTUSBDU NBUUFST SFRVJSFE
UP VTF )BTLFMM GPS B XJEF WBSJFUZ PG QSPKFDUT $ISJTƊT FYQFSJFODF
JT QSJODJQBMMZ XJUI QSPEVDUJPO CBDLFOE TZTUFNT BOE GSPOUFOE
XFC BQQMJDBUJPOT +VMJF JT B MJOHVJTU BOE UFBDIFS CZ USBJOJOH
BOE FEVDBUJPO BOE MFBSOJOH )BTLFMM XBT IFS ƶSTU FYQFSJFODF
XJUI DPNQVUFS QSPHSBNNJOH 5IF FEVDBUJPOBM QSJPSJUJFT PG
UIJT CPPL BSF CJBTFE CZ UIPTF FYQFSJFODFT 0VS HPBM JT UP IFMQ

5IJT JT TIPSU GPS SFBEFWBMQSJOU MPPQ BO JOUFSBDUJWF QSPHSBNNJOH TIFMM UIBU FWBMVBUFT
FYQSFTTJPOT BOE SFUVSOT SFTVMUT JO UIF TBNF FOWJSPONFOU 5IF 3&1- XFƊMM CF VTJOH JT
DBMMFE ()$J ƈ ƉJƊ GPS ƌJOUFSBDUJWFƍ
$0/5&/54 YMJ

ZPV OPU KVTU XSJUF UZQFTBGF GVODUJPOBM DPEF CVU UP VOEFSTUBOE


JU PO B EFFQ FOPVHI MFWFM UIBU ZPV DBO HP GSPN IFSF UP NPSF
BEWBODFE )BTLFMM QSPKFDUT JO B WBSJFUZ PG XBZT EFQFOEJOH PO
ZPVS PXO JOUFSFTUT BOE QSJPSJUJFT
&BDI DIBQUFS GPDVTFT PO EJƵFSFOU BTQFDUT PG B QBSUJDVMBS
UPQJD 8F TUBSU XJUI B TIPSU JOUSPEVDUJPO UP UIF MBNCEB DBMDV
MVT 8IBU EPFT UIJT IBWF UP EP XJUI QSPHSBNNJOH "MM NPEFSO
GVODUJPOBM MBOHVBHFT BSF CBTFE PO UIF MBNCEB DBMDVMVT BOE B
QBTTJOH GBNJMJBSJUZ XJUI JU XJMM IFMQ ZPV EPXO UIF SPBE XJUI
)BTLFMM *G ZPVƊWF VOEFSTUPPE UIF MBNCEB DBMDVMVT VOEFS
TUBOEJOH UIF GFBUVSF LOPXO BT DVSSZJOH XJMM CF B CSFF[F GPS
FYBNQMF
5IF OFYU GFX DIBQUFST DPWFS CBTJD FYQSFTTJPOT BOE GVODUJPOT
JO )BTLFMM TPNF TJNQMF PQFSBUJPOT XJUI TUSJOHT UFYU
BOE B GFX
FTTFOUJBM UZQFT :PV NBZ GFFM B TUSPOH UFNQUBUJPO FTQFDJBMMZ JG
ZPV IBWF QSPHSBNNFE QSFWJPVTMZ UP TLJN PS TLJQ UIPTF ƶSTU
DIBQUFST 1MFBTF EP OPU EP UIJT &WFO JG UIPTF ƶSTU DIBQUFST BSF
DPWFSJOH DPODFQUT ZPVƊSF GBNJMJBS XJUI JUƊT JNQPSUBOU UP TQFOE
UJNF HFUUJOH DPNGPSUBCMF XJUI )BTLFMMƊT UFSTF TZOUBY NBLJOH
TVSF ZPV VOEFSTUBOE UIF EJƵFSFODF CFUXFFO XPSLJOH JO UIF
3&1- BOE XPSLJOH JO TPVSDF ƶMFT BOE CFDPNJOH GBNJMJBS XJUI
UIF DPNQJMFSƊT TPNFUJNFT RVJSLZ FSSPS NFTTBHFT $FSUBJOMZ
ZPV NBZ XPSL RVJDLMZ UISPVHI UIPTF DIBQUFST ƈ KVTU EPOƊU
TLJQ UIFN
'SPN UIFSF XF CVJME CPUI PVUXBSE BOE VQXBSE TP UIBU ZPVS
VOEFSTUBOEJOH PG )BTLFMM CPUI CSPBEFOT BOE EFFQFOT 8IFO
$0/5&/54 YMJJ

ZPV ƶOJTI UIJT CPPL ZPV XJMM OPU KVTU LOPX XIBU NPOBET
BSF ZPV XJMM LOPX IPX UP VTF UIFN FƵFDUJWFMZ JO ZPVS PXO
QSPHSBNT BOE VOEFSTUBOE UIF VOEFSMZJOH BMHFCSB JOWPMWFE
8F QSPNJTF ƈ ZPV XJMM 8F POMZ BTL UIBU ZPV EP OPU HP PO UP
XSJUF B NPOBE UVUPSJBM PO ZPVS CMPH UIBU FYQMBJOT IPX NPOBET
BSF SFBMMZ KVTU MJLF KBMBQFOP QPQQFST
*O FBDI DIBQUFS ZPV DBO FYQFDU

Ƒ BEEJUJPOT UP ZPVS WPDBCVMBSZ PG TUBOEBSE GVODUJPOT

Ƒ TZOUBDUJD QBUUFSOT UIBU CVJME PO FBDI PUIFS

Ƒ UIFPSFUJDBM GPVOEBUJPOT TP ZPV VOEFSTUBOE IPX )BTLFMM


XPSLT

Ƒ JMMVTUSBUJWF FYBNQMFT PG IPX UP SFBE )BTLFMM DPEF

Ƒ TUFQCZTUFQ EFNPOTUSBUJPOT PG IPX UP XSJUF ZPVS PXO


GVODUJPOT

Ƒ FYQMBOBUJPOT PG IPX UP SFBE DPNNPO FSSPS NFTTBHFT BOE


IPX UP BWPJE UIPTF FSSPST

Ƒ FYFSDJTFT PG WBSZJOH EJƸDVMUZ TQSJOLMFE UISPVHIPVU

Ƒ EFƶOJUJPOT PG JNQPSUBOU UFSNT

8F IBWF QVU EFƶOJUJPOT BU UIF FOE PG NPTU DIBQUFST &BDI


UFSN JT PG DPVSTF EFƶOFE XJUIJO UIF CPEZ PG UIF DIBQUFS CVU
$0/5&/54 YMJJJ

XF BEEFE TFQBSBUF EFƶOJUJPOT BU UIF FOE BT B QPJOU PG SFWJFX


*G ZPVƊWF UBLFO TPNF UJNF PƵ CFUXFFO POF DIBQUFS BOE UIF
OFYU UIF EFƶOJUJPOT DBO SFNJOE ZPV PG XIBU ZPV IBWF BMSFBEZ
MFBSOFE BOE PG DPVSTF UIFZ NBZ CF SFGFSSFE UP BOZ UJNF ZPV
OFFE B SFGSFTIFS
5IFSF BSF BMTP SFDPNNFOEBUJPOT BU UIF FOE PG NPTU DIBQ
UFST GPS GPMMPXVQ SFBEJOH 5IFZ BSF DFSUBJOMZ OPU SFRVJSFE CVU
BSF SFTPVSDFT XF QFSTPOBMMZ GPVOE BDDFTTJCMF BOE IFMQGVM UIBU
NBZ IFMQ ZPV MFBSO NPSF BCPVU UPQJDT DPWFSFE JO UIF DIBQUFS

#FTU QSBDUJDFT GPS FYBNQMFT BOE FYFSDJTFT


8F IBWF USJFE UP JODMVEF B WBSJFUZ PG FYBNQMFT BOE FYFSDJTFT JO
FBDI DIBQUFS 8IJMF XF IBWF NBEF FWFSZ FƵPSU UP JODMVEF POMZ
FYFSDJTFT UIBU TFSWF B DMFBS QFEBHPHJDBM QVSQPTF XF SFDPHOJ[F
UIBU OPU BMM JOEJWJEVBMT FOKPZ PS MFBSO BT NVDI GSPN FWFSZ
UZQF PG EFNPOTUSBUJPO PS FYFSDJTF "MTP TJODF PVS SFBEFST
XJMM OFDFTTBSJMZ DPNF UP UIF CPPL XJUI EJƵFSFOU CBDLHSPVOET
TPNF FYFSDJTFT NBZ TFFN UPP FBTZ PS EJƸDVMU UP ZPV CVU CF
KVTU SJHIU GPS TPNFPOF FMTF %P ZPVS CFTU UP XPSL UISPVHI
BT NBOZ FYFSDJTFT BT TFFNT QSBDUJDBM GPS ZPV #VU JG ZPV TLJQ
BMM UIF UZQFT BOE UZQFDMBTTFT FYFSDJTFT BOE UIFO ƶOE ZPVSTFMG
DPOGVTFE XIFO XF HFU UP .POPJE CZ BMM NFBOT DPNF CBDL
BOE EP NPSF FYFSDJTFT VOUJM ZPV VOEFSTUBOE
)FSF BSF B GFX UIJOHT UP LFFQ JO NJOE UP HFU UIF NPTU PVU
PG UIFN
$0/5&/54 YMJW

Ƒ &YBNQMFT BSF VTVBMMZ EFTJHOFE UP EFNPOTUSBUF XJUI SFBM


DPEF XIBU XFƊWF KVTU UBMLFE PS BSF BCPVU UP UBML BCPVU JO
GVSUIFS EFUBJM

Ƒ :PV BSF JOUFOEFE UP UZQF BMM PG UIF FYBNQMFT JOUP UIF 3&1-
PS B ƶMF BOE MPBE UIFN 8F TUSPOHMZ FODPVSBHF ZPV UP
BUUFNQU UP NPEJGZ UIF FYBNQMF BOE QMBZ XJUI UIF DPEF BG
UFS ZPVƊWF NBEF JU XPSL 'PSNJOH IZQPUIFTFT BCPVU XIBU
FƵFDU DIBOHFT XJMM IBWF BOE WFSJGZJOH UIFN JT DSJUJDBM *U
JT CFUUFS UP UZQF UIF DPEF FYBNQMFT BOE FYFSDJTFT ZPVSTFMG
SBUIFS UIBO DPQZ BOE QBTUF CFDBVTF UZQJOH NBLFT ZPV QBZ
NPSF BUUFOUJPO UP JU

Ƒ 4PNFUJNFT UIF FYBNQMFT BSF EFTJHOFE JOUFOUJPOBMMZ UP CF


CSPLFO $IFDL TVSSPVOEJOH QSPTF JG ZPVƊSF DPOGVTFE CZ
BO VOFYQFDUFE FSSPS BT XF XJMM OPU TIPX ZPV DPEF UIBU
EPFTOƊU XPSL XJUIPVU DPNNFOUJOH PO UIF CSFBLBHF *G JUƊT
TUJMM CSPLFO BOE JUƊT OPU TVQQPTFE UP CF ZPV TIPVME TUBSU
DIFDLJOH ZPVS TZOUBY BOE GPSNBUUJOH GPS FSSPST

Ƒ /PU FWFSZ FYBNQMF JT EFTJHOFE UP CF FOUFSFE JOUP UIF


3&1- OPU FWFSZ FYBNQMF JT EFTJHOFE UP CF FOUFSFE JOUP
B ƶMF 0ODF XF IBWF FYQMBJOFE UIF TZOUBDUJD EJƵFSFODFT
CFUXFFO ƶMFT BOE 3&1- FYQSFTTJPOT ZPV BSF FYQFDUFE UP
QFSGPSN UIF USBOTMBUJPO CFUXFFO UIF UXP ZPVSTFMG :PV
TIPVME CF BDDVTUPNFE UP XPSLJOH XJUI DPEF JO BO JOUFSBD
UJWF NBOOFS CZ UIF UJNF ZPV ƶOJTI UIF CPPL :PVƊMM XBOU
$0/5&/54 YMW

UP HSBEVBMMZ NPWF BXBZ GSPN UZQJOH DPEF FYBNQMFT BOE


FYFSDJTFT FYDFQU JO MJNJUFE DBTFT EJSFDUMZ JOUP ()$J BOE
EFWFMPQ UIF IBCJU PG XPSLJOH JO TPVSDF ƶMFT &EJUJOH BOE
NPEJGZJOH DPEF BT ZPV XJMM CF EPJOH B MPU BT ZPV SFXPSL
FYFSDJTFT JT FBTJFS BOE NPSF QSBDUJDBM JO B TPVSDF ƶMF :PV
XJMM TUJMM MPBE ZPVS DPEF JOUP ()$J UP SVO JU

Ƒ :PV NBZ XBOU UP LFFQ FYFSDJTFT FTQFDJBMMZ MPOHFS POFT BT


OBNFE NPEVMFT 5IFSF BSF TFWFSBM FYFSDJTFT FTQFDJBMMZ
MBUFS JO UIF CPPL UIBU XF SFUVSO UP TFWFSBM UJNFT BOE CFJOH
BCMF UP SFMPBE UIF XPSL ZPVƊWF BMSFBEZ EPOF BOE BEE POMZ
UIF OFX QBSUT XJMM TBWF ZPV B MPU PG UJNF BOE HSJFG 8F
IBWF USJFE UP OPUF TPNF PG UIF FYFSDJTFT XIFSF UIJT XJMM
CF FTQFDJBMMZ IFMQGVM

Ƒ &YFSDJTFT BU UIF FOE PG UIF DIBQUFS NBZ JODMVEF TPNF SF


WJFX RVFTUJPOT DPWFSJOH NBUFSJBM GSPN QSFWJPVT DIBQUFST
BOE BSF NPSF PS MFTT PSEFSFE GSPN MFBTU UP NPTU DIBMMFOH
JOH :PVS NJMFBHF NBZ WBSZ

Ƒ &WFO FYFSDJTFT UIBU TFFN FBTZ DBO JODSFBTF ZPVS ƷVFODZ


JO B UPQJD 8F EP OPU GFUJTIJ[F EJƸDVMUZ GPS EJƸDVMUZƊT
TBLF 8F KVTU XBOU ZPV UP VOEFSTUBOE UIF UPQJDT BT XFMM
BT QPTTJCMF 5IBU DBO NFBO DPNJOH BU UIF TBNF QSPCMFN
GSPN EJƵFSFOU BOHMFT

Ƒ 8F BTL ZPV UP XSJUF BOE UIFO SFXSJUF VTJOH EJƵFSFOU


TZOUBY
B MPU PG GVODUJPOT 'FX QSPCMFNT IBWF POMZ POF
$0/5&/54 YMWJ

QPTTJCMF TPMVUJPO BOE TPMWJOH UIF TBNF QSPCMFN JO EJG


GFSFOU XBZT JODSFBTFT ZPVS ƷVFODZ BOE DPNGPSU XJUI UIF
XBZ )BTLFMM XPSLT JUT TZOUBY JUT TFNBOUJDT BOE JO TPNF
DBTFT JUT FWBMVBUJPO PSEFS


Ƒ %P OPU GFFM PCMJHBUFE UP EP BMM UIF FYFSDJTFT JO B TJOHMF


TJUUJOH PS FWFO JO B ƶSTU QBTT UISPVHI UIF DIBQUFS *O GBDU
TQBDFE SFQFUJUJPO JT HFOFSBMMZ B NPSF FƵFDUJWF TUSBUFHZ

Ƒ 4PNF FYFSDJTFT QBSUJDVMBSMZ JO UIF FBSMJFS DIBQUFST NBZ


TFFN WFSZ DPOUSJWFE 8FMM UIFZ BSF #VU UIFZ BSF DPO
USJWFE UP QJOQPJOU DFSUBJO MFTTPOT "T UIF CPPL HPFT PO
BOE ZPV IBWF NPSF )BTLFMM VOEFS ZPVS CFMU UIF FYFSDJTFT
CFDPNF MFTT DPOUSJWFE BOE NPSF MJLF ƌSFBM )BTLFMMƍ

Ƒ "OPUIFS CFOFƶU UP XSJUJOH DPEF JO B TPVSDF ƶMF BOE UIFO


MPBEJOH JU JOUP UIF 3&1- JT UIBU ZPV DBO XSJUF DPNNFOUT
BCPVU UIF QSPDFTT ZPV XFOU UISPVHI JO TPMWJOH B QSPCMFN
8SJUJOH PVU ZPVS PXO UIPVHIU QSPDFTT DBO DMBSJGZ ZPVS
UIPVHIUT BOE NBLF UIF TPMWJOH PG TJNJMBS QSPCMFNT FBTJFS
"U UIF WFSZ MFBTU ZPV DBO SFGFS CBDL UP ZPVS DPNNFOUT
BOE MFBSO GSPN ZPVSTFMG

Ƒ 4PNFUJNFT XF JOUFOUJPOBMMZ VOEFSTQFDJGZ GVODUJPO EFG


JOJUJPOT :PVƊMM DPNNPOMZ TFF UIJOHT MJLF

f = undefined
$0/5&/54 YMWJJ

&WFO XIFO ԕ XJMM QSPCBCMZ UBLF OBNFE BSHVNFOUT JO ZPVS


JNQMFNFOUBUJPO XFƊSF OPU HPJOH UP OBNF UIFN GPS ZPV
/PCPEZ XJMM TDBƵPME ZPVS DPEF GPS ZPV JO ZPVS GVUVSF
QSPKFDUT TP EPOƊU FYQFDU UIJT CPPL UP FJUIFS
$IBQUFS 

"MM :PV /FFE JT -BNCEB

&WFO UIF HSFBUFTU


NBUIFNBUJDJBOT UIF POFT
UIBU XF XPVME QVU JOUP
PVS NZUIPMPHZ PG HSFBU
NBUIFNBUJDJBOT IBE UP
EP B HSFBU EFBM PG MFH
XPSL JO PSEFS UP HFU UP
UIF TPMVUJPO JO UIF FOE

%BOJFM 5BNNFUU


$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 "MM :PV /FFE JT -BNCEB


5IJT DIBQUFS QSPWJEFT B WFSZ CSJFG JOUSPEVDUJPO UP UIF MBNCEB
DBMDVMVT B NPEFM PG DPNQVUBUJPO EFWJTFE JO UIF T CZ
"MPO[P $IVSDI " DBMDVMVT JT B NFUIPE PG DBMDVMBUJPO PS SFB
TPOJOH UIF MBNCEB DBMDVMVT JT POF QSPDFTT GPS GPSNBMJ[JOH B
NFUIPE -JLF 5VSJOH NBDIJOFT UIF MBNCEB DBMDVMVT GPSNBM
J[FT UIF DPODFQU PG FƵFDUJWF DPNQVUBCJMJUZ UIVT EFUFSNJOJOH
XIJDI QSPCMFNT PS DMBTTFT PG QSPCMFNT DBO CF TPMWFE
:PV NBZ CF XPOEFSJOH XIFSF UIF )BTLFMM JT :PV NBZ CF
DPOUFNQMBUJOH TLJQQJOH UIJT DIBQUFS :PV NBZ GFFM UFNQUFE
UP TLJQ BIFBE UP UIF GVO TUVƵ XIFO XF CVJME B QSPKFDU
%0/Ɗ5
8FƊSF TUBSUJOH GSPN ƶSTU QSJODJQMFT IFSF TP UIBU XIFO XF
HFU BSPVOE UP CVJMEJOH QSPKFDUT ZPV LOPX XIBU ZPVƊSF EPJOH
:PV EPOƊU TUBSU CVJMEJOH B IPVTF GSPN UIF BUUJD EPXO ZPV TUBSU
GSPN UIF GPVOEBUJPO -BNCEB DBMDVMVT JT ZPVS GPVOEBUJPO
CFDBVTF )BTLFMM JT CVJMU PO JU

 8IBU JT GVODUJPOBM QSPHSBNNJOH


'VODUJPOBM QSPHSBNNJOH JT B DPNQVUFS QSPHSBNNJOH QBSBEJHN
UIBU SFMJFT PO GVODUJPOT NPEFMFE PO NBUIFNBUJDBM GVODUJPOT
5IF FTTFODF PG GVODUJPOBM QSPHSBNNJOH JT UIBU QSPHSBNT BSF
B DPNCJOBUJPO PG FYQSFTTJPOT &YQSFTTJPOT JODMVEF DPODSFUF
WBMVFT WBSJBCMFT BOE BMTP GVODUJPOT 'VODUJPOT IBWF B NPSF
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

TQFDJƶD EFƶOJUJPO UIFZ BSF FYQSFTTJPOT UIBU BSF BQQMJFE UP


BO BSHVNFOU PS JOQVU BOE PODF BQQMJFE DBO CF SFEVDFE PS
FWBMVBUFE *O )BTLFMM BOE JO GVODUJPOBM QSPHSBNNJOH NPSF
HFOFSBMMZ GVODUJPOT BSF ƶSTUDMBTT UIFZ DBO CF VTFE BT WBMVFT
PS QBTTFE BT BSHVNFOUT PS JOQVUT UP ZFU NPSF GVODUJPOT 8FƊMM
EFƶOF UIFTF UFSNT NPSF DBSFGVMMZ BT XF QSPHSFTT UISPVHI UIF
DIBQUFS
'VODUJPOBM QSPHSBNNJOH MBOHVBHFT BSF BMM CBTFE PO UIF
MBNCEB DBMDVMVT 4PNF MBOHVBHFT JO UIJT HFOFSBM DBUFHPSZ
JODPSQPSBUF GFBUVSFT JOUP UIF MBOHVBHF UIBU BSFOƊU USBOTMBUBCMF
JOUP MBNCEB FYQSFTTJPOT )BTLFMM JT B QVSF GVODUJPOBM MBOHVBHF
CFDBVTF JU EPFT OPU 8FƊMM BEESFTT UIJT OPUJPO PG QVSJUZ NPSF
MBUFS JO UIF CPPL CVU JU JTOƊU B KVEHNFOU PG UIF NPSBM XPSUI PG
PUIFS MBOHVBHFT
5IF XPSE QVSJUZ JO GVODUJPOBM QSPHSBNNJOH JT TPNFUJNFT
BMTP VTFE UP NFBO XIBU JT NPSF QSPQFSMZ DBMMFE SFGFSFOUJBM
USBOTQBSFODZ 3FGFSFOUJBM USBOTQBSFODZ NFBOT UIBU UIF TBNF
GVODUJPO HJWFO UIF TBNF WBMVFT UP FWBMVBUF XJMM BMXBZT SFUVSO
UIF TBNF SFTVMU JO QVSF GVODUJPOBM QSPHSBNNJOH BT UIFZ EP
JO NBUI
)BTLFMMƊT QVSF GVODUJPOBM CBTJT BMTP MFOET JU B IJHI EFHSFF
PG BCTUSBDUJPO BOE DPNQPTBCJMJUZ "CTUSBDUJPO BMMPXT ZPV UP
XSJUF TIPSUFS NPSF DPODJTF QSPHSBNT CZ GBDUPSJOH DPNNPO
SFQFBUFE TUSVDUVSFT JOUP NPSF HFOFSJD DPEF UIBU DBO CF SFVTFE
)BTLFMM QSPHSBNT BSF CVJMU GSPN TFQBSBUF JOEFQFOEFOU GVOD
UJPOT LJOE PG MJLF -&(0n  UIF GVODUJPOT BSF CSJDLT UIBU DBO CF
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

BTTFNCMFE BOE SFBTTFNCMFE


5IFTF GFBUVSFT BMTP NBLF )BTLFMMƊT TZOUBY SBUIFS NJOJNBMJTU
BT ZPVƊMM TPPO TFF

 8IBU JT B GVODUJPO


*G XF TUFQ CBDL GSPN VTJOH UIF XPSE ƌMBNCEB ƍ ZPV NPTU MJLFMZ
BMSFBEZ LOPX XIBU B GVODUJPO JT " GVODUJPO JT B SFMBUJPO CF
UXFFO B TFU PG QPTTJCMF JOQVUT BOE B TFU PG QPTTJCMF PVUQVUT 5IF
GVODUJPO JUTFMG EFƶOFT BOE SFQSFTFOUT UIF SFMBUJPOTIJQ 8IFO
ZPV BQQMZ B GVODUJPO TVDI BT BEEJUJPO UP UXP JOQVUT JU NBQT
UIPTF UXP JOQVUT UP BO PVUQVU ƈ UIF TVN PG UIPTF OVNCFST
'PS FYBNQMF MFUƊT JNBHJOF B GVODUJPO OBNFE ԕ UIBU EFƶOFT
UIF GPMMPXJOH SFMBUJPOT XIFSF UIF ƶSTU WBMVF JT UIF JOQVU BOE
UIF TFDPOE JT UIF PVUQVU

ԕ 
 Ӷ
ԕ 
 ӷ
ԕ 
 Ӹ

5IF JOQVU TFU JT \  ^ BOE UIF PVUQVU TFU JT \Ӷ ӷ Ӹ^ "


DSVDJBM QPJOU BCPVU IPX UIFTF SFMBUJPOT BSF EFƶOFE PVS IZQP
UIFUJDBM GVODUJPO XJMM BMXBZT SFUVSO UIF WBMVF Ӷ HJWFO UIF JOQVU
 ƈ OP FYDFQUJPOT

'PS UIPTF XIP XPVME MJLF QSFDJTF UFSNJOPMPHZ UIF JOQVU TFU JT LOPXO BT UIF EPNBJO
" TFU PG VOJRVF WBMVFT UIBU BSF QPTTJCMF PVUQVUT GPS UIF GVODUJPO JT DBMMFE UIF DPEPNBJO
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

*O DPOUSBTU UIF GPMMPXJOH JT OPU B WBMJE GVODUJPO

ԕ 
 ԍ
ԕ 
 Ԏ
ԕ 
 ԏ
5IJT HFUT CBDL UP UIF SFGFSFOUJBM USBOTQBSFODZ XF NFOUJPOFE
FBSMJFS HJWFO UIF TBNF JOQVU UIF PVUQVU TIPVME CF QSFEJDUBCMF
*T UIF GPMMPXJOH GVODUJPO WBMJE

ԕ 
 Ӷ
ԕ 
 Ӷ
ԕ 
 Ӷ
:FT IBWJOH UIF TBNF PVUQVU GPS NPSF UIBO POF JOQVU JT
WBMJE *NBHJOF GPS FYBNQMF UIBU ZPV OFFE B GVODUJPO UIBU
UFTUT B WBMVF GPS CFJOH MFTT UIBO  :PVƊE XBOU JU UP SFUVSO True
XIFO UIF JOQVU XBT MFTT UIBO  BOE False GPS BMM PUIFS DBTFT
*O UIBU DBTF TFWFSBM EJƵFSFOU JOQVUT XJMM SFTVMU JO UIF PVUQVU
True NBOZ NPSF XJMM HJWF B SFTVMU PG False %JƵFSFOU JOQVUT
DBO MFBE UP UIF TBNF PVUQVU
8IBU NBUUFST IFSF JT UIBU UIF SFMBUJPOTIJQ PG JOQVUT BOE
PVUQVUT JT EFƶOFE CZ UIF GVODUJPO BOE UIBU UIF PVUQVU JT QSF
EJDUBCMF XIFO ZPV LOPX UIF JOQVU BOE UIF GVODUJPO EFƶOJUJPO
5IF TFU PG BMM QPTTJCMF PVUQVUT SFMBUFE UP EJƵFSFOU JOQVUT JT UIF SBOHF "MM EPNBJOT BOE
DPEPNBJOT BSF TFUT PG VOJRVF WBMVFT 3BOHFT BSF TFUT PG WBMVFT CVU UIF WBMVFT JO SBOHF
TFUT OFFE OPU CF VOJRVF BOE JO QSBDUJDF WFSZ PǒFO BSF OPU VOJRVF UIBU JT UIF TBNF WBMVF
DBO BQQFBS NVMUJQMF UJNFT JO UIBU TFU &WFSZ WBMVF JO B SBOHF NVTU CF B NFNCFS PG UIF
GVODUJPOƊT DPEPNBJO
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

*O UIF BCPWF FYBNQMFT XF EJEOƊU EFNPOTUSBUF B SFMBUJPOTIJQ


CFUXFFO UIF JOQVUT BOE PVUQVUT -FUƊT MPPL BU BO FYBNQMF UIBU
EPFT EFƶOF UIF SFMBUJPOTIJQ 5IJT GVODUJPO JT BHBJO OBNFE ԕ

ԕ ԧ
 ԧ 
5IJT GVODUJPO UBLFT POF BSHVNFOU XIJDI XF IBWF OBNFE
ԧ 5IF SFMBUJPOTIJQ CFUXFFO UIF JOQVU ԧ BOE UIF PVUQVU JT
EFTDSJCFE JO UIF GVODUJPO CPEZ *U XJMM BEE  UP XIBUFWFS WBMVF
ԧ JT BOE SFUVSO UIBU SFTVMU 8IFO XF BQQMZ UIJT GVODUJPO UP B
WBMVF TVDI BT  XF TVCTUJUVUF UIF WBMVF JO GPS ԧ

ԕ 
  
ԕ BQQMJFE UP  FRVBMT   5IBU UFMMT VT IPX UP NBQ UIF JOQVU
UP BO PVUQVU  BEEFE UP  CFDPNFT 

ԕ 
 
6OEFSTUBOEJOH GVODUJPOT JO UIJT XBZ ƈ BT B NBQQJOH PG B
TFU PG JOQVUT UP B TFU PG PVUQVUT ƈ JT DSVDJBM UP VOEFSTUBOEJOH
GVODUJPOBM QSPHSBNNJOH

 5IF TUSVDUVSF PG MBNCEB UFSNT


5IF MBNCEB DBMDVMVT IBT UISFF CBTJD DPNQPOFOUT PS MBNCEB
UFSNT FYQSFTTJPOT WBSJBCMFT BOE BCTUSBDUJPOT 5IF XPSE FY
QSFTTJPO SFGFST UP B TVQFSTFU PG BMM UIPTF UIJOHT BO FYQSFTTJPO
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

DBO CF B WBSJBCMF OBNF BO BCTUSBDUJPO PS B DPNCJOBUJPO PG


UIPTF UIJOHT 5IF TJNQMFTU FYQSFTTJPO JT B TJOHMF WBSJBCMF 7BSJ
BCMFT IFSF IBWF OP NFBOJOH PS WBMVF UIFZ BSF KVTU OBNFT GPS
QPUFOUJBM JOQVUT UP GVODUJPOT
"O BCTUSBDUJPO JT B GVODUJPO *U JT B MBNCEB UFSN UIBU IBT B
IFBE B MBNCEB
BOE B CPEZ BOE JT BQQMJFE UP BO BSHVNFOU "O
BSHVNFOU JT BO JOQVU WBMVF
"CTUSBDUJPOT DPOTJTU PG UXP QBSUT UIF IFBE BOE UIF CPEZ
5IF IFBE PG UIF GVODUJPO JT B ᅶ MBNCEB
GPMMPXFE CZ B WBSJBCMF
OBNF 5IF CPEZ PG UIF GVODUJPO JT BOPUIFS FYQSFTTJPO 4P B
TJNQMF GVODUJPO NJHIU MPPL MJLF UIJT

ᅶԧԧ
5IF WBSJBCMF OBNFE JO UIF IFBE JT UIF QBSBNFUFS BOE CJOET
BMM JOTUBODFT PG UIBU TBNF WBSJBCMF JO UIF CPEZ PG UIF GVODUJPO
5IBU NFBOT XIFO XF BQQMZ UIJT GVODUJPO UP BO BSHVNFOU
FBDI ԧ JO UIF CPEZ PG UIF GVODUJPO XJMM IBWF UIF WBMVF PG UIBU
BSHVNFOU 8FƊMM EFNPOTUSBUF UIJT JO UIF OFYU TFDUJPO
*O UIF QSFWJPVT TFDUJPO XF XFSF UBMLJOH BCPVU GVODUJPOT
DBMMFE ԕ CVU UIF MBNCEB BCTUSBDUJPO ᅶԧԧ IBT OP OBNF *U JT BO
BOPOZNPVT GVODUJPO " OBNFE GVODUJPO DBO CF DBMMFE CZ OBNF
CZ BOPUIFS GVODUJPO BO BOPOZNPVT GVODUJPO DBOOPU
-FUƊT CSFBL EPXO UIF CBTJD TUSVDUVSF

λ x . x
^─┬─^
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

└────── the extent of the head of the lambda.

λ x . x
^────── the single parameter of the function. This
binds any variables with the same name
in the body of the function.

λ x . x
^── body, the expression the lambda returns
when applied. This is a bound variable.

5IF EPU .
TFQBSBUFT UIF QBSBNFUFST PG UIF MBNCEB GSPN
UIF GVODUJPO CPEZ
5IF BCTUSBDUJPO BT B XIPMF IBT OP OBNF CVU UIF SFBTPO
XF DBMM JU BO BCTUSBDUJPO JT UIBU JU JT B HFOFSBMJ[BUJPO PS BCTUSBD
UJPO GSPN B DPODSFUF JOTUBODF PG B QSPCMFN BOE JU BCTUSBDUT
UISPVHI UIF JOUSPEVDUJPO PG OBNFT 5IF OBNFT TUBOE GPS DPO
DSFUF WBMVFT CVU CZ VTJOH OBNFE WBSJBCMFT XF BMMPX GPS UIF
QPTTJCJMJUZ PG BQQMZJOH UIF HFOFSBM GVODUJPO UP EJƵFSFOU WBMVFT
PS QFSIBQT FWFO WBMVFT PG EJƵFSFOU UZQFT BT XFƊMM TFF MBUFS

8IFO XF BQQMZ UIF BCTUSBDUJPO UP BSHVNFOUT XF SFQMBDF UIF
OBNFT XJUI WBMVFT NBLJOH JU DPODSFUF
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

"MQIB FRVJWBMFODF
0ǒFO XIFO QFPQMF FYQSFTT UIJT GVODUJPO JO MBNCEB DBMDVMVT
ZPVƊMM TFF TPNFUIJOH MJLF

ᅶԧԧ
5IF WBSJBCMF ԧ IFSF JT OPU TFNBOUJDBMMZ NFBOJOHGVM FYDFQU JO
JUT SPMF JO UIBU TJOHMF FYQSFTTJPO #FDBVTF PG UIJT UIFSFƊT B GPSN
PG FRVJWBMFODF CFUXFFO MBNCEB UFSNT DBMMFE BMQIB FRVJWBMFODF
5IJT JT B XBZ PG TBZJOH UIBU

ᅶԧԧ
ᅶԓԓ
ᅶԩԩ

BMM NFBO UIF TBNF UIJOH 5IFZƊSF BMM UIF TBNF GVODUJPO
-FUƊT MPPL OFYU BU XIBU IBQQFOT XIFO XF BQQMZ UIJT BCTUSBD
UJPO UP B WBMVF

 #FUB SFEVDUJPO


8IFO XF BQQMZ B GVODUJPO UP BO BSHVNFOU XF TVCTUJUVUF UIF
JOQVU FYQSFTTJPO GPS BMM JOTUBODFT PG CPVOE WBSJBCMFT XJUIJO
UIF CPEZ PG UIF BCTUSBDUJPO :PV BMTP FMJNJOBUF UIF IFBE PG UIF
BCTUSBDUJPO TJODF JUT POMZ QVSQPTF XBT UP CJOE B WBSJBCMF 5IJT
QSPDFTT JT DBMMFE CFUB SFEVDUJPO
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

-FUƊT VTF UIF GVODUJPO XF IBE BCPWF

ᅶԧԧ
8FƊMM EP PVS ƶSTU CFUB SFEVDUJPO VTJOH B OVNCFS 8F BQQMZ
UIF GVODUJPO BCPWF UP  TVCTUJUVUF  GPS FBDI CPVOE WBSJBCMF
JO UIF CPEZ PG UIF GVODUJPO BOE FMJNJOBUF UIF IFBE

ᅶԧԧ



5IF POMZ CPVOE WBSJBCMF JT UIF TJOHMF ԧ TP BQQMZJOH UIJT


GVODUJPO UP  SFUVSOT  5IJT GVODUJPO JT UIF JEFOUJUZ GVODUJPO
"MM JU EPFT JT BDDFQU B TJOHMF BSHVNFOU ԧ BOE SFUVSO UIBU TBNF
BSHVNFOU 5IF ԧ IBT OP JOIFSFOU NFBOJOH CVU CFDBVTF JU
JT CPVOE JO UIF IFBE PG UIJT GVODUJPO XIFO UIF GVODUJPO JT
BQQMJFE UP BO BSHVNFOU BMM JOTUBODFT PG ԧ XJUIJO UIF GVODUJPO
CPEZ NVTU IBWF UIF TBNF WBMVF
-FUƊT VTF BO FYBNQMF UIBU NJYFT TPNF BSJUINFUJD JOUP PVS
MBNCEB DBMDVMVT 8F VTF UIF QBSFOUIFTFT IFSF UP DMBSJGZ UIBU
UIF CPEZ FYQSFTTJPO JT ԧ  *O PUIFS XPSET XF BSF OPU BQQMZJOH
UIF GVODUJPO UP UIF 

5IF MBNCEB DBMDVMVT DBO EFSJWF OVNCFST GSPN MBNCEB BCTUSBDUJPOT SBUIFS UIBO VTJOH
UIF OVNFSBMT XF BSF GBNJMJBS XJUI CVU UIF BQQMJDBUJPOT DBO CFDPNF RVJUF DVNCFSTPNF
BOE EJƸDVMU UP SFBE

/PUF UIBU UIJT JT UIF TBNF BT UIF JEFOUJUZ GVODUJPO JO NBUIFNBUJDBM OPUBUJPO ց ֓
 ֓
0OF EJƵFSFODF JT UIBU ց ֓
 ֓ JT B EFDMBSBUJPO JOWPMWJOH B GVODUJPO OBNFE ց XIJMF UIF
BCPWF MBNCEB BCTUSBDUJPO JT B GVODUJPO
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

ᅶԧԧ 

8IBU JT UIF SFTVMU JG XF BQQMZ UIJT BCTUSBDUJPO UP  )PX


BCPVU UP 
#FUB SFEVDUJPO JT UIJT QSPDFTT PG BQQMZJOH B MBNCEB UFSN
UP BO BSHVNFOU SFQMBDJOH UIF CPVOE WBSJBCMFT XJUI UIF WBMVF
PG UIF BSHVNFOU BOE FMJNJOBUJOH UIF IFBE &MJNJOBUJOH UIF
IFBE UFMMT ZPV UIF GVODUJPO IBT CFFO BQQMJFE
8F DBO BMTP BQQMZ PVS JEFOUJUZ GVODUJPO UP BOPUIFS MBNCEB
BCTUSBDUJPO

ᅶԧԧ
ᅶԨԨ

*O UIJT DBTF XFƊE TVCTUJUVUF UIF FOUJSF BCTUSBDUJPO JO GPS ԧ


8FƊMM VTF B OFX TZOUBY IFSF <ԧ ੃ ԩ> UP JOEJDBUF UIBU ԩ XJMM CF
TVCTUJUVUFE GPS BMM PDDVSSFODFT PG ԧ IFSF ԩ JT UIF GVODUJPO ᅶԨԨ

8F SFEVDF UIJT BQQMJDBUJPO MJLF UIJT

ᅶԧԧ
ᅶԨԨ

<ԧ ੃ ᅶԨԨ
>
ᅶԨԨ
0VS ƶOBM SFTVMU JT BOPUIFS JEFOUJUZ GVODUJPO 5IFSF JT OP
BSHVNFOU UP BQQMZ JU UP TP XF IBWF OPUIJOH UP SFEVDF
0ODF NPSF CVU UIJT UJNF XFƊMM BEE BOPUIFS BSHVNFOU

ᅶԧԧ
ᅶԨԨ
ԩ
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

"QQMJDBUJPOT JO UIF MBNCEB DBMDVMVT BSF MFǕ BTTPDJBUJWF 5IBU


JT VOMFTT TQFDJƶD QBSFOUIFTFT TVHHFTU PUIFSXJTF UIFZ BTTPDJBUF
PS HSPVQ UP UIF MFǒ 4P UIJT

ᅶԧԧ
ᅶԨԨ
ԩ
DBO CF SFXSJUUFO BT

ᅶԧԧ
ᅶԨԨ

ԩ
0OXBSE XJUI UIF SFEVDUJPO

ᅶԧԧ
ᅶԨԨ

ԩ
<ԧ ੃ ᅶԨԨ
>
ᅶԨԨ
ԩ
<Ԩ ੃ ԩ>
ԩ

8F DBOƊU SFEVDF UIJT BOZ GVSUIFS BT UIFSF JT OPUIJOH MFǒ UP


BQQMZ BOE XF LOPX OPUIJOH BCPVU ԩ
8FƊMM MPPL BU GVODUJPOT CFMPX UIBU IBWF NVMUJQMF IFBET BOE
BMTP GSFF WBSJBCMFT UIBU JT WBSJBCMFT JO UIF CPEZ UIBU BSF OPU
CPVOE CZ UIF IFBE
CVU UIF CBTJD QSPDFTT XJMM SFNBJO UIF TBNF
5IF QSPDFTT PG CFUB SFEVDUJPO TUPQT XIFO UIFSF BSF FJUIFS OP
NPSF IFBET PS MBNCEBT MFǒ UP BQQMZ PS OP NPSF BSHVNFOUT
UP BQQMZ GVODUJPOT UP " DPNQVUBUJPO UIFSFGPSF DPOTJTUT PG BO
JOJUJBM MBNCEB FYQSFTTJPO PS UXP JG ZPV XBOU UP TFQBSBUF UIF
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

GVODUJPO BOE JUT JOQVU


QMVT B ƶOJUF TFRVFODF PG MBNCEB UFSNT
FBDI EFEVDFE GSPN UIF QSFDFEJOH UFSN CZ POF BQQMJDBUJPO PG
CFUB SFEVDUJPO 8F LFFQ GPMMPXJOH UIF SVMFT PG BQQMJDBUJPO
TVCTUJUVUJOH BSHVNFOUT JO GPS CPVOE WBSJBCMFT VOUJM UIFSF BSF
OP NPSF IFBET MFǒ UP FWBMVBUF PS OP NPSF BSHVNFOUT UP BQQMZ
UIFN UP

'SFF WBSJBCMFT
5IF QVSQPTF PG UIF IFBE PG UIF GVODUJPO JT UP UFMM VT XIJDI
WBSJBCMFT UP SFQMBDF XIFO XF BQQMZ PVS GVODUJPO UIBU JT UP
CJOE UIF WBSJBCMFT " CPVOE WBSJBCMF NVTU IBWF UIF TBNF WBMVF
UISPVHIPVU UIF FYQSFTTJPO
#VU TPNFUJNFT UIF CPEZ FYQSFTTJPO IBT WBSJBCMFT UIBU BSF
OPU OBNFE JO UIF IFBE 8F DBMM UIPTF WBSJBCMFT GSFF WBSJBCMFT
*O UIF GPMMPXJOH FYQSFTTJPO

ᅶԧԧԨ
5IF ԧ JO UIF CPEZ JT B CPVOE WBSJBCMF CFDBVTF JU JT OBNFE JO
UIF IFBE PG UIF GVODUJPO XIJMF UIF Ԩ JT B GSFF WBSJBCMF CFDBVTF
JU JT OPU 8IFO XF BQQMZ UIJT GVODUJPO UP BO BSHVNFOU OPUIJOH
DBO CF EPOF XJUI UIF Ԩ *U SFNBJOT JSSFEVDJCMF
5IBU XIPMF BCTUSBDUJPO DBO CF BQQMJFE UP BO BSHVNFOU ԩ
MJLF UIJT ᅶԧԧԨ
ԩ 8FƊMM TIPX BO JOUFSNFEJBUF TUFQ VTJOH UIF
:= TZOUBY XF JOUSPEVDFE BCPWF UIBU NPTU MBNCEB DBMDVMVT
MJUFSBUVSF EPFT OPU TIPX
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 ᅶԧԧԨ
ԩ
8F BQQMZ UIF MBNCEB UP UIF BSHVNFOU ԩ

 ᅶ<ԧ ੃ ԩ>ԧԨ

4JODF ԧ JT UIF CPVOE WBSJBCMF BMM JOTUBODFT PG ԧ JO UIF CPEZ


PG UIF GVODUJPO XJMM CF SFQMBDFE XJUI ԩ 5IF IFBE XJMM CF
FMJNJOBUFE BOE XF SFQMBDF BOZ ԧ JO UIF CPEZ XJUI B ԩ

 ԩԨ
5IF IFBE IBT CFFO BQQMJFE BXBZ BOE UIFSF BSF OP NPSF
IFBET PS CPVOE WBSJBCMFT 4JODF XF LOPX OPUIJOH BCPVU
ԩ PS Ԩ XF DBO SFEVDF UIJT OP GVSUIFS

/PUF UIBU BMQIB FRVJWBMFODF EPFT OPU BQQMZ UP GSFF WBSJ


BCMFT 5IBU JT ᅶԧԧԩ BOE ᅶԧԧԨ BSF OPU FRVJWBMFOU CFDBVTF ԩ
BOE Ԩ NJHIU CF EJƵFSFOU UIJOHT )PXFWFS ᅶԧԨԨԧ BOE ᅶԐԑԑԐ
BSF FRVJWBMFOU EVF UP BMQIB FRVJWBMFODF BT BSF ᅶԧԧԩ BOE ᅶԨԨԩ
CFDBVTF UIF GSFF WBSJBCMF JT MFǒ BMPOF

 .VMUJQMF BSHVNFOUT


&BDI MBNCEB DBO POMZ CJOE POF QBSBNFUFS BOE DBO POMZ BDDFQU
POF BSHVNFOU 'VODUJPOT UIBU SFRVJSF NVMUJQMF BSHVNFOUT
IBWF NVMUJQMF OFTUFE IFBET 8IFO ZPV BQQMZ JU PODF BOE
FMJNJOBUF UIF ƶSTU MFǒNPTU
IFBE UIF OFYU POF JT BQQMJFE BOE
TP PO 5IJT GPSNVMBUJPO XBT PSJHJOBMMZ EJTDPWFSFE CZ .PTFT
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

4DI¶OƶOLFM JO UIF T CVU XBT MBUFS SFEJTDPWFSFE BOE OBNFE


BǒFS )BTLFMM $VSSZ BOE JT DPNNPOMZ DBMMFE DVSSZJOH
8IBU XF NFBO CZ UIJT EFTDSJQUJPO JT UIBU UIF GPMMPXJOH

ᅶԧԨԧԨ
JT B DPOWFOJFOU TIPSUIBOE GPS UXP OFTUFE MBNCEBT POF GPS
FBDI BSHVNFOU ԧ BOE Ԩ


ᅶԧ ᅶԨԧԨ

8IFO ZPV BQQMZ UIF ƶSTU BSHVNFOU ZPVƊSF CJOEJOH ԧ FMJNJ


OBUJOH UIF PVUFS MBNCEB BOE IBWF ᅶԨԧԨ XJUI Y CFJOH XIBUFWFS
UIF PVUFS MBNCEB XBT CPVOE UP
5P USZ UP NBLF UIJT B MJUUMF NPSF DPODSFUF MFUƊT TVQQPTF
UIBU XF BQQMZ UIFTF MBNCEBT UP TQFDJƶD WBMVFT 'JSTU B TJNQMF
FYBNQMF XJUI UIF JEFOUJUZ GVODUJPO

 ᅶԧԧ

 ᅶԧԧ


 <ԧ ੃ >

 

/PX MFUƊT MPPL BU B ƌNVMUJQMFƍ BSHVNFOU MBNCEB

 ᅶԧԨԧԨ
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 ᅶԧԨԧԨ
 

 ᅶԧ ᅶԨԧԨ

 

 <ԧ ੃ >

 ᅶԨԨ


 <Ԩ ੃ >

  

5IBU XBTOƊU UPP JOUFSFTUJOH CFDBVTF JUƊT MJLF OFTUFE JEFOUJUZ


GVODUJPOT 8F DBOƊU NFBOJOHGVMMZ BQQMZ B  UP B  -FUƊT USZ
TPNFUIJOH EJƵFSFOU

 ᅶԧԨԧԨ

 ᅶԧԨԧԨ
ᅶԩԐ


 ᅶԧ ᅶԨԧԨ

ᅶԩԐ


 <ԧ ੃ ᅶԩԐ
>

 ᅶԨ ᅶԩԐ
Ԩ


 <Ԩ ੃ >

 ᅶԩԐ
 8F TUJMM DBO BQQMZ UIJT POF NPSF UJNF
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 <ԩ ੃ > #VU UIFSF JT OP ԩ JO UIF CPEZ PG UIF GVODUJPO TP


UIFSF JT OPXIFSF UP QVU B  8F FMJNJOBUF UIF IFBE BOE
UIF ƶOBM SFTVMU JT

 Ԑ

*UƊT NPSF DPNNPO JO BDBEFNJD MBNCEB DBMDVMVT NBUFSJBMT


UP SFGFS UP BCTUSBDU WBSJBCMFT SBUIFS UIBO DPODSFUF WBMVFT 5IF
QSPDFTT PG CFUB SFEVDUJPO JT UIF TBNF SFHBSEMFTT 5IF MBNCEB
DBMDVMVT JT B QSPDFTT PS NFUIPE MJLF B HBNF XJUI B GFX TJN
QMF SVMFT GPS USBOTGPSNJOH MBNCEBT CVU OP TQFDJƶD NFBOJOH
8FƊWF KVTU JOUSPEVDFE DPODSFUF WBMVFT UP NBLF UIF SFEVDUJPO
TPNFXIBU FBTJFS UP TFF
5IF OFYU FYBNQMF VTFT POMZ BCTUSBDU WBSJBCMFT %VF UP BM
QIB FRVJWBMFODF ZPV TPNFUJNFT TFF FYQSFTTJPOT JO MBNCEB
DBMDVMVT MJUFSBUVSF TVDI BT

ᅶԧԨԧԧԨ
ᅶԧԧԨ
ᅶԧԧԩ

5IF TVCTUJUVUJPO QSPDFTT DBO CFDPNF B UBOHMF PG ԧT UIBU BSF


OPU UIF TBNF ԧ CFDBVTF FBDI XBT CPVOE CZ B EJƵFSFOU IFBE 5P
IFMQ NBLF UIF SFEVDUJPO FBTJFS UP SFBE XFƊSF HPJOH UP VTF EJG
GFSFOU WBSJBCMFT JO FBDI BCTUSBDUJPO CVU JUƊT XPSUI FNQIBTJ[JOH
UIBU UIF OBNF PG UIF WBSJBCMF UIF MFUUFS
IBT OP NFBOJOH PS
TJHOJƶDBODF

 ᅶԧԨԩԧԩ Ԩԩ

ᅶԜԝԜ
ᅶԟԟ

$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 ᅶԧᅶԨᅶԩԧԩ Ԩԩ

ᅶԜᅶԝԜ
ᅶԟԟ

8FƊWF OPU SFEVDFE PS BQQMJFE BOZUIJOH IFSF KVTU NBEF


UIF DVSSZJOH FYQMJDJU

 ᅶԨᅶԩ ᅶԜᅶԝԜ
ԩ Ԩԩ

ᅶԟԟ

0VS ƶSTU SFEVDUJPO TUFQ XBT UP BQQMZ UIF PVUFSNPTU MBNCEB


XIJDI XBT CJOEJOH UIF ԧ UP UIF ƶSTU BSHVNFOU ᅶԜᅶԝԜ


 ᅶԩ ᅶԜᅶԝԜ
ԩ
ᅶԟԟ
ԩ

8F BQQMJFE UIF Ԩ BOE SFQMBDFE UIF TJOHMF PDDVSSFODF PG


Ԩ XJUI UIF OFYU BSHVNFOU UIF UFSN ᅶԟԟ 5IF PVUFSNPTU
MBNCEB CJOEJOH ԩ JT BU UIJT QPJOU JSSFEVDJCMF CFDBVTF JU
IBT OP BSHVNFOU UP BQQMZ UP 8IBU SFNBJOT JT UP HP JOTJEF
UIF UFSNT POF MBZFS BU B UJNF VOUJM XF ƶOE TPNFUIJOH
SFEVDJCMF

 ᅶԩ ᅶԝԩ
ᅶԟԟ
ԩ

8F DBO BQQMZ UIF MBNCEB CJOEJOH Ԝ UP UIF BSHVNFOU ԩ


8F LFFQ TFBSDIJOH GPS UFSNT XF DBO BQQMZ 5IF OFYU UIJOH
XF DBO BQQMZ JT UIF MBNCEB CJOEJOH ԝ UP UIF MBNCEB UFSN
ᅶԟԟ
ԩ


 ᅶԩԩ
*O UIF ƶOBM TUFQ UIF SFEVDUJPO UBLFT B UVSO UIBU NJHIU MPPL
TMJHIUMZ PEE )FSF UIF PVUFSNPTU MFǒNPTU SFEVDJCMF UFSN
JT ᅶԝԩ BQQMJFE UP UIF FOUJSFUZ PG ᅶԟԟ
ԩ
 "T XF TBX JO
BO FYBNQMF BCPWF JU EPFTOƊU NBUUFS XIBU ԝ HPU CPVOE UP
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

ᅶԝԩ VODPOEJUJPOBMMZ UPTTFT UIF BSHVNFOU BOE SFUVSOT ԩ


4P XF BSF MFǒ XJUI BO JSSFEVDJCMF MBNCEB FYQSFTTJPO

*OUFSNJTTJPO &RVJWBMFODF &YFSDJTFT


8FƊMM HJWF ZPV B MBNCEB FYQSFTTJPO ,FFQJOH JO NJOE CPUI
BMQIB FRVJWBMFODF BOE IPX NVMUJQMF IFBET BSF OFTUFE DIPPTF
BO BOTXFS UIBU JT FRVJWBMFOU UP UIF MJTUFE MBNCEB UFSN

 ᅶԧԨԧԩ

B
ᅶԧԩԧԩ
C
ᅶԜԝԜԩ
D
ᅶԩ ᅶԧԧԩ

 ᅶԧԨԧԧԨ

B
ᅶԜԝԜԝԟ
C
ᅶԧ ᅶԨԧԨ

D
ᅶԐ ᅶԑԐԐԑ

 ᅶԧԨԩԩԧ

B
ᅶԧ ᅶԨ ᅶԩԩ

C
ᅶԣԞԢԢԣ
D
ᅶԜԝԟԜԝ
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 &WBMVBUJPO JT TJNQMJƶDBUJPO


5IFSF BSF NVMUJQMF OPSNBM GPSNT JO MBNCEB DBMDVMVT CVU IFSF
XIFO XF SFGFS UP OPSNBM GPSN XF NFBO CFUB OPSNBM GPSN #FUB
OPSNBM GPSN JT XIFO ZPV DBOOPU CFUB SFEVDF BQQMZ MBNCEBT UP
BSHVNFOUT
UIF UFSNT BOZ GVSUIFS 5IJT DPSSFTQPOET UP B GVMMZ
FWBMVBUFE FYQSFTTJPO PS JO QSPHSBNNJOH B GVMMZ FYFDVUFE
QSPHSBN 5IJT JT JNQPSUBOU UP LOPX TP UIBU ZPV LOPX XIFO
ZPVƊSF EPOF FWBMVBUJOH BO FYQSFTTJPO *UƊT BMTP WBMVBCMF UP IBWF
BO BQQSFDJBUJPO GPS FWBMVBUJPO BT B GPSN PG TJNQMJƶDBUJPO XIFO
ZPV HFU UP UIF )BTLFMM DPEF BT XFMM
%POƊU CF JOUJNJEBUFE CZ DBMMJOH UIF SFEVDFE GPSN PG BO
FYQSFTTJPO JUT OPSNBM GPSN 8IFO ZPV XBOU UP TBZ ƌ ƍ EP ZPV
TBZ  FBDI UJNF PS EP ZPV KVTU TBZ  5IF FYQSFTTJPO
 JT OPU GVMMZ FWBMVBUFE CFDBVTF UIF EJWJTJPO GVODUJPO
IBT OPU CFFO GVMMZ BQQMJFE UXP BSHVNFOUT
TP JU DPVME CF
SFEVDFE PS FWBMVBUFE *O PUIFS XPSET UIFSFƊT B TJNQMFS GPSN
JU DBO CF SFEVDFE UP ƈ UIF OVNCFS UXP 5IF OPSNBM GPSN
UIFSFGPSF JT 
5IF QPJOU JT UIBU JG ZPV IBWF B GVODUJPO TVDI BT 
TBUVSBUFE
BMM BSHVNFOUT BQQMJFE
CVU ZPV IBWFOƊU ZFU TJNQMJƶFE JU UP
UIF ƶOBM SFTVMU UIFO JU JT OPU GVMMZ FWBMVBUFE NFSFMZ BQQMJFE
"QQMJDBUJPO JT XIBU NBLFT FWBMVBUJPOTJNQMJƶDBUJPO QPTTJCMF
4JNJMBSMZ UIF OPSNBM GPSN PG UIF GPMMPXJOH JT 

 
੟ 
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

8F DBOOPU SFEVDF UIF OVNCFS  BOZ GVSUIFS 5IFSF BSF


OP NPSF GVODUJPOT UIBU XF DBO CFUB SFEVDF /PSNBM GPSN KVTU
NFBOT UIFSF JT OPUIJOH MFǒ UIBU DBO CF SFEVDFE
5IF JEFOUJUZ GVODUJPO ᅶԧԧ JT GVMMZ SFEVDFE UIBU JT JO OPS
NBM GPSN
CFDBVTF JU IBTOƊU ZFU CFFO BQQMJFE UP BOZUIJOH )PX
FWFS ᅶԧԧ
ԩ JT OPU JO CFUB OPSNBM GPSN CFDBVTF UIF JEFOUJUZ
GVODUJPO IBTOƊU CFFO BQQMJFE UP B GSFF WBSJBCMF ԩ BOE IBTOƊU
CFFO SFEVDFE *G XF EJE SFEVDF JU UIF ƶOBM SFTVMU JO CFUB
OPSNBM GPSN XPVME CF ԩ

 $PNCJOBUPST
" DPNCJOBUPS JT B MBNCEB UFSN XJUI OP GSFF WBSJBCMFT $PNCJ
OBUPST BT UIF OBNF TVHHFTUT TFSWF POMZ UP DPNCJOF UIF BSHV
NFOUT UIFZ BSF HJWFO
4P UIF GPMMPXJOH BSF DPNCJOBUPST CFDBVTF FWFSZ UFSN JO UIF
CPEZ PDDVST JO UIF IFBE

 ᅶԧԧ
ԧ JT UIF POMZ WBSJBCMF BOE JT CPVOE CFDBVTF JU JT CPVOE CZ
UIF FODMPTJOH MBNCEB

 ᅶԧԨԧ

 ᅶԧԨԩԧԩ Ԩԩ

"OE UIF GPMMPXJOH BSF OPU CFDBVTF UIFSFƊT POF PS NPSF GSFF
WBSJBCMFT
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 ᅶԨԧ
)FSF Ԩ JT CPVOE JU PDDVST JO UIF IFBE PG UIF MBNCEB
CVU
ԧ JT GSFF

 ᅶԧԧԩ
ԧ JT CPVOE BOE JT VTFE JO UIF CPEZ CVU ԩ JT GSFF

8F XPOƊU IBWF B MPU UP TBZ BCPVU DPNCJOBUPST QFS TF 5IF


QPJOU JT UP DBMM PVU B TQFDJBM DMBTT PG MBNCEB FYQSFTTJPOT UIBU
DBO POMZ DPNCJOF UIF BSHVNFOUT JU JT HJWFO XJUIPVU JOKFDUJOH
BOZ OFX WBMVFT PS SBOEPN EBUB

 %JWFSHFODF
/PU BMM SFEVDJCMF MBNCEB UFSNT SFEVDF OFBUMZ UP B CFUB OPSNBM
GPSN 5IJT JTOƊU CFDBVTF UIFZƊSF BMSFBEZ GVMMZ SFEVDFE CVU
SBUIFS CFDBVTF UIFZ EJWFSHF %JWFSHFODF IFSF NFBOT UIBU UIF
SFEVDUJPO QSPDFTT OFWFS UFSNJOBUFT PS FOET 3FEVDJOH UFSNT
TIPVME PSEJOBSJMZ DPOWFSHF UP CFUB OPSNBM GPSN BOE EJWFS
HFODF JT UIF PQQPTJUF PG DPOWFSHFODF PS OPSNBM GPSN )FSFƊT
BO FYBNQMF PG B MBNCEB UFSN DBMMFE PNFHB UIBU EJWFSHFT

 ᅶԧԧԧ
ᅶԧԧԧ

ԧ JO UIF ƶSTU MBNCEBƊT IFBE CFDPNFT UIF TFDPOE MBNCEB

 <ԧ ੃ ᅶԧԧԧ
>ԧԧ

6TJOH <ԥԐԡ ੃ Ԕԧԟԡ> UP EFOPUF XIBU ԧ IBT CFFO CPVOE UP


$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 ᅶԧԧԧ
ᅶԧԧԧ

4VCTUJUVUJOH ᅶԧԧԧ
GPS FBDI PDDVSFODF PG ԧ 8FƊSF CBDL
UP XIFSF XF TUBSUFE BOE UIJT SFEVDUJPO QSPDFTT OFWFS FOET
ƈ XF DBO TBZ PNFHB EJWFSHFT

5IJT NBUUFST JO QSPHSBNNJOH CFDBVTF UFSNT UIBU EJWFSHF


BSF UFSNT UIBU EPOƊU QSPEVDF BO BOTXFS PS NFBOJOHGVM SFTVMU
6OEFSTUBOEJOH XIBU XJMM UFSNJOBUF NFBOT VOEFSTUBOEJOH XIBU
QSPHSBNT XJMM EP VTFGVM XPSL BOE SFUVSO UIF BOTXFS XF XBOU
8FƊMM DPWFS UIJT JEFB NPSF MBUFS

 4VNNBSZ
5IF NBJO QPJOUT ZPV TIPVME UBLF BXBZ GSPN UIJT DIBQUFS BSF

Ƒ 'VODUJPOBM QSPHSBNNJOH JT CBTFE PO FYQSFTTJPOT UIBU JO


DMVEF WBSJBCMFT PS DPOTUBOU WBMVFT FYQSFTTJPOT DPNCJOFE
XJUI PUIFS FYQSFTTJPOT BOE GVODUJPOT

Ƒ 'VODUJPOT IBWF B IFBE BOE B CPEZ BOE BSF UIPTF FYQSFT


TJPOT UIBU DBO CF BQQMJFE UP BSHVNFOUT BOE SFEVDFE PS
FWBMVBUFE UP B SFTVMU

Ƒ 7BSJBCMFT NBZ CF CPVOE JO UIF GVODUJPO EFDMBSBUJPO BOE


FWFSZ UJNF B CPVOE WBSJBCMF TIPXT VQ JO B GVODUJPO JU IBT
UIF TBNF WBMVF

Ƒ "MM GVODUJPOT UBLF POF BSHVNFOU BOE SFUVSO POF SFTVMU


$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

Ƒ 'VODUJPOT BSF B NBQQJOH PG B TFU PG JOQVUT UP B TFU PG


PVUQVUT (JWFO UIF TBNF JOQVU UIFZ BMXBZT SFUVSO UIF
TBNF SFTVMU

5IFTF UIJOHT BMM BQQMZ UP )BTLFMM BT UIFZ EP UP BOZ QVSF


GVODUJPOBM MBOHVBHFT CFDBVTF TFNBOUJDBMMZ )BTLFMM JT B MBNCEB
DBMDVMVT )BTLFMM JT B UZQFE MBNCEB DBMDVMVT ƈ NPSF PO UZQFT
MBUFS ƈ XJUI B MPU PG TVSGBDFMFWFM EFDPSBUJPO TQSJOLMFE PO UPQ
UP NBLF JU FBTJFS GPS IVNBOT UP XSJUF CVU UIF TFNBOUJDT PG UIF
DPSF MBOHVBHF BSF UIF TBNF BT UIF MBNCEB DBMDVMVT 5IBU JT
UIF NFBOJOH PG )BTLFMM QSPHSBNT JT DFOUFSFE BSPVOE FWBMVBU
JOH FYQSFTTJPOT SBUIFS UIBO FYFDVUJOH JOTUSVDUJPOT BMUIPVHI
)BTLFMM IBT B XBZ UP FYFDVUF JOTUSVDUJPOT UPP 8F XJMM TUJMM
CF NBLJOH SFGFSFODF UP UIF MBNCEB DBMDVMVT XIFO XF XSJUF
BCPVU BMM UIF MBUFS BQQBSFOUMZ WFSZ DPNQMFY UPQJDT GVODUJPO
DPNQPTJUJPO NPOBET QBSTFS DPNCJOBUPST %POƊU XPSSZ JG ZPV
EPOƊU LOPX UIPTF XPSET ZFU *G ZPV VOEFSTUPPE UIJT DIBQUFS
ZPV IBWF UIF GPVOEBUJPO ZPV OFFE UP VOEFSTUBOE UIFN BMM

 $IBQUFS &YFSDJTFT


8FƊSF HPJOH UP EP UIF GPMMPXJOH FYFSDJTFT B CJU EJƵFSFOUMZ UIBO
XIBU ZPVƊMM TFF JO UIF SFTU PG UIF CPPL BT XF XJMM CF QSPWJEJOH
TPNF BOTXFST BOE FYQMBOBUJPOT GPS UIF RVFTUJPOT CFMPX
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

$PNCJOBUPST %FUFSNJOF JG FBDI PG UIF GPMMPXJOH BSF DPNCJ


OBUPST PS OPU

 ᅶԧԧԧԧ

 ᅶԧԨԩԧ

 ᅶԧԨԩԧԨ ԩԧ

 ᅶԧԨԩԧԨ ԩԧԨ

 ᅶԧԨԧԨ ԩԧԨ

/PSNBM GPSN PS EJWFSHF %FUFSNJOF JG FBDI PG UIF GPMMPXJOH


DBO CF SFEVDFE UP B OPSNBM GPSN PS JG UIFZ EJWFSHF

 ᅶԧԧԧԧ

 ᅶԩԩԩ
ᅶԨԨԨ

 ᅶԧԧԧԧ
ԩ

#FUB SFEVDF &WBMVBUF UIBU JT CFUB SFEVDF


FBDI PG UIF GPM
MPXJOH FYQSFTTJPOT UP OPSNBM GPSN 8F TUSPOHMZ SFDPNNFOE
XSJUJOH PVU UIF TUFQT PO QBQFS XJUI B QFODJM PS QFO

 ᅶԐԑԒԒԑԐ
ԩԩ ᅶԦԥԦ

 ᅶԧᅶԨԧԨԨ
ᅶԐԐ
ԑ

 ᅶԨԨ
ᅶԧԧԧ
ᅶԩԩԠ

$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 ᅶԩԩ
ᅶԩԩԩ
ᅶԩԩԨ

)JOU BMQIB FRVJWBMFODF

 ᅶԧᅶԨԧԨԨ
ᅶԨԨ
Ԩ

 ᅶԐԐԐ
ᅶԑԑԐ
Ԓ

 ᅶԧԨԩԧԩ Ԩԩ

ᅶԧԩ
ᅶԧԐ

$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 "OTXFST
1MFBTF OPUF "U UIJT UJNF UIJT JT UIF POMZ DIBQUFS JO UIF CPPL GPS
XIJDI XF IBWF QSPWJEFE BOTXFST 8F QSPWJEF UIFN IFSF EVF
UP UIF JNQPSUBODF PG CFJOH BCMF UP DIFDL ZPVS VOEFSTUBOEJOH
PG UIJT NBUFSJBM BOE UIF SFMBUJWF EJƸDVMUZ PG DIFDLJOH BOTXFST
UIBU ZPV QSPCBCMZ XSPUF CZ IBOE JO B OPUFCPPL

$PNCJOBUPST

 ᅶԧԧԧԧ JT JOEFFE B DPNCJOBUPS JU SFGFST POMZ UP UIF WBSJBCMF


Y XIJDI JT JOUSPEVDFE BT BO BSHVNFOU

 ᅶԧԨԩԧ JT OPU B DPNCJOBUPS UIF WBSJBCMF [ XBT OPU JOUSP


EVDFE BT BO BSHVNFOU BOE JT UIVT B GSFF WBSJBCMF

 ᅶԧԨԩԧԨ ԩԧ
JT B DPNCJOBUPS BMM UFSNT BSF CPVOE 5IF IFBE
JT ᅶԧԨԩ BOE UIF CPEZ JT ԧԨ ԩԧ
 /POF PG UIF BSHVNFOUT JO
UIF IFBE IBWF CFFO BQQMJFE TP JUƊT JSSFEVDJCMF 5IF WBSJ
BCMFT Y Z BOE [ BSF BMM CPVOE JO UIF IFBE BOE BSF OPU GSFF
5IJT NBLFT UIF MBNCEB B DPNCJOBUPS  OP PDDVSSFODFT PG
GSFF WBSJBCMFT

 ᅶԧԨԩԧԨ ԩԧԨ
JT B DPNCJOBUPS 5IF MBNCEB IBT UIF IFBE
ᅶԧԨԩ BOE UIF CPEZ ԧԨ ԩԧԨ
 "HBJO OPOF PG UIF BSHVNFOUT
IBWF CFFO BQQMJFE TP JUƊT JSSFEVDJCMF "MM UIBU JT EJƵFSFOU
JT UIBU UIF CPVOE WBSJBCMF Z JT SFGFSFODFE UXJDF SBUIFS
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

UIBO PODF 5IFSF BSF TUJMM OP GSFF WBSJBCMFT TP UIJT JT BMTP B


DPNCJOBUPS

 ᅶԧԨԧԨ ԩԧԨ
JT OPU B DPNCJOBUPS [ JT GSFF /PUF UIBU [ JTOƊU
CPVOE JO UIF IFBE

/PSNBM GPSN PS EJWFSHF

 ᅶԧԧԧԧ EPFTOƊU EJWFSHF IBT OP GVSUIFS SFEVDUJPO TUFQT *G


JU IBE CFFO BQQMJFE UP JUTFMG JU XPVME EJWFSHF CVU CZ JUTFMG
EPFT OPU BT JU JT BMSFBEZ JO OPSNBM GPSN

 ᅶԩԩԩ
ᅶԨԨԨ
EJWFSHFT JU OFWFS SFBDIFT B QPJOU XIFSF UIF
SFEVDUJPO JT EPOF 5IJT JT UIF PNFHB UFSN XF TIPXFE ZPV
FBSMJFS KVTU XJUI EJƵFSFOU OBNFT GPS UIF CJOEJOHT *UƊT
BMQIB FRVJWBMFOU UP ᅶԧԧԧ
ᅶԧԧԧ


 ᅶԧԧԧԧ
ԩ EPFTOƊU EJWFSHF JU SFEVDFT UP ԩԩԩ

#FUB SFEVDF 5IF GPMMPXJOH BSF FWBMVBUFE JO OPSNBM PSEFS XIJDI


JT XIFSF UFSNT JO UIF PVUFSNPTU BOE MFǒNPTU QPTJUJPOT HFU
FWBMVBUFE BQQMJFE
ƶSTU 5IJT NFBOT UIBU JG BMM UFSNT BSF JO
UIF PVUFSNPTU QPTJUJPO OPOF BSF OFTUFE
UIFO JUƊT MFǒUPSJHIU
BQQMJDBUJPO PSEFS

 ᅶԐԑԒԒԑԐ
ԩԩ ᅶԦԥԦ

ᅶԐᅶԑᅶԒԒԑԐ
ԩ
ԩ ᅶԦᅶԥԦ

ᅶԑᅶԒԒԑԩ
ԩ
ᅶԦᅶԥԦ

$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

ᅶԒԒԩԩ
ᅶԦᅶԥԦ

ᅶԦᅶԥԦ
ԩ
ԩ
ᅶԥԩ
ԩ

 ᅶԧᅶԨԧԨԨ
ᅶԐԐ
ԑ
ᅶԨ ᅶԐԐ
ԨԨ
ԑ

ᅶԐԐ
ԑ
ԑ
ԑԑ

 ᅶԨԨ
ᅶԧԧԧ
ᅶԩԩԠ

ᅶԧԧԧ
ᅶԩԩԠ

ᅶԩԩԠ
ᅶԩԩԠ

ᅶԩԩԠ
Ԡ

ԠԠ

 ᅶԩԩ
ᅶԩԩԩ
ᅶԩԩԨ

ᅶԩԩԩ
ᅶԩԩԨ

ᅶԩԩԨ
ᅶԩԩԨ

ᅶԩԩԨ
Ԩ

ԨԨ

 ᅶԧᅶԨԧԨԨ
ᅶԨԨ
Ԩ
ᅶԨ ᅶԨԨ
ԨԨ
Ԩ

ᅶԨԨ
Ԩ
Ԩ
ԨԨ
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 ᅶԐԐԐ
ᅶԑԑԐ
Ԓ
ᅶԑԑԐ
ᅶԑԑԐ
Ԓ
ᅶԑԑԐ
Ԑ
Ԓ
ԐԐԒ

 4UFQT XF UPPL

B
ᅶԧԨԩԧԩ Ԩԩ

ᅶԧԩ
ᅶԧԐ

C
ᅶԧᅶԨᅶԩԧԩ Ԩԩ

ᅶԧԩ
ᅶԧԐ

D
ᅶԨᅶԩ ᅶԧԩ
ԩ Ԩԩ

ᅶԧԐ

E
ᅶԩ ᅶԧԩ
ԩ
ᅶԧԐ
ԩ

F
ᅶԩԩ ᅶԧԐ
ԩ

G
ᅶԩԩԐ
5IF ԩ OPUBUJPO BMMPXT VT UP EJTUJOHVJTI UXP
WBSJBCMFT OBNFE ԩ UIBU DBNF GSPN EJƵFSFOU QMBDFT
0OF JT CPVOE CZ UIF ƶSTU IFBE UIF TFDPOE JT B GSFF
WBSJBCMF JO UIF TFDPOE MBNCEB FYQSFTTJPO

)PX XF HPU UIFSF TUFQ CZ TUFQ

B
0VS FYQSFTTJPO XFƊMM SFEVDF
C
"EE UIF JNQMJFE MBNCEBT UP JOUSPEVDF FBDI BSHVNFOU
D
"QQMZ UIF MFǒNPTU ԧ BOE CJOE JU UP ᅶԧԩ
SFOBNF
MFǒNPTU ԩ UP ԩ GPS DMBSJUZ UP BWPJE DPOGVTJPO XJUI UIF
PUIFS [ )FSFBǒFS ƌ[ƍ JT FYDMVTJWFMZ UIF [ JO ᅶԧԩ

E
"QQMZ Ԩ JU HFUT CPVOE UP ᅶԧԐ

$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

F
$BOƊU BQQMZ [ UP BOZUIJOH FWBMVBUJPO TUSBUFHZ JT OPS
NBM PSEFS TP MFǒNPTU PVUFSNPTU JT UIF PSEFS PG UIF
EBZ 0VS MFǒNPTU PVUFSNPTU MBNCEB IBT OP SFNBJO
JOH BSHVNFOUT UP CF BQQMJFE TP XF OPX FYBNJOF UIF
UFSNT OFTUFE XJUIJO UP TFF JG UIFZ BSF JO OPSNBM GPSN
ᅶԧԩ
HFUT BQQMJFE UP ԩ UPTTFT UIF ԩ BXBZ BOE SFUVSOT
ԩ ԩ JT OPX CFJOH BQQMJFE UP ᅶԧԐ
ԩ


G
$BOOPU SFEVDF ԩ GVSUIFS JUƊT GSFF BOE XF LOPX OPUI
JOH TP XF HP JOTJEF ZFU BOPUIFS OFTUJOH BOE SFEVDF
ᅶԧԐ
ԩ

 ᅶԧԐ HFUT BQQMJFE UP ԩ CVU UPTTFT JU BXBZ


BOE SFUVSOT UIF GSFF WBSJBCMF Ԑ 5IF Ԑ JT OPX QBSU PG
UIF CPEZ PG UIBU FYQSFTTJPO "MM PG PVS UFSNT BSF JO
OPSNBM PSEFS OPX

 %FƶOJUJPOT
 5IF MBNCEB JO MBNCEB DBMDVMVT JT UIF HSFFL MFUUFS ᅶ VTFE
UP JOUSPEVDF PS BCTUSBDU BSHVNFOUT GPS CJOEJOH JO BO
FYQSFTTJPO

 " MBNCEB BCTUSBDUJPO JT BO BOPOZNPVT GVODUJPO PS MBNCEB


UFSN
ᅶԧԧ 

5IF IFBE PG UIF FYQSFTTJPO ᅶԧ BCTUSBDUT PVU UIF UFSN


ԧ  8F DBO BQQMZ JU UP BOZ ԧ BOE SFDPNQVUF EJƵFSFOU
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

SFTVMUT GPS FBDI ԧ XF BQQMJFE UIF MBNCEB UP

 "QQMJDBUJPO JT IPX POF FWBMVBUFT PS SFEVDFT MBNCEBT UIJT


CJOET UIF BSHVNFOU UP XIBUFWFS UIF MBNCEB XBT BQQMJFE
UP $PNQVUBUJPOT BSF QFSGPSNFE JO MBNCEB DBMDVMVT CZ
BQQMZJOH MBNCEBT UP BSHVNFOUT VOUJM ZPV SVO PVU PG BS
HVNFOUT UP BQQMZ MBNCEBT UP
ᅶԧԧ

5IJT FYBNQMF SFEVDFT UP  UIF JEFOUJUZ ᅶԧԧ XBT BQQMJFE
UP UIF WBMVF  ԧ XBT CPVOE UP  BOE UIF MBNCEBƊT CPEZ
JT KVTU ԧ TP JU KVTU LJDLT UIF  PVU *O B TFOTF BQQMZJOH UIF
ᅶԧԧ DPOTVNFE JU 8F SFEVDFE UIF BNPVOU PG TUSVDUVSF XF
IBE

 -BNCEB DBMDVMVT JT B GPSNBM TZTUFN GPS FYQSFTTJOH QSP


HSBNT JO UFSNT PG BCTUSBDUJPO BOE BQQMJDBUJPO

 /PSNBM PSEFS JT B DPNNPO FWBMVBUJPO TUSBUFHZ JO MBNCEB


DBMDVMJ /PSNBM PSEFS NFBOT FWBMVBUJOH JF BQQMZJOH PS
CFUB SFEVDJOH
UIF MFǒNPTU PVUFSNPTU MBNCEBT ƶSTU FWBM
VBUJOH UFSNT OFTUFE XJUIJO BǒFS ZPVƊWF SVO PVU PG BSHV
NFOUT UP BQQMZ /PSNBM PSEFS JTOƊU IPX )BTLFMM DPEF JT
FWBMVBUFE  JUƊT DBMMCZOFFE JOTUFBE 8FƊMM FYQMBJO UIJT NPSF
MBUFS "OTXFST UP UIF FWBMVBUJPO FYFSDJTFT XFSF XSJUUFO JO
OPSNBM PSEFS
$)"15&3  "/:5)*/( '30. "-.045 /05)*/( 

 'PMMPXVQ SFTPVSDFT


5IFTF BSF PQUJPOBM BOE JOUFOEFE POMZ UP PƵFS TVHHFTUJPOT PO
IPX ZPV NJHIU EFFQFO ZPVS VOEFSTUBOEJOH PG UIF QSFDFEJOH
UPQJD 0SEFSFE BQQSPYJNBUFMZ GSPN NPTU BQQSPBDIBCMF UP
NPTU UIPSPVHI

 3BVM 3PKBT " 5VUPSJBM *OUSPEVDUJPO UP UIF -BNCEB $BMDV


MVT
http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf

 )FOL #BSFOESFHU &SJL #BSFOETFO *OUSPEVDUJPO UP


-BNCEB $BMDVMVT
http://www.cse.chalmers.se/research/group/logic/
TypesSS05/Extra/geuvers.pdf

 +FBO:WFT (JSBSE 1 5BZMPS :WFT -BGPO 1SPPGT BOE 5ZQFT


http://www.paultaylor.eu/stable/prot.pdf
$IBQUFS 

)FMMP )BTLFMM

'VODUJPOT BSF CFBDPOT PG


DPOTUBODZ JO B TFB PG
UVSNPJM

.JLF )BNNPOE


$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

 )FMMP )BTLFMM


8FMDPNF UP ZPVS ƶSTU TUFQ JO MFBSOJOH )BTLFMM #FGPSF ZPV CF
HJO XJUI UIF NBJO DPVSTF PG UIJT CPPL ZPV XJMM OFFE UP JOTUBMM
UIF OFDFTTBSZ UPPMT JO PSEFS UP DPNQMFUF UIF FYFSDJTFT BT ZPV
XPSL UISPVHI UIF CPPL "U UIJT UJNF XF SFDPNNFOE JOTUBMMJOH
4UBDL XIJDI XJMM JOTUBMM ()$ )BTLFMM UIF JOUFSBDUJWF FOWJSPO
NFOU DBMMFE ()$J BOE B QSPKFDU CVJME UPPM BOE EFQFOEFODZ
NBOBHFS BMM BU PODF
:PV DBO ƶOE UIF JOTUBMMBUJPO JOTUSVDUJPOT POMJOF BU http://
docs.haskellstack.org/en/stable/README/ BOE UIFSF JT BMTP HSFBU
EPDVNFOUBUJPO UIBU DBO IFMQ ZPV HFU TUBSUFE VTJOH 4UBDL :PV
DBO BMTP ƶOE JOTUBMMBUJPO JOTUSVDUJPOT BU https://github.com/
bitemyapp/learnhaskell BOE UIFSF ZPV XJMM BMTP ƶOE BEWJDF PO
MFBSOJOH )BTLFMM BOE MJOLT UP NPSF FYFSDJTFT UIBU NBZ TVQQMF
NFOU XIBU ZPVƊSF EPJOH XJUI UIJT CPPL
5IF SFTU PG UIJT DIBQUFS XJMM BTTVNF UIBU ZPV IBWF DPNQMFUFE
UIF JOTUBMMBUJPO BOE BSF SFBEZ UP CFHJO XPSLJOH *O UIJT DIBQUFS
ZPV XJMM

Ƒ VTF )BTLFMM DPEF JO UIF JOUFSBDUJWF FOWJSPONFOU BOE BMTP


GSPN TPVSDF ƶMFT

Ƒ VOEFSTUBOE UIF CVJMEJOH CMPDLT PG )BTLFMM FYQSFTTJPOT


BOE GVODUJPOT
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Ƒ MFBSO TPNF GFBUVSFT PG )BTLFMM TZOUBY BOE DPOWFOUJPOT PG


HPPE )BTLFMM TUZMF

Ƒ NPEJGZ TJNQMF GVODUJPOT

 *OUFSBDUJOH XJUI )BTLFMM DPEF


)BTLFMM PƵFST UXP QSJNBSZ XBZT PG XPSLJOH XJUI DPEF 5IF
ƶSTU JT JOQVUUJOH JU EJSFDUMZ JOUP UIF JOUFSBDUJWF FOWJSPONFOU
LOPXO BT ()$J PS UIF 3&1- 5IF TFDPOE JT UZQJOH JU JOUP B
UFYU FEJUPS TBWJOH BOE UIFO MPBEJOH UIBU TPVSDF ƶMF JOUP ()$J
5IJT TFDUJPO PƵFST BO JOUSPEVDUJPO UP FBDI NFUIPE

6TJOH UIF 3&1-


3&1- JT BO BDSPOZN TIPSU GPS SFBEFWBMQSJOU MPPQ 3&1-T BSF
JOUFSBDUJWF QSPHSBNNJOH FOWJSPONFOUT XIFSF ZPV DBO JOQVU
DPEF IBWF JU FWBMVBUFE BOE TFF UIF SFTVMU 5IFZ PSJHJOBUFE
XJUI -JTQ CVU BSF OPX DPNNPO UP NPEFSO QSPHSBNNJOH
MBOHVBHFT JODMVEJOH )BTLFMM
"TTVNJOH ZPVƊWF DPNQMFUFE ZPVS JOTUBMMBUJPO ZPV TIPVME
CF BCMF UP PQFO ZPVS UFSNJOBM PS DPNNBOE QSPNQU UZQF ghci
PS stack ghci IJU FOUFS BOE TFF TPNFUIJOH MJLF UIF GPMMPXJOH

GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help



*G ZPV IBWF JOTUBMMFE ()$ PVUTJEF PG 4UBDL UIFO ZPV TIPVME CF BCMF UP PQFO JU XJUI
KVTU UIF ghci DPNNBOE CVU JG ZPVS POMZ ()$ JOTUBMMBUJPO JT XIBU 4UBDL JOTUBMMFE UIFO ZPV
XJMM OFFE stack ghci
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude>

*G ZPV VTFE stack ghci UIFSF XBT QSPCBCMZ B MPU NPSF TUBSUVQ
UFYU BOE UIF QSPNQU NJHIU CF TPNFUIJOH PUIFS UIBO Prelude
5IBUƊT BMM ƶOF :PV NBZ BMTP IBWF B EJƵFSFOU WFSTJPO PG ()$
"T MPOH BT ZPVS ()$ WFSTJPO JT CFUXFFO  BOE  JU TIPVME
CF DPNQBUJCMF XJUI FWFSZUIJOH JO UIJT CPPL
/PX USZ FOUFSJOH TPNF TJNQMF BSJUINFUJD BU ZPVS QSPNQU

Prelude> 2 + 2
4
Prelude> 7 < 9
True
Prelude> 10 ^ 2
100

*G ZPV DBO FOUFS TJNQMF FRVBUJPOT BU UIF QSPNQU BOE HFU UIF
FYQFDUFE SFTVMUT DPOHSBUVMBUJPOT ƈ ZPV BSF OPX B GVODUJPOBM
QSPHSBNNFS .PSF UP UIF QPJOU ZPVS 3&1- JT XPSLJOH XFMM
BOE ZPV BSF SFBEZ UP QSPDFFE
5P FYJU ()$J VTF UIF DPNNBOE :quit PS :q

8IBU JT 1SFMVEF 1SFMVEF JT B MJCSBSZ PG TUBOEBSE GVODUJPOT


0QFOJOH ()$J PS 4UBDL ()$J BVUPNBUJDBMMZ MPBET UIPTF GVOD
UJPOT TP UIFZ DBO CF VTFE XJUIPVU OFFEJOH UP EP BOZUIJOH TQF

"U UIJT QPJOU JO UIF CPPL ZPV EPOƊU OFFE UP VTF stack ghci CVU JO MBUFS DIBQUFST XIFO
XFƊSF JNQPSUJOH B MPU PG NPEVMFT BOE CVJMEJOH QSPKFDUT JU XJMM CF NVDI NPSF DPOWFOJFOU
UP VTF JU
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

DJBM :PV DBO UVSO 1SFMVEF PƵ BT XF XJMM TIPX ZPV NVDI MBUFS
BOE UIFSF BSF BMUFSOBUJWF 1SFMVEFT UIPVHI XF XPOƊU VTF UIFN
JO UIF CPPL 1SFMVEF JT DPOUBJOFE JO )BTLFMMƊT base QBDLBHF
XIJDI DBO CF GPVOE BU https://www.stackage.org/package/base
:PVƊMM TFF VT NFOUJPO TPNFUJNFT UIBU TPNFUIJOH PS PUIFS JT
ƌJO baseƍ XIJDI NFBOT JUƊT DPOUBJOFE JO UIBU WBTU GPVOEBUJPOBM
QBDLBHF

()$J DPNNBOET
5ISPVHIPVU UIF CPPL XFƊMM CF VTJOH ()$J DPNNBOET TVDI
BT :quit BOE :info JO UIF 3&1- 4QFDJBM DPNNBOET UIBU POMZ
()$J VOEFSTUBOET CFHJO XJUI UIF : DIBSBDUFS :quit JT OPU
)BTLFMM DPEF JUƊT KVTU B ()$J GFBUVSF 8F XJMM TFF NPSF PG
UIFTF DPNNBOET UISPVHIPVU UIF CPPL
8F XJMM QSFTFOU UIFN JO UIF UFYU TQFMMFE PVU CVU UIFZ DBO
HFOFSBMMZ CF BCCSFWJBUFE UP KVTU UIF DPMPO BOE UIF ƶSTU MFUUFS
5IBU JT :quit CFDPNFT :q :info CFDPNFT :i BOE TP GPSUI *UƊT
HPPE UP UZQF UIF XPSE PVU UIF ƶSTU GFX UJNFT ZPV VTF JU UP IFMQ
ZPV SFNFNCFS XIBU UIF BCCSFWJBUJPO TUBOET GPS CVU BǒFS B
GFX NFOUJPOT XF XJMM TUBSU BCCSFWJBUJOH UIFN

8PSLJOH GSPN TPVSDF ƶMFT


"T OJDF BT 3&1-T BSF VTVBMMZ ZPV XBOU UP TUPSF DPEF JO B ƶMF
TP ZPV DBO CVJME JU JODSFNFOUBMMZ "MNPTU BMM OPOUSJWJBM QSP
HSBNNJOH ZPV EP XJMM JOWPMWF FEJUJOH MJCSBSJFT PS BQQMJDBUJPOT
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

NBEF PG OFTUFE EJSFDUPSJFT DPOUBJOJOH ƶMFT XJUI )BTLFMM DPEF


JO UIFN 5IF CBTJD QSPDFTT JT UP IBWF UIF DPEF BOE JNQPSUT
NPSF PO UIBU MBUFS
JO B ƶMF MPBE JU JOUP UIF 3&1- BOE JOUFSBDU
XJUI JU UIFSF BT ZPVƊSF CVJMEJOH NPEJGZJOH BOE UFTUJOH JU
:PVƊMM OFFE B ƶMF OBNFE test.hs 5IF .hs ƶMF FYUFOTJPO EF
OPUFT B )BTLFMM TPVSDF DPEF ƶMF %FQFOEJOH PO ZPVS TFUVQ BOE
UIF XPSLƷPX ZPVƊSF DPNGPSUBCMF XJUI ZPV DBO NBLF B ƶMF CZ
UIBU OBNF BOE UIFO PQFO JU JO ZPVS UFYU FEJUPS PS ZPV DBO PQFO
ZPVS UFYU FEJUPS PQFO B OFX ƶMF BOE UIFO TBWF UIF ƶMF XJUI
UIBU ƶMF OBNF
5IFO FOUFS UIF GPMMPXJOH DPEF JOUP UIF ƶMF BOE TBWF JU

sayHello :: String -> IO ()


sayHello x = putStrLn ("Hello, " ++ x ++ "!")

)FSF :: JT B XBZ UP XSJUF EPXO B UZQF TJHOBUVSF :PV DBO


UIJOL PG JU BT TBZJOH ƌIBT UIF UZQFƍ 4P sayHello IBT UIF UZQF
String -> IO () 5IFTF ƶSTU DIBQUFST BSF GPDVTFE PO TZOUBY
TP JG ZPV EPOƊU VOEFSTUBOE XIBU UZQFT PS UZQF TJHOBUVSFT BSF
UIBUƊT 0, ƈ XF XJMM FYQMBJO UIFN TPPO 'PS OPX LFFQ HPJOH
5IFO JO UIF TBNF EJSFDUPSZ XIFSF ZPVƊWF TUPSFE ZPVS test.hs
ƶMF PQFO ZPVS ghci 3&1- BOE EP UIF GPMMPXJOH

Prelude> :load test.hs


Prelude> sayHello "Haskell"
Hello, Haskell!
Prelude>
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

"ǒFS VTJOH :load UP MPBE ZPVS test.hs UIF sayHello GVODUJPO


JT WJTJCMF JO UIF 3&1- BOE ZPV DBO QBTT JU B TUSJOH BSHVNFOU
TVDI BT ƌ)BTLFMMƍ OPUF UIF RVPUBUJPO NBSLT
BOE TFF UIF PVU
QVU
:PV NBZ OPUJDF UIBU BǒFS MPBEJOH DPEF GSPN B TPVSDF ƶMF
UIF ()$J QSPNQU JT OP MPOHFS Prelude> 5P SFUVSO UP UIF
Prelude> QSPNQU VTF UIF DPNNBOE :m XIJDI JT TIPSU GPS :module
5IJT XJMM VOMPBE UIF ƶMF GSPN ()$J TP UIF DPEF JO UIBU ƶMF
XJMM OP MPOHFS CF JO TDPQF JO ZPVS 3&1-

 6OEFSTUBOEJOH FYQSFTTJPOT


&WFSZUIJOH JO )BTLFMM JT BO FYQSFTTJPO PS EFDMBSBUJPO &YQSFT
TJPOT NBZ CF WBMVFT DPNCJOBUJPOT PG WBMVFT BOEPS GVODUJPOT
BQQMJFE UP WBMVFT &YQSFTTJPOT FWBMVBUF UP B SFTVMU *O UIF DBTF
PG B MJUFSBM WBMVF UIF FWBMVBUJPO JT USJWJBM BT JU POMZ FWBMVBUFT
UP JUTFMG *O UIF DBTF PG BO BSJUINFUJD FRVBUJPO UIF FWBMVBUJPO
QSPDFTT JT UIF QSPDFTT PG DPNQVUJOH UIF PQFSBUPS BOE JUT BS
HVNFOUT BT ZPV NJHIU FYQFDU #VU FWFO UIPVHI OPU BMM PG
ZPVS QSPHSBNT XJMM CF BCPVU EPJOH BSJUINFUJD BMM PG )BTLFMMƊT
FYQSFTTJPOT XPSL JO B TJNJMBS XBZ FWBMVBUJOH UP B SFTVMU JO B
QSFEJDUBCMF USBOTQBSFOU NBOOFS &YQSFTTJPOT BSF UIF CVJMEJOH
CMPDLT PG PVS QSPHSBNT BOE QSPHSBNT UIFNTFMWFT BSF POF CJH
FYQSFTTJPO NBEF PG TNBMMFS FYQSFTTJPOT
8FƊMM DPWFS EFDMBSBUJPOT NPSF MBUFS CVU JU TVƸDFT UP TBZ GPS
OPX UIBU UIFZ BSF UPQMFWFM CJOEJOHT XIJDI BMMPXT VT UP OBNF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

FYQSFTTJPOT 8F DBO UIFO VTF UIPTF OBNFT UP SFGFS UP UIFN


NVMUJQMF UJNFT XJUIPVU DPQZJOH BOE QBTUJOH UIF FYQSFTTJPOT

5IF GPMMPXJOH BSF BMM FYQSFTTJPOT

1
1 + 1
"Icarus"

&BDI DBO CF FYBNJOFE JO UIF ()$J 3&1- CZ FOUFSJOH UIF


DPEF BU UIF QSPNQU UIFO IJUUJOH ƉFOUFSƊ UP TFF UIF SFTVMU PG
FWBMVBUJOH UIF FYQSFTTJPO 5IF OVNFSJD WBMVF  GPS FYBNQMF
IBT OP GVSUIFS SFEVDUJPO TUFQ TP JU TUBOET GPS JUTFMG
*G ZPV IBWFOƊU BMSFBEZ PQFO VQ ZPVS UFSNJOBM BOE HFU ZPVS
3&1- HPJOH UP TUBSU GPMMPXJOH BMPOH XJUI UIF DPEF FYBNQMFT
8IFO XF FOUFS UIJT JOUP ()$J

Prelude> 1
1

8F TFF  QSJOUFE CFDBVTF JU DBOOPU CF SFEVDFE BOZ GVSUIFS


*O UIF OFYU FYBNQMF ()$J SFEVDFT UIF FYQSFTTJPO 1 + 2 UP
 UIFO QSJOUT UIF OVNCFS  5IF SFEVDUJPO UFSNJOBUFT XJUI
UIF WBMVF  CFDBVTF UIFSF BSF OP NPSF UFSNT UP FWBMVBUF

Prelude> 1 + 2
3
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

&YQSFTTJPOT DBO CF OFTUFE JO OVNCFST MJNJUFE POMZ CZ PVS


XJMMJOHOFTT UP UBLF UIF UJNF UP XSJUF UIFN EPXO NVDI MJLF JO
BSJUINFUJD

Prelude> (1 + 2) * 3
9
Prelude> ((1 + 2) * 3) + 100
109

:PV DBO LFFQ FYQBOEJOH PO UIJT OFTUJOH BT NBOZ FYQSFT


TJPOT BT ZPVƊE MJLF BOE FWBMVBUJOH UIFN #VU XF EPOƊU IBWF UP
MJNJU PVSTFMWFT UP FYQSFTTJPOT TVDI BT UIFTF

/PSNBM GPSN 8F TBZ UIBU FYQSFTTJPOT BSF JO OPSNBM GPSN


XIFO UIFSF BSF OP NPSF FWBMVBUJPO TUFQT UIBU DBO CF UBLFO
PS QVU EJƵFSFOUMZ XIFO UIFZƊWF SFBDIFE BO JSSFEVDJCMF GPSN
5IF OPSNBM GPSN PG 1 + 1 JT  8IZ #FDBVTF UIF FYQSFTTJPO 1
+ 1 DBO CF FWBMVBUFE PS SFEVDFE CZ BQQMZJOH UIF BEEJUJPO PQFS
BUPS UP UIF UXP BSHVNFOUT *O PUIFS XPSET 1 + 1 JT B SFEVDJCMF
FYQSFTTJPO XIJMF  JT BO FYQSFTTJPO CVU JT OP MPOHFS SFEVDJCMF
ƈ JU DBOƊU FWBMVBUF JOUP BOZUIJOH PUIFS UIBO JUTFMG 3FEVDJCMF FY
QSFTTJPOT BSF BMTP DBMMFE SFEFYFT 8IJMF XF XJMM HFOFSBMMZ SFGFS
UP UIJT QSPDFTT BT FWBMVBUJPO PS SFEVDUJPO ZPV NBZ BMTP IFBS
JU DBMMFE ƌOPSNBMJ[JOHƍ PS ƌFYFDVUJOHƍ BO FYQSFTTJPO UIPVHI
UIFTF BSF TPNFXIBU JNQSFDJTF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

 'VODUJPOT
&YQSFTTJPOT BSF UIF NPTU CBTJD VOJU PG B )BTLFMM QSPHSBN
BOE GVODUJPOT BSF B TQFDJƶD UZQF PG FYQSFTTJPO 'VODUJPOT JO
)BTLFMM BSF SFMBUFE UP GVODUJPOT JO NBUIFNBUJDT XIJDI JT UP
TBZ UIFZ NBQ BO JOQVU PS TFU PG JOQVUT UP BO PVUQVU " GVODUJPO
JT BO FYQSFTTJPO UIBU JT BQQMJFE UP BO BSHVNFOU BOE BMXBZT
SFUVSOT B SFTVMU #FDBVTF UIFZ BSF CVJMU QVSFMZ PG FYQSFTTJPOT
UIFZ XJMM BMXBZT FWBMVBUF UP UIF TBNF SFTVMU XIFO HJWFO UIF
TBNF WBMVFT
"T JO UIF MBNCEB DBMDVMVT BMM GVODUJPOT JO )BTLFMM UBLF POF
BSHVNFOU BOE SFUVSO POF SFTVMU 5IF XBZ UP UIJOL PG UIJT JT UIBU
JO )BTLFMM XIFO JU TFFNT XF BSF QBTTJOH NVMUJQMF BSHVNFOUT UP
B GVODUJPO XF BSF BDUVBMMZ BQQMZJOH B TFSJFT PG OFTUFE GVODUJPOT
FBDI UP POF BSHVNFOU 5IJT JT DBMMFE DVSSZJOH BOE JU XJMM CF
BEESFTTFE JO HSFBUFS EFUBJM MBUFS
:PV NBZ IBWF OPUJDFE UIBU UIF FYQSFTTJPOT XFƊWF MPPLFE
BU TP GBS VTF MJUFSBM WBMVFT XJUI OP WBSJBCMFT PS BCTUSBDUJPOT
'VODUJPOT BMMPX VT UP BCTUSBDU UIF QBSUT PG DPEF XFƊE XBOU UP
SFVTF GPS EJƵFSFOU MJUFSBM WBMVFT *OTUFBE PG OFTUJOH BEEJUJPO
FYQSFTTJPOT GPS FYBNQMF XF DPVME XSJUF B GVODUJPO UIBU XPVME
BEE UIF WBMVF XF XBOUFE XIFSFWFS XF DBMMFE UIBU GVODUJPO
'PS FYBNQMF TBZ ZPV IBE B CVODI PG TJNQMF FYQSFTTJPOT
ZPV OFFEFE UP NVMUJQMZ CZ  :PV DPVME LFFQ FOUFSJOH UIFN
BT JOEJWJEVBM FYQSFTTJPOT MJLF UIJT
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> (1 + 2) * 3
9
Prelude> (4 + 5) * 3
27
Prelude> (10 + 5) * 3
45

#VU ZPV EPOƊU XBOU UP EP UIBU 'VODUJPOT BSF IPX XF GBDUPS


PVU UIF QBUUFSO JOUP TPNFUIJOH XF DBO SFVTF XJUI EJƵFSFOU JO
QVUT :PV EP UIBU CZ OBNJOH UIF GVODUJPO BOE JOUSPEVDJOH BO
JOEFQFOEFOU WBSJBCMF BT UIF BSHVNFOU UP UIF GVODUJPO 'VOD
UJPOT DBO BMTP BQQFBS JO UIF FYQSFTTJPOT UIBU GPSN UIF CPEJFT
PG PUIFS GVODUJPOT PS CF VTFE BT BSHVNFOUT UP GVODUJPOT KVTU
BT BOZ PUIFS WBMVF DBO CF
*O UIJT DBTF XF IBWF B TFSJFT PG FYQSFTTJPOT UIBU XF XBOU UP
NVMUJQMZ CZ  -FUƊT UIJOL JO UFSNT PG B GVODUJPO XIBU QBSU JT
DPNNPO UP BMM UIF FYQSFTTJPOT 8IBU QBSU WBSJFT 8F LOPX XF
IBWF UP HJWF GVODUJPOT B OBNF BOE BQQMZ UIFN UP BO BSHVNFOU
TP XIBU DPVME XF DBMM UIJT GVODUJPO BOE XIBU TPSU PG BSHVNFOU
NJHIU XF BQQMZ JU UP
5IF DPNNPO QBUUFSO JT UIF * 3 CJU 5IF QBSU UIBU WBSJFT
JT UIF BEEJUJPO FYQSFTTJPO CFGPSF JU TP XF XJMM NBLF UIBU B
WBSJBCMF 8F XJMM OBNF PVS GVODUJPO BOE BQQMZ JU UP UIF WBSJBCMF
8IFO XF JOQVU B WBMVF GPS UIF WBSJBCMF PVS GVODUJPO XJMM
FWBMVBUF UIBU NVMUJQMZ JU CZ  BOE SFUVSO B SFTVMU *O UIF OFYU
TFDUJPO XF XJMM GPSNBMJ[F UIJT JOUP B QSPQFS )BTLFMM GVODUJPO
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

%FƶOJOH GVODUJPOT
'VODUJPO EFƶOJUJPOT BMM TIBSF B GFX UIJOHT JO DPNNPO 'JSTU
UIFZ TUBSU XJUI UIF OBNF PG UIF GVODUJPO 5IJT JT GPMMPXFE CZ
UIF GPSNBM QBSBNFUFST PG UIF GVODUJPO TFQBSBUFE POMZ CZ XIJUF
TQBDF /FYU UIFSF JT BO FRVBM TJHO XIJDI FYQSFTTFT FRVBMJUZ PG
UIF UFSNT 'JOBMMZ UIFSF JT BO FYQSFTTJPO UIBU JT UIF CPEZ PG
UIF GVODUJPO BOE DBO CF FWBMVBUFE UP SFUVSO B WBMVF
%FƶOJOH GVODUJPOT JO B OPSNBM )BTLFMM TPVSDF DPEF ƶMF BOE
JO ()$J BSF B MJUUMF EJƵFSFOU 5P JOUSPEVDF EFƶOJUJPOT PG WBMVFT
PS GVODUJPOT JO ()$J ZPV NVTU VTF let XIJDI MPPLT MJLF UIJT

Prelude> let triple x = x * 3

*O B TPVSDF ƶMF XF XPVME FOUFS JU MJLF UIJT

triple x = x * 3

-FUƊT FYBNJOF FBDI QBSU PG UIBU

triple x = x * 3
-- [1] [2] [3] [ 4 ]

*O QSBDUJDF UIF UFSNT ƉBSHVNFOUƊ BOE ƉQBSBNFUFSƊ BSF PǒFO VTFE JOUFSDIBOHFBCMZ
CVU UIFSF JT B EJƵFSFODF Ɖ"SHVNFOUƊ QSPQFSMZ SFGFST UP UIF WBMVF T
UIBU BSF QBTTFE UP UIF
GVODUJPOƊT QBSBNFUFST XIFO UIF GVODUJPO JT BQQMJFE OPU UP UIF WBSJBCMFT UIBU SFQSFTFOU
UIFN JO UIF GVODUJPO EFƶOJUJPO PS UIPTF JO UIF UZQF TJHOBUVSF
 4FF UIF EFƶOJUJPOT BU UIF
FOE PG UIF DIBQUFS GPS NPSF JOGPSNBUJPO
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

 5IJT JT UIF OBNF PG UIF GVODUJPO XF BSF EFƶOJOH JU JT B


GVODUJPO EFDMBSBUJPO /PUF UIBU JU CFHJOT XJUI B MPXFSDBTF
MFUUFS

 5IJT JT UIF QBSBNFUFS PG UIF GVODUJPO 5IF QBSBNFUFST PG


PVS GVODUJPO DPSSFTQPOE UP UIF ƌIFBEƍ PG B MBNCEB BOE
CJOE WBSJBCMFT UIBU BQQFBS JO UIF CPEZ FYQSFTTJPO

 5IF  JT VTFE UP EFƶOF PS EFDMBSF


WBMVFT BOE GVODUJPOT
3FNJOEFS UIJT JT OPU IPX XF UFTU GPS FRVBMJUZ CFUXFFO
UXP WBMVFT JO )BTLFMM

 5IJT JT UIF CPEZ PG UIF GVODUJPO BO FYQSFTTJPO UIBU DPVME


CF FWBMVBUFE JG UIF GVODUJPO JT BQQMJFE UP B WBMVF *G triple
JT BQQMJFE UIF BSHVNFOU JUƊT BQQMJFE UP XJMM CF UIF WBMVF
UP XIJDI UIF ԧ JT CPVOE )FSF UIF FYQSFTTJPO x * 3 DPOTUJ
UVUFT UIF CPEZ PG UIF GVODUJPO 4P JG ZPV IBWF BO FYQSFT
TJPO MJLF triple 6 ԧ JT CPVOE UP  4JODF ZPVƊWF BQQMJFE UIF
GVODUJPO ZPV DBO BMTP SFQMBDF UIF GVMMZ BQQMJFE GVODUJPO
XJUI JUT CPEZ BOE CPVOE BSHVNFOUT

$BQJUBMJ[BUJPO NBUUFST 'VODUJPO OBNFT TUBSU XJUI MPXFSDBTF


MFUUFST 4PNFUJNFT GPS DMBSJUZ JO GVODUJPO OBNFT ZPV NBZ
XBOU DBNFM$BTF TUZMF BOE UIBU JT HPPE TUZMF QSPWJEFE UIF ƶSTU
MFUUFS SFNBJOT MPXFSDBTF
7BSJBCMFT NVTU BMTP CFHJO XJUI MPXFSDBTF MFUUFST
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

1MBZJOH XJUI UIF USJQMF GVODUJPO 'JSTU USZ FOUFSJOH UIF triple
GVODUJPO EJSFDUMZ JOUP UIF 3&1- VTJOH let /PX DBMM UIF GVOD
UJPO CZ OBNF BOE JOUSPEVDF B OVNFSJD WBMVF GPS UIF ԧ BSHV
NFOU

Prelude> triple 2
6

/FYU FOUFS UIF TFDPOE WFSTJPO UIF POF XJUIPVU let


JOUP B
TPVSDF ƶMF BOE TBWF UIF ƶMF -PBE JU JOUP ()$J VTJOH UIF :load
PS :l DPNNBOE 0ODF JUƊT MPBEFE ZPV DBO DBMM UIF GVODUJPO
BU UIF QSPNQU VTJOH UIF GVODUJPO OBNF triple GPMMPXFE CZ
B OVNFSJD WBMVF KVTU BT ZPV EJE JO UIF 3&1- FYBNQMF BCPWF
5SZ VTJOH EJƵFSFOU WBMVFT GPS ԧ ƈ JOUFHFS WBMVFT PS PUIFS BSJUI
NFUJD FYQSFTTJPOT 5IFO USZ DIBOHJOH UIF GVODUJPO JUTFMG JO
UIF TPVSDF ƶMF BOE SFMPBEJOH JU UP TFF XIBU DIBOHFT

 &WBMVBUJPO
8IFO XF UBML BCPVU FWBMVBUJOH BO FYQSFTTJPO XFƊSF UBMLJOH
BCPVU SFEVDJOH UIF UFSNT VOUJM UIF FYQSFTTJPO SFBDIFT JUT TJN
QMFTU GPSN 0ODF B UFSN IBT SFBDIFE JUT TJNQMFTU GPSN XF TBZ
UIBU JU JT JSSFEVDJCMF PS ƶOJTIFE FWBMVBUJOH 6TVBMMZ XF DBMM
UIJT B WBMVF )BTLFMM VTFT B OPOTUSJDU FWBMVBUJPO TPNFUJNFT
DBMMFE ƌMB[Z FWBMVBUJPOƍ
TUSBUFHZ XIJDI EFGFST FWBMVBUJPO PG
UFSNT VOUJM UIFZƊSF GPSDFE CZ PUIFS UFSNT SFGFSSJOH UP UIFN
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

8F XJMM SFUVSO UP UIJT DPODFQU TFWFSBM UJNFT UISPVHIPVU UIF


CPPL BT JU UBLFT UJNF UP GVMMZ VOEFSTUBOE
7BMVFT BSF JSSFEVDJCMF CVU BQQMJDBUJPOT PG GVODUJPOT UP BS
HVNFOUT BSF SFEVDJCMF 3FEVDJOH BO FYQSFTTJPO NFBOT FWBMV
BUJOH UIF UFSNT VOUJM ZPVƊSF MFǒ XJUI B WBMVF "T JO UIF MBNCEB
DBMDVMVT BQQMJDBUJPO JT FWBMVBUJPO BQQMZJOH B GVODUJPO UP BO
BSHVNFOU BMMPXT FWBMVBUJPO PS SFEVDUJPO
7BMVFT BSF FYQSFTTJPOT CVU DBOOPU CF SFEVDFE GVSUIFS 7BM
VFT BSF B UFSNJOBM QPJOU PG SFEVDUJPO

1
"Icarus"

5IF GPMMPXJOH FYQSFTTJPOT DBO CF SFEVDFE FWBMVBUFE JG ZPV


XJMM
UP B WBMVF

1 + 1
2 * 3 + 1

&BDI DBO CF FWBMVBUFE JO UIF 3&1- XIJDI SFEVDFT UIF FY


QSFTTJPOT BOE UIFO QSJOUT XIBU JU SFEVDFE UP
-FUƊT HFU CBDL UP PVS triple GVODUJPO $BMMJOH UIF GVODUJPO
CZ OBNF BOE BQQMZJOH JU UP BO BSHVNFOU NBLFT JU B SFEVDJCMF
FYQSFTTJPO *O B QVSF GVODUJPOBM MBOHVBHF MJLF )BTLFMM XF DBO
SFQMBDF BQQMJDBUJPOT PG GVODUJPOT XJUI UIFJS EFƶOJUJPOT BOE HFU
UIF TBNF SFTVMU KVTU MJLF JO NBUI "T B SFTVMU XIFO XF TFF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

triple 2

8F DBO LOPX UIBU TJODF USJQMF JT EFƶOFE BT x = x * 3 UIF


FYQSFTTJPO JT FRVJWBMFOU UP

triple 2
-- [triple x = x * 3; x:= 2]
2 * 3
6

8FƊWF BQQMJFE triple UP UIF WBMVF  BOE UIFO SFEVDF UIF


FYQSFTTJPO UP UIF ƶOBM SFTVMU  0VS FYQSFTTJPO triple 2 JT JO
DBOPOJDBM PS OPSNBM GPSN XIFO JU SFBDIFT UIF OVNCFS  CFDBVTF
UIF WBMVF  IBT OP SFNBJOJOH SFEVDJCMF FYQSFTTJPOT
)BTLFMM EPFTOƊU FWBMVBUF FWFSZUIJOH UP DBOPOJDBM PS OPSNBM
GPSN CZ EFGBVMU *OTUFBE JU POMZ FWBMVBUFT UP XFBL IFBE OPS
NBM GPSN 8)/'
CZ EFGBVMU 8FƊMM HFU JOUP UIF EFUBJMT PG XIBU
UIBU NFBOT TPNFXIBU MBUFS JO UIF CPPL 'PS OPX XF XBOU UP
FNQIBTJ[F UIBU )BTLFMMƊT OPOTUSJDU FWBMVBUJPO NFBOT OPU FW
FSZUIJOH XJMM HFU SFEVDFE UP JUT JSSFEVDJCMF GPSN JNNFEJBUFMZ
TP UIJT

(\f -> (1, 2 + f)) 2

SFEVDFT UP UIF GPMMPXJOH JO 8)/'

(1, 2 + 2)
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

5IJT SFQSFTFOUBUJPO JT BO BQQSPYJNBUJPO CVU UIF LFZ QPJOU


IFSF JT UIBU 2 + 2 JT OPU FWBMVBUFE UP 4 VOUJM UIF MBTU QPTTJCMF
NPNFOU

&YFSDJTFT $PNQSFIFOTJPO $IFDL


 (JWFO UIF GPMMPXJOH MJOFT PG DPEF BT UIFZ NJHIU BQQFBS
JO B TPVSDF ƶMF IPX XPVME ZPV DIBOHF UIFN UP VTF UIFN
EJSFDUMZ JO UIF 3&1-

half x = x / 2

square x = x * x

 8SJUF POF GVODUJPO UIBU DBO BDDFQU POF BSHVNFOU BOE


XPSL GPS BMM UIF GPMMPXJOH FYQSFTTJPOT #F TVSF UP OBNF
UIF GVODUJPO

3.14 * (5 * 5)
3.14 * (10 * 10)
3.14 * (2 * 2)
3.14 * (4 * 4)

 5IFSF JT B WBMVF JO 1SFMVEF DBMMFE pi 3FXSJUF ZPVS GVOD


UJPO UP VTF pi JOTUFBE PG 
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

 *OƶY PQFSBUPST


'VODUJPOT JO )BTLFMM EFGBVMU UP QSFƶY TZOUBY NFBOJOH UIBU UIF
GVODUJPO CFJOH BQQMJFE JT BU UIF CFHJOOJOH PG UIF FYQSFTTJPO
SBUIFS UIBO UIF NJEEMF 8F TBX UIBU XJUI PVS triple GVODUJPO
BOE XF TFF JU XJUI TUBOEBSE GVODUJPOT TVDI BT UIF JEFOUJUZ PS
id GVODUJPO 5IJT GVODUJPO KVTU SFUVSOT XIBUFWFS WBMVF JU JT
HJWFO BT BO BSHVNFOU

Prelude> id 1
1

8IJMF UIJT JT UIF EFGBVMU TZOUBY GPS GVODUJPOT OPU BMM GVOD
UJPOT BSF QSFƶY 5IFSF BSF B HSPVQ PG PQFSBUPST TVDI BT UIF
BSJUINFUJD PQFSBUPST XFƊWF CFFO VTJOH UIBU BSF JOEFFE GVOD
UJPOT UIFZ BQQMZ UP BSHVNFOUT UP QSPEVDF BO PVUQVU
CVU BQ
QFBS CZ EFGBVMU JO BO JOƶY QPTJUJPO
0QFSBUPST BSF GVODUJPOT XIJDI DBO CF VTFE JO JOƶY TUZMF
"MM PQFSBUPST BSF GVODUJPOT OPU BMM GVODUJPOT BSF PQFSBUPST
8IJMF triple BOE id BSF QSFƶY GVODUJPOT OPU PQFSBUPST
UIF +
GVODUJPO JT BO JOƶY PQFSBUPS

Prelude> 1 + 1
2

/PX XFƊMM USZ B GFX PUIFS NBUIFNBUJDBM PQFSBUPST


$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> 100 + 100


200
Prelude> 768395 * 21356345
16410108716275
Prelude> 123123 / 123
1001.0
Prelude> 476 - 36
440
Prelude> 10 / 4
2.5

:PV DBO TPNFUJNFT VTF GVODUJPOT JOƶY TUZMF XJUI B TNBMM


DIBOHF JO TZOUBY

Prelude> 10 `div` 4
2
Prelude> div 10 4
2

"OE ZPV DBO VTF JOƶY PQFSBUPST JO QSFƶY GBTIJPO CZ XSBQ


QJOH UIFN JO QBSFOUIFTFT

Prelude> (+) 100 100


200
Prelude> (*) 768395 21356345
16410108716275
Prelude> (/) 123123 123
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

1001.0

*G UIF GVODUJPO OBNF JT BMQIBOVNFSJD JU JT B QSFƶY GVODUJPO


CZ EFGBVMU BOE OPU BMM QSFƶY GVODUJPOT DBO CF NBEF JOƶY *G
UIF OBNF JT B TZNCPM JU JT JOƶY CZ EFGBVMU CVU DBO CF NBEF
QSFƶY CZ XSBQQJOH JU JO QBSFOUIFTFT

"TTPDJBUJWJUZ BOE QSFDFEFODF


"T ZPV NBZ SFNFNCFS GSPN ZPVS NBUI DMBTTFT UIFSFƊT B EF
GBVMU BTTPDJBUJWJUZ BOE QSFDFEFODF UP UIF JOƶY PQFSBUPST (*)
(+) (-) BOE (/)
8F DBO BTL ()$J GPS JOGPSNBUJPO TVDI BT BTTPDJBUJWJUZ BOE
QSFDFEFODF PG PQFSBUPST BOE GVODUJPOT CZ VTJOH UIF :info DPN
NBOE 8IFO ZPV BTL ()$J GPS UIF :info BCPVU BO PQFSBUPS
PS GVODUJPO JU QSPWJEFT UIF UZQF JOGPSNBUJPO *U BMTP UFMMT ZPV
XIFUIFS JUƊT BO JOƶY PQFSBUPS BOE JG JU JT JUT BTTPDJBUJWJUZ BOE
QSFDFEFODF -FUƊT UBML BCPVU UIBU BTTPDJBUJWJUZ BOE QSFDFEFODF
CSJFƷZ 8F XJMM FMJEF UIF UZQF JOGPSNBUJPO BOE TP GPSUI GPS
OPX
)FSFƊT XIBU UIF DPEF JO 1SFMVEF TBZT GPS (*) (+) BOE (-) BU
UJNF PG XSJUJOH

'PS QFPQMF XIP MJLF OJUQJDLZ EFUBJMT ZPV DBOOPU NBLF B QSFƶY GVODUJPO JOUP BO JOƶY
GVODUJPO VTJOH CBDLUJDLT UIFO XSBQ UIBU JO QBSFOUIFTFT BOE NBLF JU JOUP B QSFƶY GVODUJPO
8FƊSF OPU DMFBS XIZ ZPVƊE XBOU UP EP UIBU BOZXBZ $VU JU PVU
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

:info (*)
infixl 7 *
-- [1] [2] [3]

:info (+) (-)


infixl 6 +

infixl 6 -

 infixl NFBOT JUƊT BO JOƶY PQFSBUPS MFǒ BTTPDJBUJWF

  JT UIF QSFDFEFODF IJHIFS JT BQQMJFE ƶSTU PO B TDBMF PG




 *OƶY GVODUJPO OBNF JO UIJT DBTF NVMUJQMJDBUJPO

5IF JOGPSNBUJPO BCPVU BEEJUJPO BOE TVCUSBDUJPO UFMM VT UIFZ


BSF CPUI MFǒBTTPDJBUJWF JOƶY PQFSBUPST XJUI UIF TBNF QSFDF
EFODF 

-FUƊT QMBZ XJUI QBSFOUIFTFT BOE TFF XIBU JU NFBOT UIBU UIFTF
BTTPDJBUF UP UIF MFǒ $POUJOVF UP GPMMPX BMPOH XJUI UIF DPEF
WJB UIF 3&1-
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

-- this
2 * 3 * 4

-- is evaluated as if it was
(2 * 3) * 4
-- Because of left-associativity from infixl

)FSFƊT BO FYBNQMF PG B SJHIUBTTPDJBUJWF JOƶY PQFSBUPS

Prelude> :info (^)


infixr 8 ^
-- [1] [2] [3]

 infixr NFBOT JOƶY PQFSBUPS SJHIU BTTPDJBUJWF

  JT UIF QSFDFEFODF )JHIFS QSFDFEFODF JOEJDBUFE CZ


IJHIFS OVNCFST JT BQQMJFE ƶSTU TP UIJT JT IJHIFS QSFDF
EFODF UIBO NVMUJQMJDBUJPO 
BEEJUJPO PS TVCUSBDUJPO
CPUI 


 *OƶY GVODUJPO OBNF JO UIJT DBTF FYQPOFOUJBUJPO

*U XBT IBSE UP UFMM XJUI NVMUJQMJDBUJPO XIZ BTTPDJBUJWJUZ NBU


UFSFE CFDBVTF NVMUJQMJDBUJPO JT BTTPDJBUJWF 4P TIJǒJOH UIF
QBSFOUIFTFT BSPVOE OFWFS DIBOHFT UIF SFTVMU &YQPOFOUJBUJPO
IPXFWFS JT OPU BTTPDJBUJWF BOE UIVT NBLFT B QSJNF DBOEJEBUF
GPS EFNPOTUSBUJOH MFǒ WT SJHIU BTTPDJBUJWJUZ
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> 2 ^ 3 ^ 4
2417851639229258349412352
Prelude> 2 ^ (3 ^ 4)
2417851639229258349412352
Prelude> (2 ^ 3) ^ 4
4096

"T ZPV DBO TFF BEEJOH QBSFOUIFTFT TUBSUJOH GSPN UIF SJHIU
IBOE TJEF PG UIF FYQSFTTJPO XIFO UIF PQFSBUPS JT SJHIUBTTPDJBUJWF
EPFTOƊU DIBOHF BOZUIJOH )PXFWFS JG XF QBSFOUIFTJ[F GSPN
UIF MFǕ XF HFU B EJƵFSFOU SFTVMU XIFO UIF FYQSFTTJPO JT FWBMV
BUFE
:PVS JOUVJUJPOT BCPVU QSFDFEFODF BTTPDJBUJWJUZ BOE QBSFO
UIFTJ[BUJPO GSPN NBUI DMBTTFT XJMM HFOFSBMMZ IPME JO )BTLFMM

2 + 3 * 4

(2 + 3) * 4

8IBUƊT UIF EJƵFSFODF CFUXFFO UIFTF UXP 8IZ BSF UIFZ


EJƵFSFOU

&YFSDJTFT 1BSFOUIFTFT BOE "TTPDJBUJPO


#FMPX BSF TPNF QBJST PG GVODUJPOT UIBU BSF BMJLF FYDFQU GPS
QBSFOUIFTJ[BUJPO 3FBE UIFN DBSFGVMMZ BOE EFDJEF JG UIF QBSFO
UIFTFT DIBOHF UIF SFTVMUT PG UIF GVODUJPO $IFDL ZPVS XPSL JO
()$J
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

 B
8 + 7 * 9
C
(8 + 7) * 9

 B
perimeter x y = (x * 2) + (y * 2)
C
perimeter x y = x * 2 + y * 2

 B
f x = x / 2 + 9
C
f x = x / (2 + 9)

 %FDMBSJOH WBMVFT


5IF PSEFS PG EFDMBSBUJPOT JO B TPVSDF DPEF ƶMF EPFTOƊU NBUUFS
CFDBVTF ()$J MPBET UIF FOUJSF ƶMF BU PODF TP JU LOPXT BMM UIF
WBMVFT UIBU IBWF CFFO EFƶOFE 0O UIF PUIFS IBOE XIFO ZPV
FOUFS UIFN POF CZ POF JOUP UIF 3&1- UIF PSEFS EPFT NBUUFS
'PS FYBNQMF XF DBO EFDMBSF B TFSJFT PG FYQSFTTJPOT JO UIF
3&1- MJLF UIJT

Prelude> let y = 10
Prelude> let x = 10 * 5 + y
Prelude> let myResult = x * 5

"T XF TBX BCPWF XJUI UIF triple GVODUJPO XF IBWF UP VTF


let UP EFDMBSF TPNFUIJOH JO UIF 3&1-
8F DBO OPX UZQF UIF OBNFT PG UIF WBMVFT BOE IJU FOUFS UP
TFF UIFJS WBMVFT
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> x
60
Prelude> y
10
Prelude> myResult
300

5P EFDMBSF UIF TBNF WBMVFT JO B ƶMF TVDI BT learn.hs XF


XSJUF UIF GPMMPXJOH

-- learn.hs

module Learn where


-- First, we declare the name of our module so
-- it can be imported by name in a project.
-- We won't be doing a project of this size
-- for a while yet.

x = 10 * 5 + y

myResult = x * 5

y = 10

3FNFNCFS NPEVMF OBNFT BSF DBQJUBMJ[FE VOMJLF WBSJBCMF


OBNFT "MTP JO UIJT WBSJBCMF OBNF XFƊWF VTFE DBNFM$BTF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

UIF ƶSTU MFUUFS JT TUJMM MPXFSDBTF CVU XF VTF BO VQQFSDBTF UP


EFMJOFBUF B XPSE CPVOEBSZ GPS SFBEBCJMJUZ

5SPVCMFTIPPUJOH
*U JT FBTZ UP NBLF NJTUBLFT JO UIF QSPDFTT PG UZQJOH learn.hs
JOUP ZPVS FEJUPS 8FƊMM MPPL BU B GFX DPNNPO NJTUBLFT JO
UIJT TFDUJPO 0OF UIJOH UP LFFQ JO NJOE JT UIBU JOEFOUBUJPO PG
)BTLFMM DPEF JT TJHOJƶDBOU BOE DBO DIBOHF UIF NFBOJOH PG UIF
DPEF *ODPSSFDU JOEFOUBUJPO PG DPEF DBO BMTP CSFBL ZPVS DPEF
3FNJOEFS VTF TQBDFT OPU UBCT UP JOEFOU ZPVS TPVSDF DPEF
*O HFOFSBM XIJUFTQBDF JT TJHOJƶDBOU JO )BTLFMM &ƸDJFOU
VTF PG XIJUFTQBDF NBLFT UIF TZOUBY NPSF DPODJTF 5IJT DBO
UBLF TPNF HFUUJOH VTFE UP JG ZPVƊWF CFFO XPSLJOH JO BOPUIFS
QSPHSBNNJOH MBOHVBHF 8IJUFTQBDF JT PǒFO UIF POMZ NBSL PG
B GVODUJPO DBMM VOMFTT QBSFOUIFTFT BSF OFDFTTBSZ EVF UP DPO
ƷJDUJOH QSFDFEFODF 5SBJMJOH XIJUFTQBDF UIBU JT FYUSBOFPVT
XIJUFTQBDF BU UIF FOE PG MJOFT PG DPEF JT DPOTJEFSFE CBE TUZMF

*O TPVSDF DPEF ƶMFT JOEFOUBUJPO PǒFO SFQMBDFT TZOUBDUJD


NBSLFST MJLF DVSMZ CSBDLFUT TFNJDPMPOT BOE QBSFOUIFTFT 5IF
CBTJD SVMF JT UIBU DPEF UIBU JT QBSU PG BO FYQSFTTJPO TIPVME CF
JOEFOUFE VOEFS UIF CFHJOOJOH PG UIBU FYQSFTTJPO FWFO XIFO
UIF CFHJOOJOH PG UIF FYQSFTTJPO JT OPU BU UIF MFǒNPTU NBSHJO
'VSUIFSNPSF QBSUT PG UIF FYQSFTTJPO UIBU BSF HSPVQFE TIPVME
CF JOEFOUFE UP UIF TBNF MFWFM 'PS FYBNQMF JO B CMPDL PG DPEF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

JOUSPEVDFE CZ let PS do ZPV NJHIU TFF TPNFUIJOH MJLF UIJT

let
x = 3
y = 4

-- or

let x = 3
y = 4

-- Note that this code won't work directly in a


-- source file without embedding in a
-- top-level declaration

/PUJDF UIBU UIF UXP EFƶOJUJPOT UIBU BSF QBSU PG UIF FYQSFTTJPO
MJOF VQ JO FJUIFS DBTF *U JT JODPSSFDU UP XSJUF

let x = 3
y = 4

-- or

let
x = 3
y = 4
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

*G ZPV IBWF BO FYQSFTTJPO UIBU IBT NVMUJQMF QBSUT ZPVS


JOEFOUBUJPO XJMM GPMMPX B QBUUFSO MJLF UIJT

foo x =
let y = x * 2
z = x ^ 2
in 2 * y * z

/PUJDF UIBU UIF EFƶOJUJPOT PG Ԩ BOE ԩ MJOF VQ BOE UIF EFG


JOJUJPOT PG let BOE in BSF BMTP BMJHOFE "T ZPV XPSL UISPVHI UIF
CPPL USZ UP QBZ DBSFGVM BUUFOUJPO UP UIF JOEFOUBUJPO QBUUFSOT BT
XF IBWF UIFN QSJOUFE 5IFSF BSF NBOZ DBTFT XIFSF JNQSPQFS
JOEFOUBUJPO XJMM BDUVBMMZ DBVTF DPEF OPU UP XPSL *OEFOUBUJPO
DBO FBTJMZ HP XSPOH JO B DPQZBOEQBTUF KPC BT XFMM
"MTP XIFO ZPV XSJUF )BTLFMM DPEF XF SFJUFSBUF IFSF UIBU
ZPV XBOU UP VTF TQBDFT BOE OPU UBCT GPS JOEFOUBUJPO 6TJOH
TQBDFT XJMM TBWF ZPV B OPOUSJWJBM BNPVOU PG HSJFG .PTU UFYU
FEJUPST DBO CF DPOƶHVSFE UP VTF POMZ TQBDFT GPS JOEFOUBUJPO
TP ZPV NBZ XBOU UP JOWFTUJHBUF IPX UP EP UIBU GPS ZPVST
*G ZPV NBLF B NJTUBLF MJLF CSFBLJOH VQ UIF EFDMBSBUJPO PG ԧ
TVDI UIBU UIF SFTU PG UIF FYQSFTTJPO CFHBO BU UIF CFHJOOJOH PG
UIF OFYU MJOF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

module Learn where


-- First declare the name of our module so it
-- can be imported by name in a project.
-- We won't do this for a while yet.

x = 10
* 5 + y

myResult = x * 5

y = 10

:PV NJHIU TFF BO FSSPS MJLF

Prelude> :l code/learn.hs
[1 of 1] Compiling Learn

code/learn.hs:10:1: parse error on input ‘*’


Failed, modules loaded: none.

/PUF UIBU UIF ƶSTU MJOF PG UIF FSSPS NFTTBHF UFMMT ZPV XIFSF
UIF FSSPS PDDVSSFE code/learn.hs:10:1 JOEJDBUFT UIBU UIF NJT
UBLF JT JO MJOF  DPMVNO  PG UIF OBNFE ƶMF 5IBU DBO NBLF JU
FBTJFS UP ƶOE UIF QSPCMFN UIBU OFFET UP CF ƶYFE 1MFBTF OPUF
UIBU UIF FYBDU MJOF BOE DPMVNO OVNCFST JO ZPVS PXO FSSPS
NFTTBHFT NJHIU CF EJƵFSFOU GSPN PVST EFQFOEJOH PO IPX
ZPVƊWF FOUFSFE UIF DPEF JOUP UIF ƶMF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

5IF XBZ UP ƶY UIJT JT UP FJUIFS QVU JU BMM PO POF MJOF MJLF UIJT

x = 10 * 5 + y

PS UP NBLF DFSUBJO XIFO ZPV CSFBL VQ MJOFT PG DPEF UIBU UIF


TFDPOE MJOF CFHJOT BU MFBTU POF TQBDF GSPN UIF CFHJOOJOH PG
UIBU MJOF FJUIFS PG UIF GPMMPXJOH TIPVME XPSL


x = 10
* 5 + y

-- or

x = 10
* 5 + y

5IF TFDPOE POF MPPLT B MJUUMF CFUUFS (FOFSBMMZ ZPV TIPVME


SFTFSWF CSFBLJOH VQ PG MJOFT GPS XIFO ZPV IBWF DPEF FYDFFEJOH
 DPMVNOT JO XJEUI
"OPUIFS QPTTJCMF FSSPS JT OPU TUBSUJOH B EFDMBSBUJPO BU UIF
CFHJOOJOH MFǒ
DPMVNO PG UIF MJOF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

-- learn.hs

module Learn where

x = 10 * 5 + y

myResult = x * 5

y = 10

4FF UIBU TQBDF CFGPSF ԧ 5IBU XJMM DBVTF BO FSSPS MJLF

Prelude> :l code/learn.hs
[1 of 1] Compiling Learn

code/learn.hs:11:1: parse error on input ‘myResult’


Failed, modules loaded: none.

5IJT NBZ DPOGVTF ZPV BT myResult JT OPU XIFSF ZPV OFFE UP


NPEJGZ ZPVS DPEF 5IF FSSPS JT POMZ BO FYUSBOFPVT TQBDF CVU
BMM EFDMBSBUJPOT JO UIF NPEVMF NVTU TUBSU BU UIF TBNF DPMVNO
5IF DPMVNO UIBU BMM EFDMBSBUJPOT XJUIJO B NPEVMF NVTU TUBSU
JO JT EFUFSNJOFE CZ UIF ƶSTU EFDMBSBUJPO JO UIF NPEVMF *O UIJT
DBTF UIF FSSPS NFTTBHF HJWFT B MPDBUJPO UIBU JT EJƵFSFOU GSPN
XIFSF ZPV TIPVME ƶY UIF QSPCMFN CFDBVTF BMM UIF DPNQJMFS
LOPXT JT UIBU UIF EFDMBSBUJPO PG ԧ NBEF B TJOHMF TQBDF UIF BQ
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

QSPQSJBUF JOEFOUBUJPO GPS BMM EFDMBSBUJPOT XJUIJO UIBU NPEVMF


BOE UIF EFDMBSBUJPO PG myResult CFHBO B DPMVNO UPP FBSMZ
*U JT QPTTJCMF UP ƶY UIJT FSSPS CZ JOEFOUJOH UIF myResult BOE
Ԩ EFDMBSBUJPOT UP UIF TBNF MFWFM BT UIF JOEFOUFE ԧ EFDMBSBUJPO

-- learn.hs

module Learn where

x = 10 * 5 + y

myResult = x * 5

y = 10

)PXFWFS UIJT JT DPOTJEFSFE CBE TUZMF BOE JT OPU TUBOEBSE


)BTLFMM QSBDUJDF 5IFSF JT BMNPTU OFWFS B HPPE SFBTPO UP JOEFOU
BMM ZPVS EFDMBSBUJPOT JO UIJT XBZ CVU OPUJOH UIJT HJWFT VT TPNF
JEFB PG IPX UIF DPNQJMFS JT SFBEJOH UIF DPEF *U JT CFUUFS XIFO
DPOGSPOUFE XJUI BO FSSPS NFTTBHF MJLF UIJT UP NBLF TVSF UIBU
ZPVS ƶSTU EFDMBSBUJPO JT BU UIF MFǒNPTU NBSHJO BOE QSPDFFE
GSPN UIFSF
"OPUIFS QPTTJCMF NJTUBLF JT UIBU ZPV NJHIUƊWF NJTTFE UIF
TFDPOE - JO UIF -- VTFE UP DPNNFOU PVU TPVSDF MJOFT PG DPEF
4P UIJT DPEF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

- learn.hs

module Learn where


-- First declare the name of our module so it
-- can be imported by name in a project.
-- We won't do this for a while yet.

x = 10 * 5 + y

myResult = x * 5

y = 10

XJMM DBVTF UIJT FSSPS

code/learn.hs:7:1: parse error on input ‘module’


Failed, modules loaded: none.

/PUF BHBJO UIBU JU TBZT UIF QBSTF FSSPS PDDVSSFE BU UIF CF
HJOOJOH PG UIF NPEVMF EFDMBSBUJPO CVU UIF JTTVF JT BDUVBMMZ
UIBU - learn.hs IBE POMZ POF - XIFO JU OFFEFE UXP UP GPSN B
TZOUBDUJDBMMZ DPSSFDU )BTLFMM DPNNFOU
/PX XF DBO TFF IPX UP XPSL XJUI DPEF UIBU JT TBWFE JO B
TPVSDF ƶMF GSPN ()$J XJUIPVU NBOVBMMZ DPQZJOH BOE QBTUJOH
UIF EFƶOJUJPOT JOUP PVS 3&1- "TTVNJOH XF PQFO PVS 3&1-
JO UIF TBNF EJSFDUPSZ BT XF IBWF learn.hs TBWFE XF DBO EP UIF
GPMMPXJOH
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> :load learn.hs


[1 of 1] Compiling Learn
Ok, modules loaded: Learn.
Prelude> x
60
Prelude> y
10
Prelude> myResult
300

&YFSDJTFT )FBM UIF 4JDL


5IF GPMMPXJOH DPEF TBNQMFT BSF CSPLFO BOE XPOƊU DPNQJMF
5IF ƶSTU UXP BSF BT ZPV NJHIU FOUFS JOUP UIF 3&1- UIF UIJSE
JT GSPN B TPVSDF ƶMF 'JOE UIF NJTUBLFT BOE ƶY UIFN TP UIBU
UIFZ XJMM

 let area x = 3. 14 * (x * x)

 let double x = b * 2

 x = 7
y = 10
f = x + y
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

 "SJUINFUJD GVODUJPOT JO )BTLFMM


5IJT TFDUJPO XJMM FYQMPSF TPNF CBTJD BSJUINFUJD VTJOH TPNF
DPNNPO PQFSBUPST BOE GVODUJPOT GPS BSJUINFUJD 8FƊMM GPDVT
PO UIF GPMMPXJOH TVCTFU PG UIFN

0QFSBUPS /BNF 1VSQPTFBQQMJDBUJPO


QMVT BEEJUJPO
 NJOVT TVCUSBDUJPO
BTUFSJTL NVMUJQMJDBUJPO
 TMBTI GSBDUJPOBM EJWJTJPO
EJW EJWJEF JOUFHSBM EJWJTJPO SPVOE EPXO
NPE NPEVMP MJLF ƉSFNƊ CVU BǒFS NPEVMBS EJWJTJPO
RVPU RVPUJFOU JOUFHSBM EJWJTJPO SPVOE UPXBSET [FSP
SFN SFNBJOEFS SFNBJOEFS BǒFS EJWJTJPO

"U UIF SJTL PG TUBUJOH UIF PCWJPVT ƌJOUFHSBMƍ EJWJTJPO SFGFST


UP EJWJTJPO PG JOUFHFST #FDBVTF JUƊT JOUFHSBM BOE OPU GSBDUJPOBM
JU UBLFT JOUFHFST BT BSHVNFOUT BOE SFUVSOT JOUFHFST BT SFTVMUT
5IBUƊT XIZ UIF SFTVMUT BSF SPVOEFE
)FSFƊT BO FYBNQMF PG FBDI JO UIF 3&1-

Prelude> 1 + 1
2
Prelude> 1 - 1
0
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> 1 * 1
1
Prelude> 1 / 1
1.0
Prelude> div 1 1
1
Prelude> mod 1 1
0
Prelude> quot 1 1
1
Prelude> rem 1 1
0

:PV XJMM VTVBMMZ XBOU div GPS JOUFHSBM EJWJTJPO VOMFTT ZPV
LOPX XIBU ZPVƊSF EPJOH EVF UP UIF XBZ div BOE quot SPVOE

-- rounds down
Prelude> div 20 (-6)
-4

-- rounds toward zero


Prelude> quot 20 (-6)
-3

"MTP rem BOE mod IBWF TMJHIUMZ EJƵFSFOU VTF DBTFT XFƊMM MPPL
BU mod JO B MJUUMF NPSF EFUBJM EPXO CFMPX 8F XJMM DPWFS (/)
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

JO NPSF EFUBJM JO B MBUFS DIBQUFS BT UIBU XJMM SFRVJSF TPNF


FYQMBOBUJPO PG UZQFT BOE UZQFDMBTTFT

-BXT GPS RVPUJFOUT BOE SFNBJOEFST


1SPHSBNNJOH PǒFO NBLFT VTF PG NPSF EJWJTJPO BOE SFNBJO
EFS GVODUJPOT UIBO TUBOEBSE BSJUINFUJD EPFT BOE JUƊT IFMQGVM UP
CF GBNJMJBS XJUI UIF MBXT BCPVU RVPUSFN BOE EJWNPE 8FƊMM
UBLF B MPPL BU UIPTF IFSF

(quot x y)*y + (rem x y) == x

(div x y)*y + (mod x y) == x

8F XPOƊU XBML UISPVHI B QSPPG FYFSDJTF CVU XF DBO EFNPO


TUSBUF UIFTF MBXT B CJU

(quot x y)*y + (rem x y)

Given x is 10 and y is (-4)

(quot 10 (-4))*(-4) + (rem 10 (-4))

quot 10 (-4) == (-2) and rem 10 (-4) == 2


'SPN -FOOBSU "VHVTUTTPOƊT CMPH http://augustss.blogspot.com/ PS 4UBDL 0WFSƷPX
BOTXFS BU http://stackoverflow.com/a/8111203
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

(-2)*(-4) + (2) == 10

10 == x == yeppers.

*UƊT OPU XPSUI HFUUJOH PWFSMZ JOWFTUFE JO UIF NFBOJOH PG


ƌZFQQFSTƍ UIFSF JU KVTU NFBOT XF HPU UP UIF SFTVMU XF XBOUFE
/PX GPS div BOE mod

(div x y)*y + (mod x y)

Given x is 10 and y is (-4)

(div 10 (-4))*(-4) + (mod 10 (-4))

div 10 (-4) == (-3) and mod 10 (-4) == -2

(-3)*(-4) + (-2) == 10

10 == x == yeppers.

0VS SFTVMU JOEJDBUFT BMM JT XFMM JO UIF XPSME PG JOUFHSBM EJWJ


TJPO

6TJOH ƉNPEƉ
5IJT TFDUJPO JT OPU B GVMM EJTDVTTJPO PG NPEVMBS BSJUINFUJD CVU
XF XBOU UP HJWF NPSF EJSFDUJPO JO IPX UP VTF mod JO HFOFSBM
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

GPS UIPTF XIP NBZ CF VOGBNJMJBS XJUI JU BOE IPX JU XPSLT JO


)BTLFMM TQFDJƶDBMMZ
8FƊWF BMSFBEZ NFOUJPOFE UIBU mod HJWFT UIF SFNBJOEFS PG
B NPEVMBS EJWJTJPO *G ZPVƊSF OPU BMSFBEZ GBNJMJBS XJUI NPE
VMBS EJWJTJPO ZPV NBZ OPU VOEFSTUBOE UIF VTFGVM EJƵFSFODF
CFUXFFO mod BOE rem
.PEVMBS BSJUINFUJD JT B TZTUFN PG BSJUINFUJD GPS JOUFHFST
XIFSF OVNCFST ƌXSBQ BSPVOEƍ VQPO SFBDIJOH B DFSUBJO WBMVF
DBMMFE UIF NPEVMVT *U JT PǒFO FYQMBJOFE JO UFSNT PG B DMPDL
8IFO XF DPVOU UJNF CZ B IPVS DMPDL XF IBWF UP XSBQ
UIF DPVOUJOH BSPVOE UIF  'PS FYBNQMF JG UIF UJNF JT OPX
 BOE ZPV XBOU UP LOPX XIBU UJNF JU XJMM CF  IPVST GSPN
OPX ZPV EPOƊU TJNQMZ BEE   BOE HFU B SFTVMU PG  PƊDMPDL
*OTUFBE ZPV XSBQ UIF DPVOU BSPVOE FWFSZ  IPVST 4P
BEEJOH  IPVST UP  NFBOT UIBU XF BEE  IPVST UP HFU UP
UIF  BOE BU UIF  XF TUBSU PWFS BHBJO BT JG JUƊT  BOE BEE UIF
SFNBJOJOH  IPVST PG PVS  GPS BO BOTXFS PG  5IBU JT 
IPVST BǒFS  JT 
5IJT JT BSJUINFUJD NPEVMP  *O PVS IPVS DMPDL  JT
FRVJWBMFOU UP CPUI JUTFMG BOE UP  TP UIF UJNF BU  JT BMTP
JO TPNF TFOTF  "SJUINFUJD NPEVMP  NFBOT UIBU  JT
CPUI  BOE 
0ǒFO UIJT XJMM HJWF ZPV UIF TBNF BOTXFS UIBU rem EPFT

0CWJPVTMZ XJUI B IPVS DMPDL TVDI B UJNF JT QPTTJCMF IPXFWFS JG XF XFSF TUBSUJOH
GSPN  QN BOE USZJOH UP ƶOE UIF UJNF  IPVST MBUFS UIF BOTXFS XPVME OPU CF 
BN " IPVS DMPDL IBT B EJƵFSFOU NPEVMVT UIBO B IPVS DMPDL
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> mod 15 12
3
Prelude> rem 15 12
3

Prelude> mod 21 12
9
Prelude> rem 21 12
9

Prelude> mod 3 12
3
Prelude> rem 3 12
3

*G ZPVƊSF XPOEFSJOH XIBU UIF EFBM JT XJUI UIF MBTU UXP FY
BNQMFT JUƊT CFDBVTF mod BOE rem DBO POMZ SFQSFTFOU JOUFHSBM
EJWJTJPO *G BMM ZPV IBWF UP XPSL XJUI JT JOUFHFST UIFO EJWJEJOH
B TNBMMFS OVNCFS CZ B MBSHFS OVNCFS SFTVMUT JO BO BOTXFS PG
 XJUI B SFNBJOEFS PG XIBUFWFS UIF TNBMMFS OVNCFS UIF EJWJ
EFOE
JT *G ZPV XBOU UP EJWJEF B TNBMMFS OVNCFS CZ B MBSHFS
OVNCFS BOE SFUVSO B GSBDUJPOBM BOTXFS UIFO ZPV OFFE UP VTF
(/) BOE ZPV XPOƊU IBWF B SFNBJOEFS
-FUƊT TBZ XF OFFE UP XSJUF B GVODUJPO UIBU XJMM EFUFSNJOF
XIBU EBZ PG UIF XFFL JU XBT PS XJMM CF B DFSUBJO OVNCFS PG
EBZT CFGPSF PS BǒFS UIJT POF 'PS PVS QVSQPTFT IFSF XF XJMM
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

BTTJHO B OVNCFS UP FBDI EBZ PG UIF XFFL VTJOH  UP SFQSFTFOU


4VOEBZ 5IFO JG UPEBZ JT .POEBZ BOE XF XBOU UP LOPX XIBU
EBZ PG UIF XFFL JU XJMM CF  EBZT GSPN OPX XF DPVME EP UIJT

Prelude> mod (1 + 23) 7


3

5IF  SFQSFTFOUT .POEBZ UIF DVSSFOU EBZ XIJMF  JT UIF


OVNCFS PG EBZT XFƊSF USZJOH UP BEE 6TJOH mod UP XSBQ JU BSPVOE
UIF  NFBOT JU XJMM SFUVSO B OVNCFS UIBU DPSSFTQPOET UP B EBZ
PG UIF XFFL JO PVS OVNCFSJOH
"OE  EBZT GSPN 4BUVSEBZ XJMM CF 5IVSTEBZ

Prelude> mod (6 + 5) 7
4

8F DBO VTF rem UP EP UIF TBNF UIJOH XJUI BQQBSFOUMZ FRVJW


BMFOU BDDVSBDZ

Prelude> rem (1 + 23) 7


3

)PXFWFS JG XF XBOU UP TVCUSBDU BOE ƶOE PVU XIBU EBZ PG


UIF XFFL JU XBT TPNF OVNCFS PG EBZT BHP UIFO XFƊMM TFF B
EJƵFSFODF -FUƊT USZ BTLJOH JG UPEBZ JT 8FEOFTEBZ 
XIBU
EBZ JU XBT  EBZT BHP

4VSF ZPV NBZ OBUVSBMMZ UIJOL PG UIF EBZT PG XFFL BT CFJOH OVNCFSFE  #VU
QSPHSBNNFST MJLF UP JOEFY UIJOHT GSPN [FSP
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> mod (3 - 12) 7


5
Prelude> rem (3 - 12) 7
-2

5IF WFSTJPO XJUI mod HJWFT VT B DPSSFDU BOTXFS XIJMF UIF rem
WFSTJPO EPFT OPU
0OF LFZ EJƵFSFODF IFSF JT UIBU JO )BTLFMM OPU JO BMM MBO
HVBHFT
JG POF PS CPUI BSHVNFOUT BSF OFHBUJWF UIF SFTVMUT PG
mod XJMM IBWF UIF TBNF TJHO BT UIF EJWJTPS XIJMF UIF SFTVMU PG
rem XJMM IBWF UIF TBNF TJHO BT UIF EJWJEFOE

Prelude> (-5) `mod` 2


1
Prelude> 5 `mod` (-2)
-1
Prelude> (-5) `mod` (-2)
-1

-- but

Prelude> (-5) `rem` 2


-1
Prelude> 5 `rem` (-2)
1
Prelude> (-5) `rem` (-2)
-1
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

'JHVSJOH PVU XIFO ZPV OFFE mod UBLFT TPNF FYQFSJFODF BOE
JU NBZ OPU CF PCWJPVT SJHIU OPX #VU ZPV XJMM OFFE JU MBUFS JO
UIF CPPL

/FHBUJWF OVNCFST
%VF UP UIF JOUFSBDUJPO PG QBSFOUIFTFT DVSSZJOH BOE JOƶY TZO
UBY OFHBUJWF OVNCFST HFU TQFDJBM USFBUNFOU JO )BTLFMM
*G ZPV XBOU B WBMVF UIBU JT B OFHBUJWF OVNCFS CZ JUTFMG UIJT
XJMM XPSL KVTU ƶOF

Prelude> -1000
-1000

)PXFWFS UIJT XJMM OPU XPSL JO TPNF DBTFT

Prelude> 1000 + -9
<interactive>:3:1:
Precedence parsing error
cannot mix ‘+’ [infixl 6] and
prefix `-` [infixl 6]
in the same infix expression

'PSUVOBUFMZ XF XFSF UPME BCPVU PVS NJTUBLF CFGPSF BOZ


PG PVS DPEF XBT FYFDVUFE /PUF IPX UIF FSSPS NFTTBHF UFMMT
ZPV UIF QSPCMFN IBT UP EP XJUI QSFDFEFODF "EEJUJPO BOE
TVCUSBDUJPO IBWF UIF TBNF QSFDFEFODF 
BOE ()$J UIJOLT
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

XF BSF USZJOH UP BEE BOE TVCUSBDU OPU BEE B OFHBUJWF OVNCFS


TP JU EPFTOƊU LOPX IPX UP SFTPMWF UIF QSFDFEFODF BOE FWBMVBUF
UIF FYQSFTTJPO 8F OFFE UP NBLF B TNBMM DIBOHF CFGPSF XF
DBO BEE B QPTJUJWF BOE B OFHBUJWF OVNCFS UPHFUIFS

Prelude> 1000 + (-9)


991

5IF OFHBUJPO PG OVNCFST JO )BTLFMM CZ UIF VTF PG B VOBSZ -


JT B GPSN PG TZOUBDUJD TVHBS 4ZOUBY JT UIF HSBNNBS BOE TUSVD
UVSF PG UIF UFYU XF VTF UP FYQSFTT QSPHSBNT BOE TZOUBDUJD
TVHBS JT B NFBOT GPS VT UP NBLF UIBU UFYU FBTJFS UP SFBE BOE
XSJUF 4ZOUBDUJD TVHBS DBO NBLF UIF UZQJOH PS SFBEJOH PG DPEF
OJDFS CVU DIBOHFT OPUIJOH BCPVU UIF TFNBOUJDT PS NFBOJOH PG
QSPHSBNT BOE EPFTOƊU DIBOHF IPX XF TPMWF QSPCMFNT JO DPEF
5ZQJDBMMZ XIFO DPEF XJUI TZOUBDUJD TVHBS JT QSPDFTTFE CZ PVS
3&1- PS DPNQJMFS B TJNQMF USBOTGPSNBUJPO GSPN UIF TIPSUFS
ƌTXFFUFSƍ
GPSN UP B NPSF WFSCPTF USVFS SFQSFTFOUBUJPO JT
QFSGPSNFE BǒFS UIF DPEF IBT CFFO QBSTFE
*O UIF TQFDJƶD DBTF PG - UIF TZOUBDUJD TVHBS NFBOT UIF PQFS
BUPS OPX IBT UXP QPTTJCMF JOUFSQSFUBUJPOT 5IF UXP QPTTJCMF
JOUFSQSFUBUJPOT PG UIF TZOUBDUJD - BSF UIBU - JT CFJOH VTFE BT BO
BMJBT GPS negate PS UIBU JU JT UIF TVCUSBDUJPO GVODUJPO 5IF GPM
MPXJOH BSF TFNBOUJDBMMZ JEFOUJDBM UIBU JT UIFZ IBWF UIF TBNF
NFBOJOH EFTQJUF EJƵFSFOU TZOUBY
CFDBVTF UIF - JT USBOTMBUFE
JOUP negate
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> 2000 + (-1234)


766

Prelude> 2000 + (negate 1234)


766

8IFSFBT UIJT JT - CFJOH VTFE GPS TVCUSBDUJPO

Prelude> 2000 - 1234


766

'PSUVOBUFMZ TZOUBDUJD PWFSMPBEJOH MJLF UIJT JTOƊU DPNNPO


JO )BTLFMM

 1BSFOUIFTJ[BUJPO
)FSF XFƊWF MJTUFE UIF JOGPSNBUJPO UIBU ()$J HJWFT VT GPS WBS
JPVT JOƶY PQFSBUPST 8F IBWF MFǒ UIF UZQF TJHOBUVSFT JO UIJT
UJNF BMUIPVHI JU JT OPU EJSFDUMZ SFMFWBOU BU UIJT UJNF 5IJT XJMM
HJWF ZPV B DIBODF UP MPPL BU UIF UZQFT JG ZPVƊSF DVSJPVT BOE
BMTP QSPWJEF B NPSF BDDVSBUF QJDUVSF PG UIF :info DPNNBOE

Prelude> :info (^)


(^) :: (Num a, Integral b) => a -> b -> a
infixr 8 ^

Prelude> :info (*)


$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

class Num a where


(*) :: a -> a -> a
infixl 7 *

Prelude> :info (+)


class Num a where
(+) :: a -> a -> a
infixl 6 +

Prelude> :info (-)


class Num a where
(-) :: a -> a -> a
infixl 6 -

Prelude> :info ($)


($) :: (a -> b) -> a -> b
infixr 0 $

8F TIPVME UBLF B NPNFOU UP FYQMBJO BOE EFNPOTUSBUF UIF


($) PQFSBUPS BT ZPV XJMM SVO JOUP JU GBJSMZ GSFRVFOUMZ JO )BTLFMM
DPEF 5IF HPPE OFXT JT JU EPFT BMNPTU OPUIJOH 5IF CBE OFXT
JT UIJT GBDU TPNFUJNFT USJQT QFPQMF VQ
'JSTU IFSFƊT UIF EFƶOJUJPO PG ($)

f $ a = f a
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

*NNFEJBUFMZ UIJT TFFNT B CJU QPJOUMFTT VOUJM XF SFNFNCFS


UIBU JUƊT EFƶOFE BT BO JOƶY PQFSBUPS XJUI UIF MPXFTU QPTTJCMF
QSFDFEFODF 5IF ($) PQFSBUPS JT B DPOWFOJFODF GPS XIFO ZPV
XBOU UP FYQSFTT TPNFUIJOH XJUI GFXFS QBJST PG QBSFOUIFTFT

Prelude> (2^) (2 + 2)
16
-- can replace those parentheses
Prelude> (2^) $ 2 + 2
16
-- without either parentheses or $
Prelude> (2^) 2 + 2
6

5IF ($) XJMM BMMPX FWFSZUIJOH UP UIF SJHIU PG JU UP CF FWBMV


BUFE ƶSTU BOE DBO CF VTFE UP EFMBZ GVODUJPO BQQMJDBUJPO :PVƊMM
TFF XIBU XF NFBO BCPVU EFMBZJOH GVODUJPO BQQMJDBUJPO JO QBS
UJDVMBS XIFO XF HFU UP $IBQUFS  BOE VTF JU XJUI GVODUJPO
DPNQPTJUJPO
"MTP OPUF UIBU ZPV DBO TUBDL VQ NVMUJQMF VTFT PG ($) JO UIF
TBNF FYQSFTTJPO 'PS FYBNQMF UIJT XPSLT

Prelude> (2^) $ (+2) $ 3*2


256

#VU UIJT EPFT OPU


$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> (2^) $ 2 + 2 $ (*30)


-- A rather long and ugly type error about trying to
-- use numbers as if they were functions follows.

8F DBO TFF GPS PVSTFMWFT XIZ UIJT DPEF EPFTOƊU NBLF TFOTF
JG XF FYBNJOF UIF SFEVDUJPO TUFQT

-- Remember ($)'s definition


f $ a = f a

(2^) $ 2 + 2 $ (*30)
-- Given the right-associativity (infixr) of $
-- we must begin at the right-most position.
2 + 2 $ (*30)
-- reduce ($)
(2 + 2) (*30)
-- then we must evaluate (2 + 2) before we can apply it
4 (*30)
-- This doesn't make sense! We can't apply 4
-- as if it was a function to the argument (*30)!

/PX MFUƊT ƷJQ UIBU FYQSFTTJPO BSPVOE B CJU TP JU XPSLT BOE


UIFO XBML UISPVHI B SFEVDUJPO
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

(2^) $ (*30) $ 2 + 2
-- must evaluate right-side first
(2^) $ (*30) $ 2 + 2
-- application of the function (*30) to the
-- expression (2 + 2) forces evaluation
(2^) $ (*30) 4
-- then we reduce (*30) 4
(2^) $ 120
-- reduce ($) again.
(2^) 120
-- reduce (2^)
1329227995784915872903807060280344576

4PNF )BTLFMMFST ƶOE QBSFOUIFTFT NPSF SFBEBCMF UIBO UIF


EPMMBS TJHO CVU JUƊT UPP DPNNPO JO JEJPNBUJD )BTLFMM DPEF GPS
ZPV UP OPU BU MFBTU CF GBNJMJBS XJUI JU

1BSFOUIFTJ[JOH JOƶY PQFSBUPST


5IFSF BSF UJNFT XIFO ZPV XBOU UP SFGFS UP BO JOƶY GVODUJPO
XJUIPVU BQQMZJOH BOZ BSHVNFOUT BOE UIFSF BSF BMTP UJNFT
XIFO ZPV XBOU UP VTF UIFN BT QSFƶY PQFSBUPST JOTUFBE PG JOƶY
*O CPUI DBTFT ZPV NVTU XSBQ UIF PQFSBUPS JO QBSFOUIFTFT 8F
XJMM TFF NPSF FYBNQMFT PG UIF GPSNFS DBTF MBUFS JO UIF CPPL
'PS OPX MFUƊT MPPL BU IPX XF VTF JOƶY PQFSBUPST BT QSFƶYFT
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

*G ZPVS JOƶY GVODUJPO JT >> UIFO ZPV NVTU XSJUF (>>) UP SFGFS
UP JU BT B WBMVF (+) JT UIF BEEJUJPO JOƶY GVODUJPO XJUIPVU BOZ
BSHVNFOUT BQQMJFE ZFU BOE (+1) JT UIF TBNF BEEJUJPO GVODUJPO
CVU XJUI POF BSHVNFOU BQQMJFE NBLJOH JU SFUVSO UIF OFYU
BSHVNFOU JUƊT BQQMJFE UP QMVT POF

Prelude> 1 + 2
3
Prelude> (+) 1 2
3
Prelude> (+1) 2
3

5IF MBTU DBTF JT LOPXO BT TFDUJPOJOH BOE BMMPXT ZPV UP QBTT


BSPVOE QBSUJBMMZ BQQMJFE GVODUJPOT 8JUI DPNNVUBUJWF GVOD
UJPOT TVDI BT BEEJUJPO JU NBLFT OP EJƵFSFODF JG ZPV VTF (+1)
PS (1+) CFDBVTF UIF PSEFS PG UIF BSHVNFOUT XPOƊU DIBOHF UIF
SFTVMU
*G ZPV VTF TFDUJPOJOH XJUI B GVODUJPO UIBU JT OPU DPNNVUB
UJWF UIF PSEFS NBUUFST

Prelude> (1/) 2
0.5
Prelude> (/1) 2
2.0

4VCUSBDUJPO (-) JT B TQFDJBM DBTF 5IFTF XJMM XPSL


$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> 2 - 1
1
Prelude> (-) 2 1
1

5IF GPMMPXJOH IPXFWFS XPOƊU XPSL

Prelude> (-2) 1

&ODMPTJOH B WBMVF JOTJEF UIF QBSFOUIFTFT XJUI UIF - JOEJ


DBUFT UP ()$J UIBU JUƊT UIF BSHVNFOU PG B GVODUJPO #FDBVTF
UIF - GVODUJPO SFQSFTFOUT OFHBUJPO OPU TVCUSBDUJPO XIFO JUƊT
BQQMJFE UP B TJOHMF BSHVNFOU ()$J EPFT OPU LOPX XIBU UP EP
XJUI UIBU BOE TP JU SFUVSOT BO FSSPS NFTTBHF )FSF - JT B DBTF
PG TZOUBDUJD PWFSMPBEJOH EJTBNCJHVBUFE CZ IPX JU JT VTFE
:PV DBO VTF TFDUJPOJOH GPS TVCUSBDUJPO CVU JU NVTU CF UIF
ƶSTU BSHVNFOU

Prelude> let x = 5
Prelude> let y = (1 -)
Prelude> y x
-4

0S ZPV JOTUFBE PG  Y
ZPV DBO XSJUF TVCUSBDU Y


Prelude> (subtract 2) 3
1
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

*U NBZ OPU CF JNNFEJBUFMZ PCWJPVT XIZ ZPV XPVME FWFS


XBOU UP EP UIJT CVU ZPV XJMM TFF UIJT TZOUBY VTFE UISPVHIPVU UIF
CPPL GPS FYBNQMF PODF XF TUBSU XBOUJOH UP BQQMZ GVODUJPOT UP
FBDI WBMVF JOTJEF B MJTU PS PUIFS EBUB TUSVDUVSF 8F XJMM EJTDVTT
QBSUJBM BQQMJDBUJPO PG GVODUJPOT JO NPSF EFUBJM JO B MBUFS DIBQUFS
BT XFMM

 -FU BOE XIFSF


:PV XJMM PǒFO TFF let BOE where VTFE UP JOUSPEVDF DPNQPOFOUT
PG FYQSFTTJPOT BOE UIFZ TFFN TJNJMBS *U UBLFT TPNF QSBDUJDF
UP HFU VTFE UP UIF BQQSPQSJBUF UJNFT UP VTF FBDI CVU UIFZ BSF
GVOEBNFOUBMMZ EJƵFSFOU
5IF DPOUSBTU IFSF JT UIBU let JOUSPEVDFT BO FYQSFTTJPO TP JU
DBO CF VTFE XIFSFWFS ZPV DBO IBWF BO FYQSFTTJPO CVU where JT
B EFDMBSBUJPO BOE JT CPVOE UP B TVSSPVOEJOH TZOUBDUJD DPOTUSVDU
8FƊMM TUBSU XJUI BO FYBNQMF PG where

-- FunctionWithWhere.hs
module FunctionWithWhere where

printInc n = print plusTwo


where plusTwo = n + 2

"OE JG XF VTF UIJT JO UIF 3&1-

Prelude> :l FunctionWithWhere.hs
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

[1 of 1] Compiling FunctionWithWhere ...


Ok, modules loaded: FunctionWithWhere.
Prelude> printInc 1
3
Prelude>

/PX XF IBWF UIF TBNF GVODUJPO CVU VTJOH let JO UIF QMBDF
PG where

-- FunctionWithLet.hs
module FunctionWithLet where

printInc2 n = let plusTwo = n + 2


in print plusTwo

8IFO ZPV TFF let GPMMPXFE CZ in ZPVƊSF MPPLJOH BU B MFU


FYQSFTTJPO )FSFƊT UIBU GVODUJPO JO UIF 3&1-

Prelude> :load FunctionWithLet.hs


[1 of 1] Compiling FunctionWithLet ...
Ok, modules loaded: FunctionWithLet.
Prelude> printInc2 3
5

*G ZPV MPBEFE FunctionWithLet JO UIF TBNF 3&1- TFTTJPO BT


FunctionWithWhere UIFO JU XJMM IBWF VOMPBEFE UIF ƶSTU POF CF
GPSF MPBEJOH UIF OFX POF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

Prelude> :load FunctionWithWhere.hs


[1 of 1] Compiling FunctionWithWhere ...
Ok, modules loaded: FunctionWithWhere.
Prelude> printInc 1
3
Prelude> :load FunctionWithLet.hs
[1 of 1] Compiling FunctionWithLet ...
Ok, modules loaded: FunctionWithLet.
Prelude> printInc2 10
12
Prelude> printInc 10

<interactive>:6:1:
Not in scope: ‘printInc’
Perhaps you meant ‘printInc2’ (line 4)

printInc JTOƊU JO TDPQF BOZNPSF CFDBVTF ()$J VOMPBEFE


FWFSZUIJOH ZPVƊE EFƶOFE PS MPBEFE BǒFS ZPV VTFE :load UP
MPBE UIF FunctionWithLet.hs TPVSDF ƶMF 4DPQF JT UIF BSFB PG
TPVSDF DPEF XIFSF B CJOEJOH PG B WBSJBCMF BQQMJFT
5IBU JT POF MJNJUBUJPO PG UIF :load DPNNBOE JO ()$J "T
XF CVJME MBSHFS QSPKFDUT UIBU SFRVJSF IBWJOH NVMUJQMF NPEVMFT
JO TDPQF XF XJMM VTF B QSPKFDU NBOBHFS DBMMFE 4UBDL SBUIFS
UIBO ()$J JUTFMG
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

&YFSDJTFT " )FBE $PEF


/PX GPS TPNF FYFSDJTFT 'JSTU EFUFSNJOF JO ZPVS IFBE XIBU
UIF GPMMPXJOH FYQSFTTJPOT XJMM SFUVSO UIFO WBMJEBUF JO UIF
3&1-

 let x = 5 in x

 let x = 5 in x * x

 let x = 5; y = 6 in x * y

 let x = 3; y = 1000 in x + 3

"CPWF ZPV FOUFSFE TPNF let FYQSFTTJPOT JOUP ZPVS 3&1-


UP FWBMVBUF UIFN /PX XFƊSF HPJOH UP PQFO B ƶMF BOE SFXSJUF
TPNF let FYQSFTTJPOT VTJOH where EFDMBSBUJPOT :PV XJMM IBWF
UP HJWF UIF WBMVF ZPVƊSF CJOEJOH B OBNF BMUIPVHI UIF OBNF
DBO CF KVTU B MFUUFS JG ZPV MJLF 'PS FYBNQMF

-- this should work in GHCi


let x = 5; y = 6 in x * y

DPVME CF SFXSJUUFO BT

-- put this in a file


mult1 = x * y
where x = 5
y = 6
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

.BLJOH UIF FRVBMT TJHOT MJOF VQ JT B TUZMJTUJD DIPJDF "T MPOH


BT UIJOHT BSF OFTUFE JO UIBU XBZ UIF FRVBMT TJHOT EP OPU IBWF
UP MJOF VQ #VU OPUJDF XF VTF B OBNF UIBU XF XJMM VTF UP SFGFS
UP UIJT WBMVF JO UIF 3&1-

Prelude> :l practice.hs
[1 of 1] Compiling Main
Ok, modules loaded: Main.
*Main> mult1
30

5IF QSPNQU DIBOHFT UP *Main JOTUFBE PG Prelude UP JOEJDBUF


UIBU ZPV IBWF B NPEVMF DBMMFE Main MPBEFE
3FXSJUF XJUI where DMBVTFT

 let x = 3; y = 1000 in x * 3 + y

 let y = 10; x = 10 * 5 + y in x * 5

 let x = 7; y = negate x; z = y * 10 in z / x + y

/PUF UIF ƶMFOBNF ZPV DIPPTF JT VOJNQPSUBOU FYDFQU GPS


UIF IT FYUFOTJPO

 $IBQUFS &YFSDJTFT


5IF HPBM GPS BMM UIF GPMMPXJOH FYFSDJTFT JT KVTU UP HFU ZPV QMBZ
JOH XJUI DPEF BOE GPSNJOH IZQPUIFTFT BCPVU XIBU JU TIPVME
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

EP 3FBE UIF DPEF DBSFGVMMZ VTJOH XIBU XFƊWF MFBSOFE TP GBS
(FOFSBUF B IZQPUIFTJT BCPVU XIBU ZPV UIJOL UIF DPEF XJMM EP
1MBZ XJUI JU JO UIF 3&1- BOE ƶOE PVU XIFSF ZPV XFSF SJHIU PS
XSPOH

1BSFOUIFTJ[BUJPO
(JWFO XIBU XF LOPX BCPVU UIF QSFDFEFODF PG (*) (+) BOE (^)
IPX DBO XF QBSFOUIFTJ[F UIF GPMMPXJOH FYQSFTTJPOT NPSF FY
QMJDJUMZ XJUIPVU DIBOHJOH UIFJS SFTVMUT 1VU UPHFUIFS BO BOTXFS
ZPV UIJOL JT DPSSFDU UIFO UFTU JO UIF ()$J 3&1-
&YBNQMF

-- We want to make this more explicit


2 + 2 * 3 - 3

-- this will produce the same result


2 + (2 * 3) - 3

"UUFNQU UIF BCPWF PO UIF GPMMPXJOH FYQSFTTJPOT

 2 + 2 * 3 - 1

 (^) 10 $ 1 + 1

 2 ^ 2 * 4 ^ 5 + 1
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

&RVJWBMFOU FYQSFTTJPOT
8IJDI PG UIF GPMMPXJOH QBJST PG FYQSFTTJPOT XJMM SFUVSO UIF
TBNF SFTVMU XIFO FWBMVBUFE 5SZ UP SFBTPO UIFN PVU JO ZPVS
IFBE CZ SFBEJOH UIF DPEF BOE UIFO FOUFS UIFN JOUP UIF 3&1-
UP DIFDL ZPVS XPSL

 1 + 1

 10 ^ 2

10 + 9 * 10

 400 - 37

(-) 37 400

 100 `div` 3

100 / 3

 2 * 5 + 18

2 * (5 + 18)
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

.PSF GVO XJUI GVODUJPOT


)FSF JT B CJU PG DPEF BT JU NJHIU CF FOUFSFE JOUP B TPVSDF ƶMF
3FNFNCFS UIBU XIFO ZPV XSJUF DPEF JO B TPVSDF ƶMF UIF PSEFS
JT VOJNQPSUBOU CVU XIFO XSJUJOH DPEF EJSFDUMZ JOUP UIF 3&1-
UIF PSEFS EPFT NBUUFS (JWFO UIBU MPPL BU UIJT DPEF BOE SFXSJUF
JU TVDI UIBU JU DPVME CF FWBMVBUFE JO UIF 3&1- SFNFNCFS
ZPVƊMM OFFE let XIFO FOUFSJOH JU EJSFDUMZ JOUP UIF 3&1-
 #F
TVSF UP FOUFS ZPVS DPEF JOUP UIF 3&1- UP NBLF TVSF JU FWBMVBUFT
DPSSFDUMZ

z = 7

x = y ^ 2

waxOn = x * 5

y = z + 8

 /PX ZPV IBWF B WBMVF DBMMFE waxOn JO ZPVS 3&1- 8IBU EP


ZPV UIJOL XJMM IBQQFO JG ZPV FOUFS
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

10 + waxOn
-- or
(+10) waxOn
-- or
(-) 15 waxOn
-- or
(-) waxOn 15

 &BSMJFS XF MPPLFE BU B GVODUJPO DBMMFE triple 8IJMF ZPVS


3&1- IBT waxOn JO TFTTJPO SFFOUFS UIF triple GVODUJPO BU
UIF QSPNQU

let triple x = x * 3

 /PX XIBU XJMM IBQQFO JG XF FOUFS UIJT BU PVS ()$J QSPNQU


5SZ UP SFBTPO PVU XIBU ZPV UIJOL XJMM IBQQFO ƶSTU DPOTJE
FSJOH XIBU SPMF waxOn JT QMBZJOH JO UIJT GVODUJPO DBMM 5IFO
FOUFS JU TFF XIBU EPFT IBQQFO BOE DIFDL ZPVS VOEFS
TUBOEJOH

triple waxOn

 3FXSJUF waxOn BT BO FYQSFTTJPO XJUI B where DMBVTF JO ZPVS


TPVSDF ƶMF -PBE JU JOUP ZPVS 3&1- BOE NBLF TVSF JU TUJMM
XPSLT BT FYQFDUFE

 /PX UP UIF TBNF TPVSDF ƶMF XIFSF ZPV IBWF waxOn BEE
UIF triple GVODUJPO 3FNFNCFS :PV EPOƊU OFFE let BOE
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

UIF GVODUJPO OBNF TIPVME CF BU UIF MFǒ NBSHJO UIBU JT


OPU OFTUFE BT POF PG UIF waxOn FYQSFTTJPOT
 .BLF TVSF
JU XPSLT CZ MPBEJOH JU JOUP ZPVS 3&1- BOE UIFO FOUFSJOH
triple waxOn BHBJO BU UIF 3&1- QSPNQU :PV TIPVME IBWF
UIF TBNF BOTXFS BT ZPV EJE BCPWF

 /PX XJUIPVU DIBOHJOH XIBU ZPVƊWF EPOF TP GBS JO UIBU


ƶMF BEE B OFX GVODUJPO DBMMFE waxOff UIBU MPPLT MJLF UIJT

waxOff x = triple x

 -PBE UIF TPVSDF ƶMF JOUP ZPVS 3&1- BOE FOUFS waxOff waxOn
BU UIF QSPNQU
:PV OPX IBWF B GVODUJPO waxOff UIBU DBO CF BQQMJFE UP B
WBSJFUZ PG BSHVNFOUT ƈ OPU KVTU waxOn CVU BOZ OVNFSJD

WBMVF ZPV XBOU UP QVU JO GPS ԧ 1MBZ XJUI UIBU B CJU 8IBU
JT UIF SFTVMU PG waxOff 10 PS waxOff (-50) 5SZ NPEJGZJOH
ZPVS waxOff GVODUJPO UP EP TPNFUIJOH OFX ƈ QFSIBQT ZPV
XBOU UP ƶSTU USJQMF UIF ԧ WBMVF BOE UIFO TRVBSF JU PS EJWJEF
JU CZ  +VTU TQFOE TPNF UJNF HFUUJOH DPNGPSUBCMF XJUI
NPEJGZJOH UIF TPVSDF ƶMF DPEF SFMPBEJOH JU BOE DIFDLJOH
ZPVS NPEJƶDBUJPO JO UIF 3&1-

 %FƶOJUJPOT
 5IF UFSNT BSHVNFOU BOE QBSBNFUFS BSF PǒFO VTFE JOUFS
DIBOHFBCMZ )PXFWFS JU JT XPSUIXIJMF UP VOEFSTUBOE UIF
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

EJTUJODUJPO " QBSBNFUFS PS GPSNBM QBSBNFUFS SFQSFTFOUT B


WBMVF UIBU XJMM CF QBTTFE UP UIF GVODUJPO XIFO UIF GVOD
UJPO JT DBMMFE 5IVT QBSBNFUFST BSF VTVBMMZ WBSJBCMFT "O
BSHVNFOU JT BO JOQVU WBMVF UIF GVODUJPO JT BQQMJFE UP "
GVODUJPOƊT QBSBNFUFS JT CPVOE UP UIF WBMVF PG BO BSHVNFOU
XIFO UIF GVODUJPO JT BQQMJFE UP UIBU BSHVNFOU 'PS FYBN
QMF JO f x = x + 2 XIJDI UBLFT BO BSHVNFOU BOE SFUVSOT
UIBU WBMVF BEEFE UP  ԧ JT UIF POF QBSBNFUFS PG PVS GVOD
UJPO 8F SVO UIF DPEF CZ BQQMZJOH ԕ UP TPNF BSHVNFOU
*G UIF BSHVNFOU XF QBTTFE UP UIF QBSBNFUFS ԧ XFSF  PVS
SFTVMU XPVME CF  )PXFWFS BSHVNFOUT DBO UIFNTFMWFT
CF WBSJBCMFT PS CF FYQSFTTJPOT UIBU JODMVEF WBSJBCMFT UIVT
UIF EJTUJODUJPO JT OPU BMXBZT DMFBS 8IFO XF VTF ƌQBSBN
FUFSƍ JO UIJT CPPL JU XJMM BMXBZT CF SFGFSSJOH UP GPSNBM
QBSBNFUFST VTVBMMZ JO B UZQF TJHOBUVSF CVU XFƊWF UBLFO
UIF MJCFSUZ PG VTJOH ƌBSHVNFOUƍ TPNFXIBU NPSF MPPTFMZ

 "O FYQSFTTJPO JT B DPNCJOBUJPO PG TZNCPMT UIBU DPOGPSNT


UP TZOUBDUJD SVMFT BOE DBO CF FWBMVBUFE UP TPNF SFTVMU *O
)BTLFMM BO FYQSFTTJPO JT B XFMMTUSVDUVSFE DPNCJOBUJPO
PG DPOTUBOUT WBSJBCMFT BOE GVODUJPOT 8IJMF JSSFEVDJCMF
DPOTUBOUT BSF UFDIOJDBMMZ FYQSFTTJPOT XF VTVBMMZ SFGFS UP
UIPTF BT ƌWBMVFTƍ TP XF VTVBMMZ NFBO ƌSFEVDJCMF FYQSFT
TJPOƍ XIFO XF VTF UIF UFSN FYQSFTTJPO

 " SFEFY JT B SFEVDJCMF FYQSFTTJPO


$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

 " WBMVF JT BO FYQSFTTJPO UIBU DBOOPU CF SFEVDFE PS FWBMV


BUFE BOZ GVSUIFS 2 * 2 JT BO FYQSFTTJPO CVU OPU B WBMVF
XIFSFBT XIBU JU FWBMVBUFT UP  JT B WBMVF

 " GVODUJPO JT B NBUIFNBUJDBM PCKFDU XIPTF DBQBCJMJUJFT BSF


MJNJUFE UP CFJOH BQQMJFE UP BO BSHVNFOU BOE SFUVSOJOH B
SFTVMU 'VODUJPOT DBO CF EFTDSJCFE BT B MJTU PG PSEFSFE QBJST
PG UIFJS JOQVUT BOE UIF SFTVMUJOH PVUQVUT MJLF B NBQQJOH
(JWFO UIF GVODUJPO f x = x + 2 BQQMJFE UP UIF BSHVNFOU
 XF XPVME IBWF UIF PSEFSFE QBJS (2, 4) PG JUT JOQVU BOE
PVUQVU

 *OƶY OPUBUJPO JT UIF TUZMF VTFE JO BSJUINFUJD BOE MPHJD *OƶY


NFBOT UIBU UIF PQFSBUPS JT QMBDFE CFUXFFO UIF PQFSBOET
PS BSHVNFOUT "O FYBNQMF XPVME CF UIF QMVT TJHO JO BO
FYQSFTTJPO MJLF 2 + 2

 0QFSBUPST BSF GVODUJPOT UIBU BSF JOƶY CZ EFGBVMU *O )BTLFMM


PQFSBUPST NVTU VTF TZNCPMT BOE OPU BMQIBOVNFSJD DIBS
BDUFST

 4ZOUBDUJD TVHBS JT TZOUBY XJUIJO B QSPHSBNNJOH MBOHVBHF


EFTJHOFE UP NBLF FYQSFTTJPOT FBTJFS UP XSJUF PS SFBE

 'PMMPXVQ SFTPVSDFT


 )BTLFMM XJLJ BSUJDMF PO -FU WT 8IFSF
https://wiki.haskell.org/Let_vs._Where
$)"15&3  #"4*$ &913&44*0/4 "/% '6/$5*0/4 

 )PX UP EFTVHBS )BTLFMM DPEF (BCSJFM (PO[BMF[


$IBQUFS 

4USJOHT

-JLF QVOOJOH
QSPHSBNNJOH JT B QMBZ PO
XPSET

"MBO 1FSMJT


$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

 1SJOUJOH TUSJOHT


4P GBS XFƊWF CFFO EPJOH BSJUINFUJD VTJOH TJNQMF FYQSFTTJPOT
*O UIJT DIBQUFS XF XJMM UVSO PVS BUUFOUJPO UP B EJƵFSFOU UZQF
PG EBUB DBMMFE String
.PTU QSPHSBNNJOH MBOHVBHFT SFGFS UP UIF EBUB TUSVDUVSFT
VTFE UP DPOUBJO UFYU BT ƌTUSJOHT ƍ VTVBMMZ SFQSFTFOUFE BT TF
RVFODFT PS MJTUT PG DIBSBDUFST *O UIJT TFDUJPO XF XJMM

Ƒ UBLF BO JOUSPEVDUPSZ MPPL BU UZQFT UP VOEFSTUBOE UIF EBUB


TUSVDUVSF DBMMFE 4USJOH

Ƒ UBML BCPVU UIF TQFDJBM TZOUBY PS TZOUBDUJD TVHBS VTFE GPS


TUSJOHT

Ƒ QSJOU TUSJOHT JO UIF 3&1- FOWJSPONFOU

Ƒ XPSL XJUI TPNF TUBOEBSE GVODUJPOT UIBU PQFSBUF PO UIJT


EBUBUZQF

 " ƶSTU MPPL BU UZQFT


'JSTU TJODF XF XJMM CF XPSLJOH XJUI TUSJOHT XF XBOU UP TUBSU CZ
VOEFSTUBOEJOH XIBU UIFTF EBUB TUSVDUVSFT BSF JO )BTLFMM BT XFMM
BT B CJU PG TQFDJBM TZOUBY XF VTF GPS UIFN 8F IBWFOƊU UBMLFE
NVDI BCPVU UZQFT ZFU BMUIPVHI ZPV TBX TPNF FYBNQMFT PG
UIFN JO UIF MBTU DIBQUFS 5ZQFT BSF JNQPSUBOU JO )BTLFMM BOE
UIF OFYU UXP DIBQUFST BSF FOUJSFMZ EFWPUFE UP UIFN
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

5ZQFT BSF B XBZ PG DBUFHPSJ[JOH WBMVFT 5IFSF BSF TFW


FSBM UZQFT GPS OVNCFST GPS FYBNQMF EFQFOEJOH PO XIFUIFS
UIFZ BSF JOUFHFST GSBDUJPOBM OVNCFST FUD 5IFSF JT B UZQF
GPS CPPMFBO WBMVFT TQFDJƶDBMMZ UIF WBMVFT True BOE False 5IF
UZQFT XF BSF QSJNBSJMZ DPODFSOFE XJUI JO UIJT DIBQUFS BSF Char
ƉDIBSBDUFSƊ BOE String StringT BSF MJTUT PG DIBSBDUFST
*U JT FBTZ UP ƶOE PVU UIF UZQF PG B WBMVF FYQSFTTJPO PS
GVODUJPO JO ()$J 8F EP UIJT XJUI UIF :type DPNNBOE
0QFO VQ ZPVS 3&1- FOUFS :type 'a' BU UIF QSPNQU BOE
ZPV TIPVME TFF TPNFUIJOH MJLF UIJT

Prelude> :type 'a'


'a' :: Char

8F OFFE UP IJHIMJHIU B GFX UIJOHT IFSF 'JSTU XFƊWF FODMPTFE


PVS DIBSBDUFS JO TJOHMF RVPUFT 5IJT MFUT ()$J LOPX UIBU UIF
DIBSBDUFS JT OPU B WBSJBCMF *G ZPV FOUFS :type a JOTUFBE JU XJMM
UIJOL JUƊT B WBSJBCMF BOE HJWF ZPV BO FSSPS NFTTBHF UIBU UIF Ԑ JT
OPU JO TDPQF 5IBU JT UIF WBSJBCMF Ԑ IBTOƊU CFFO EFƶOFE JT OPU
JO TDPQF
TP JU IBT OP XBZ UP LOPX XIBU UIF UZQF PG JU JT
4FDPOE UIF :: TZNCPM JT SFBE BT ƌIBT UIF UZQFƍ :PVƊMM TFF
UIJT PǒFO JO )BTLFMM 8IFOFWFS ZPV TFF UIBU EPVCMF DPMPO
ZPV LOPX ZPVƊSF MPPLJOH BU B UZQF TJHOBUVSF " UZQF TJHOBUVSF
JT B MJOF PG DPEF UIBU EFƶOFT UIF UZQFT GPS B WBMVF FYQSFTTJPO
PS GVODUJPO
"OE ƶOBMMZ UIFSF JT Char UIF UZQF Char JT UIF UZQF UIBU
JODMVEFT BMQIBCFUJD DIBSBDUFST VOJDPEF DIBSBDUFST TZNCPMT
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

FUD 4P BTLJOH ()$J :type 'a' UIBU JT ƌXIBU JT UIF UZQF PG ƊBƊ ƍ
HJWFT VT UIF JOGPSNBUJPO 'a' :: Char UIBU JT ƌƊBƊ IBT UIF UZQF
PG $IBSƍ
/PX MFUƊT USZ B TUSJOH PG UFYU 5IJT UJNF XF IBWF UP VTF
EPVCMF RVPUBUJPO NBSLT OPU TJOHMF UP UFMM ()$J XF IBWF B
TUSJOH OPU B TJOHMF DIBSBDUFS

Prelude> :type "Hello!"


"Hello!" :: [Char]

8F IBWF TPNFUIJOH OFX JO UIF UZQF JOGPSNBUJPO 5IF


TRVBSF CSBDLFUT BSPVOE Char IFSF BSF UIF TZOUBDUJD TVHBS GPS B
MJTU String JT B UZQF BMJBT PS UZQF TZOPOZN GPS B MJTU PG Char "
UZQF BMJBT JT XIBU JU TPVOET MJLF XF VTF POF OBNF GPS B UZQF
VTVBMMZ GPS DPOWFOJFODF UIBU IBT B EJƵFSFOU UZQF OBNF VOEFS
OFBUI )FSF String JT BOPUIFS OBNF GPS B MJTU PG DIBSBDUFST #Z
VTJOH UIF OBNF String XF BSF BCMF UP WJTVBMMZ EJƵFSFOUJBUF JU
GSPN PUIFS UZQFT PG MJTUT BOE OBNFT UIFNTFMWFT EPOƊU NFBO
NVDI UP UIF DPNQVUFS 8IFO XF UBML BCPVU MJTUT JO NPSF EFUBJM
MBUFS XFƊMM TFF XIZ UIF TRVBSF CSBDLFUT BSF DPOTJEFSFE TZOUBD
UJD TVHBS GPS OPX XF KVTU OFFE UP VOEFSTUBOE UIBU ()$J TBZT
ƌ)FMMPƍ IBT UIF UZQF MJTU PG Char

 1SJOUJOH TJNQMF TUSJOHT


/PX MFUƊT TFF IPX UP QSJOU TUSJOHT PG UFYU JO UIF 3&1-
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

Prelude> print "hello world!"


"hello world!"

)FSF XFƊWF VTFE UIF DPNNBOE print UP UFMM ()$J UP QSJOU


UIF TUSJOH UP UIF EJTQMBZ TP JU EPFT XJUI UIF RVPUBUJPO NBSLT
TUJMM BSPVOE JU
0UIFS DPNNBOET XF DBO VTF UP UFMM ()$J UP QSJOU TUSJOHT
PG UFYU JOUP UIF EJTQMBZ IBWF TMJHIUMZ EJƵFSFOU SFTVMUT

Prelude> putStrLn "hello world!"


hello world!
Prelude>

Prelude> putStr "hello world!"


hello world!Prelude>

:PV DBO QSPCBCMZ TFF UIBU putStr BOE putStrLn BSF TJNJMBS UP
FBDI PUIFS XJUI POF LFZ EJƵFSFODF 8F BMTP OPUJDF UIBU CPUI
PG UIFTF DPNNBOET QSJOU UIF TUSJOH UP UIF EJTQMBZ XJUIPVU UIF
RVPUBUJPO NBSLT 5IJT JT CFDBVTF XIJMF UIFZ BSF TVQFSƶDJBMMZ
TJNJMBS UP print UIFZ BDUVBMMZ IBWF B EJƵFSFOU UZQF UIBO print
EPFT 'VODUJPOT UIBU BSF TJNJMBS PO UIF TVSGBDF DBO CFIBWF
EJƵFSFOUMZ EFQFOEJOH PO UIF UZQF PS DBUFHPSZ UIFZ CFMPOH UP
/FYU MFUƊT UBLF B MPPL BU IPX UP EP UIFTF UIJOHT GSPN TPVSDF
ƶMFT 5ZQF UIF GPMMPXJOH JOUP B ƶMF OBNFE print1.hs
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

-- print1.hs
module Print1 where

main :: IO ()
main = putStrLn "hello world!"

)FSFƊT XIBU ZPV TIPVME TFF XIFO ZPV MPBE JU JO ()$J BOE
SVO main

Prelude> :l print1.hs
[1 of 1] Compiling Print1
Ok, modules loaded: Print1.
*Print1> main
hello world!
*Print1>

'JSTU OPUF UIBU ZPVS Prelude> QSPNQU NBZ IBWF DIBOHFE


UP SFƷFDU UIF OBNF PG UIF NPEVMF ZPV MPBEFE :PV DBO VTF
:module PS :m UP VOMPBE UIF NPEVMF BOE SFUVSO UP 1SFMVEF JG
ZPV XJTI :PV DBO BMTP TFU ZPVS QSPNQU UP TPNFUIJOH TQFDJƶD
XIJDI NFBOT JU XPOƊU DIBOHF FWFSZ UJNF ZPV MPBE PS VOMPBE B
NPEVMF 

Prelude> :set prompt "λ> "


λ> :r

:PV DBO TFU JU QFSNBOFOUMZ JG ZPV QSFGFS CZ TFUUJOH UIF DPOƶHVSBUJPO JO ZPVS HIDJ
ƶMF
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

Ok, modules loaded: Print1.


λ> main
hello world!
λ>

-PPLJOH BU UIF DPEF BHBJO main JT UIF EFGBVMU BDUJPO XIFO


ZPV CVJME BO FYFDVUBCMF PS SVO JU JO B 3&1- *U JT OPU B GVOD
UJPO CVU JT PǒFO B TFSJFT PG JOTUSVDUJPOT UP FYFDVUF XIJDI DBO
JODMVEF BQQMZJOH GVODUJPOT BOE QSPEVDJOH TJEFFƵFDUT 8IFO
CVJMEJOH B QSPKFDU XJUI 4UBDL IBWJOH B main FYFDVUBCMF JO B
Main.hs ƶMF JT PCMJHBUPSZ CVU ZPV DBO IBWF TPVSDF ƶMFT BOE MPBE
UIFN JO ()$J XJUIPVU OFDFTTBSJMZ IBWJOH B main CMPDL
"T ZPV DBO TFF main IBT UIF UZQF IO () IO TUBOET GPS JO
QVUPVUQVU CVU IBT B TQFDJBMJ[FE NFBOJOH JO )BTLFMM *U JT B
TQFDJBM UZQF VTFE XIFO UIF SFTVMU PG SVOOJOH UIF QSPHSBN JO
WPMWFT FƵFDUT JO BEEJUJPO UP CFJOH B GVODUJPO PS FYQSFTTJPO
1SJOUJOH UP UIF TDSFFO JT BO FƵFDU TP QSJOUJOH UIF PVUQVU PG
B NPEVMF NVTU CF XSBQQFE JO UIJT IO UZQF 8IFO ZPV FOUFS
GVODUJPOT EJSFDUMZ JOUP UIF 3&1- ()$J JNQMJDJUMZ VOEFSTUBOET
BOE JNQMFNFOUT IO XJUIPVU ZPV IBWJOH UP TQFDJGZ UIBU 4JODF
UIF main BDUJPO JT UIF EFGBVMU FYFDVUBCMF ZPV XJMM TFF JU JO B MPU
PG TPVSDF ƶMFT UIBU XF CVJME GSPN IFSF PO PVU 8F XJMM FYQMBJO
JUT NFBOJOH JO NPSF EFUBJM JO B MBUFS DIBQUFS
-FUƊT TUBSU BOPUIFS ƶMF
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

-- print2.hs
module Print2 where

main :: IO ()
main = do
putStrLn "Count to four for me:"
putStr "one, two"
putStr ", three, and"
putStrLn " four!"

5IJT do TZOUBY JT B TQFDJBM TZOUBY UIBU BMMPXT GPS TFRVFODJOH


BDUJPOT *U JT NPTU DPNNPOMZ VTFE UP TFRVFODF UIF BDUJPOT
UIBU DPOTUJUVUF ZPVS QSPHSBN TPNF PG XIJDI XJMM OFDFTTBSJMZ
QFSGPSN FƵFDUT TVDI BT QSJOUJOH UP UIF TDSFFO UIBUƊT XIZ UIF
PCMJHBUPSZ UZQF PG main JT IO ()
 5IF do JTOƊU TUSJDUMZ OFDFTTBSZ
CVU TJODF JU PǒFO NBLFT GPS NPSF SFBEBCMF DPEF UIBO UIF BM
UFSOBUJWFT ZPVƊMM TFF JU B MPU 8F XJMM FYQMBJO JU B CJU NPSF JO
$IBQUFS  BOE UIFSF XJMM CF B GVMM FYQMBOBUJPO JO UIF DIBQUFS
PO .POBE
)FSFƊT XIBU ZPV TIPVME TFF XIFO ZPV SVO UIJT POF

Prelude> :l print2.hs
[1 of 1] Compiling Print2
Ok, modules loaded: Print2.
Prelude> main
Count to four for me:
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

one, two, three, and four!


Prelude>

'PS B CJU PG GVO DIBOHF UIF JOWPDBUJPOT PG putStr UP putStrLn


BOE WJDF WFSTB 3FSVO UIF QSPHSBN BOE TFF XIBU IBQQFOT
:PVƊMM OPUF UIF putStrLn GVODUJPO QSJOUT UP UIF DVSSFOU MJOF
UIFO TUBSUT B OFX MJOF XIFSF putStr QSJOUT UP UIF DVSSFOU MJOF
CVU EPFTOƊU TUBSU B OFX POF 5IF Ln JO putStrLn JOEJDBUFT UIBU JU
TUBSUT B OFX MJOF

4USJOH DPODBUFOBUJPO
5P DPODBUFOBUF TPNFUIJOH NFBOT UP MJOL UPHFUIFS 6TVBMMZ XIFO
XF UBML BCPVU DPODBUFOBUJPO JO QSPHSBNNJOH XFƊSF UBMLJOH
BCPVU MJOFBS TFRVFODFT TVDI BT MJTUT PS TUSJOHT PG UFYU *G XF
DPODBUFOBUF UXP TUSJOHT "Curry" BOE " Rocks!" XF XJMM HFU UIF
TUSJOH "Curry Rocks!" /PUF UIF TQBDF BU UIF CFHJOOJOH PG "
Rocks!" 8JUIPVU UIBU XFƊE HFU "CurryRocks!"
-FUƊT TUBSU B OFX UFYU ƶMF BOE UZQF UIF GPMMPXJOH
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

-- print3.hs
module Print3 where

myGreeting :: String
-- The above line reads as: "myGreeting has the type String"
myGreeting = "hello" ++ " world!"
-- Could also be: "hello" ++ " " ++ "world!"
-- to obtain the same result.

hello :: String
hello = "hello"

world :: String
world = "world!"

main :: IO ()
main = do
putStrLn myGreeting
putStrLn secondGreeting
where secondGreeting = concat [hello, " ", world]

3FNFNCFS String JT B UZQF TZOPOZN GPS [Char] :PV DBO


USZ DIBOHJOH UIF UZQF TJHOBUVSFT UP SFƷFDU UIBU BOE TFF JG JU
DIBOHFT BOZUIJOH JO UIF QSPHSBN FYFDVUJPO
*G ZPV FYFDVUF UIJT ZPV TIPVME TFF TPNFUIJOH MJLF
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

Prelude> :load print3.hs


[1 of 1] Compiling Print3
Ok, modules loaded: Print3.
*Print3> main
hello world!
hello world!
*Print3>

5IJT MJUUMF FYFSDJTF EFNPOTUSBUFT B GFX UIJOHT

 8F EFƶOFE WBMVFT BU UIF UPQ MFWFM PG B NPEVMF myGreeting


hello world BOE main
 5IBU JT UIFZ XFSF EFDMBSFE BU UIF
UPQ MFWFM TP UIBU UIFZ BSF BWBJMBCMF UISPVHIPVU UIF NPEVMF

 8F TQFDJGZ FYQMJDJU UZQFT GPS UPQMFWFM EFƶOJUJPOT

 8F DPODBUFOBUF TUSJOHT XJUI (++) BOE concat

 5PQMFWFM WFSTVT MPDBM EFƶOJUJPOT


8IBU EPFT JU NFBO GPS TPNFUIJOH UP CF BU UIF UPQ MFWFM PG B
NPEVMF *U EPFTOƊU OFDFTTBSJMZ NFBO JUƊT EFƶOFE BU UIF UPQ PG
UIF ƶMF 8IFO UIF DPNQJMFS SFBET UIF ƶMF JU XJMM TFF BMM UIF
UPQMFWFM EFDMBSBUJPOT OP NBUUFS XIBU PSEFS UIFZ DPNF JO UIF
ƶMF XJUI TPNF MJNJUBUJPOT XIJDI XFƊMM TFF MBUFS
 5PQMFWFM
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

EFDMBSBUJPOT BSF OPU OFTUFE XJUIJO BOZUIJOH FMTF BOE UIFZ BSF
JO TDPQF UISPVHIPVU UIF XIPMF NPEVMF
8F DBO DPOUSBTU B UPQMFWFM EFƶOJUJPO XJUI B MPDBM EFƶOJUJPO
5P CF MPDBMMZ EFƶOFE XPVME NFBO UIF EFDMBSBUJPO JT OFTUFE
XJUIJO TPNF PUIFS FYQSFTTJPO BOE JT OPU WJTJCMF PVUTJEF UIBU
FYQSFTTJPO 8F QSBDUJDFE UIJT JO UIF QSFWJPVT DIBQUFS XJUI let
BOE where )FSFƊT BO FYBNQMF GPS SFWJFX

module TopOrLocal where

topLevelFunction :: Integer -> Integer


topLevelFunction x = x + woot + topLevelValue
where woot :: Integer
woot = 10

topLevelValue :: Integer
topLevelValue = 5

*O UIF BCPWF ZPV DPVME JNQPSU BOE VTF topLevelFunction


PS topLevelValue GSPN BOPUIFS NPEVMF BOE UIFZ BSF BDDFTTJ
CMF UP FWFSZUIJOH FMTF JO UIF NPEVMF )PXFWFS woot JT FƵFD
UJWFMZ JOWJTJCMF PVUTJEF PG topLevelFunction 5IF where BOE let
DMBVTFT JO )BTLFMM JOUSPEVDF MPDBM CJOEJOHT PS EFDMBSBUJPOT
5P CJOE PS EFDMBSF TPNFUIJOH NFBOT UP HJWF BO FYQSFTTJPO B
OBNF :PV DPVME QBTT BSPVOE BOE VTF BO BOPOZNPVT WFSTJPO
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

PG topLevelFunction NBOVBMMZ CVU HJWJOH JU B OBNF BOE SFVTJOH


JU CZ UIBU OBNF JT MFTT SFQFUJUJPVT
"MTP OPUF XF FYQMJDJUMZ EFDMBSFE UIF UZQF PG woot JO UIF where
DMBVTF VTJOH UIF :: TZOUBY 5IJT XBTOƊU OFDFTTBSZ )BTLFMMƊT
UZQF JOGFSFODF XPVMEƊWF ƶHVSFE JU PVU
CVU JU XBT EPOF IFSF
UP TIPX ZPV IPX #F TVSF UP MPBE BOE SVO UIJT DPEF JO ZPVS
3&1-

Prelude> :l TopOrLocal.hs
[1 of 1] Compiling TopOrLocal
Ok, modules loaded: TopOrLocal.
*TopOrLocal> topLevelFunction 5
20

&YQFSJNFOU XJUI EJƵFSFOU BSHVNFOUT BOE NBLF TVSF ZPV


VOEFSTUBOE UIF SFTVMUT ZPVƊSF HFUUJOH CZ XBMLJOH UISPVHI UIF
BSJUINFUJD JO ZPVS IFBE PS PO QBQFS


&YFSDJTFT 4DPQF
 5IFTF MJOFT PG DPEF BSF GSPN B 3&1- TFTTJPO *T Ԩ JO TDPQF
GPS ԩ

Prelude> let x = 5
Prelude> let y = 7
Prelude> let z = x * y
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

 5IFTF MJOFT PG DPEF BSF GSPN B 3&1- TFTTJPO *T ԗ JO TDPQF


GPS GVODUJPO Ԗ (P XJUI ZPVS HVU IFSF

Prelude> let f = 3
Prelude> let g = 6 * f + h

 5IJT DPEF TBNQMF JT GSPN B TPVSDF ƶMF *T FWFSZUIJOH XF


OFFE UP FYFDVUF area JO TDPQF

area d = pi * (r * r)
r = d / 2

 5IJT DPEF JT BMTP GSPN B TPVSDF ƶMF /PX BSF ԡ BOE ԓ JO


TDPQF GPS area

area d = pi * (r * r)
where r = d / 2

 5ZQFT PG DPODBUFOBUJPO GVODUJPOT


-FUƊT MPPL BU UIF UZQFT PG (++) BOE concat 5IF ++ GVODUJPO JT
BO JOƶY PQFSBUPS 8IFO XF OFFE UP SFGFS UP BO JOƶY PQFSBUPS
JO B QPTJUJPO UIBU JT OPU JOƶY ƈ TVDI BT XIFO XF BSF VTJOH JU
JO B QSFƶY QPTJUJPO PS IBWJOH JU TUBOE BMPOF JO PSEFS UP RVFSZ
JUT UZQF ƈ XF NVTU QVU QBSFOUIFTFT BSPVOE JU 0O UIF PUIFS
IBOE concat JT B OPSNBM OPU JOƶY
GVODUJPO TP QBSFOUIFTFT
BSFOƊU OFDFTTBSZ
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

++ has the type [a] -> [a] -> [a]


concat has the type [[a]] -> [a]

-- Here's how we query that in ghci:


Prelude> :t (++)
(++) :: [a] -> [a] -> [a]
Prelude> :t concat
concat :: [[a]] -> [a]

5IF UZQF PG concat TBZT UIBU XF IBWF B MJTU PG MJTUT BT JOQVU


BOE XF XJMM SFUVSO B MJTU *U XJMM IBWF UIF TBNF WBMVFT JOTJEF JU
BT UIF MJTU PG MJTUT EJE JU KVTU ƷBUUFOT JU JOUP POF MJTU TUSVDUVSF JO
B NBOOFS PG TQFBLJOH " String JT B MJTU B MJTU PG Char TQFDJƶDBMMZ
BOE concat DBO XPSL PO MJTUT PG TUSJOHT PS MJTUT PG MJTUT PG PUIFS
UIJOHT

Prelude> concat [[1, 2], [3, 4, 5], [6, 7]]


[1,2,3,4,5,6,7]
Prelude> concat ["Iowa", "Melman", "Django"]
"IowaMelmanDjango"

OC "TTVNJOH ZPV BSF VTJOH ()$  PS IJHIFS JG ZPV


DIFDL UIJT UZQF TJHOBUVSF JO ZPVS 3&1- ZPV XJMM ƶOE EJƵFSFOU
SFTVMU 8F XJMM FYQMBJO UIF SFBTPO GPS JU MBUFS JO UIF CPPL 'PS
ZPVS QVSQPTFT BU UIJT QPJOU QMFBTF VOEFSTUBOE Foldable t =>
t [a] BT CFJOH [[a]] 5IF Foldable t GPS PVS DVSSFOU QVSQPTFT
DBO CF UIPVHIU PG BT BOPUIFS MJTU *O USVUI MJTU JT POMZ POF PG UIF
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

QPTTJCMF UZQFT IFSF ƈ UZQFT UIBU IBWF JOTUBODFT PG UIF Foldable


UZQFDMBTT ƈ CVU SJHIU OPX MJTUT BSF UIF POMZ POF XF DBSF BCPVU

#VU XIBU EP UIFTF UZQFT NFBO )FSFƊT IPX XF DBO CSFBL JU


EPXO

(++) :: [a] -> [a] -> [a]


-- [1] [2] [3]

&WFSZUIJOH BǒFS UIF :: JT BCPVU PVS UZQFT OPU PVS WBMVFT


5IF ƉBƊ JOTJEF UIF MJTU UZQF DPOTUSVDUPS [] JT B UZQF WBSJBCMF

 5BLF BO BSHVNFOU PG UZQF [a] 5IJT UZQF JT B MJTU PG FMF


NFOUT PG TPNF UZQF Ԑ 5IJT GVODUJPO EPFT OPU LOPX XIBU
UZQF Ԑ JT *U EPFTOƊU OFFE UP LOPX *O UIF DPOUFYU PG UIF
QSPHSBN UIF UZQF PG Ԑ XJMM CF LOPXO BOE NBEF DPODSFUF
BU TPNF QPJOU

 5BLF BOPUIFS BSHVNFOU PG UZQF [a] B MJTU PG FMFNFOUT


XIPTF UZQF XF EPOƊU LOPX #FDBVTF UIF WBSJBCMFT BSF UIF
TBNF UIFZ NVTU CF UIF TBNF UZQF UISPVHIPVU B  B


 3FUVSO B SFTVMU PG UZQF [a]

"T XFƊMM TFF CFDBVTF String JT B UZQF PG MJTU UIF PQFSBUPST


XF VTF XJUI TUSJOHT DBO BMTP CF VTFE PO MJTUT PG PUIFS UZQFT
TVDI BT MJTUT PG OVNCFST 5IF UZQF [a] NFBOT UIBU XF IBWF
B MJTU XJUI FMFNFOUT PG B UZQF Ԑ XF EP OPU ZFU LOPX *G XF
VTF UIF PQFSBUPST UP DPODBUFOBUF MJTUT PG OVNCFST UIFO UIF
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

Ԑ JO [a] XJMM CF TPNF UZQF PG OVNCFS GPS FYBNQMF JOUFHFST



*G XF BSF DPODBUFOBUJOH MJTUT PG DIBSBDUFST UIFO Ԑ SFQSFTFOUT
B $IBS CFDBVTF 4USJOH JT [Char] 5IF UZQF WBSJBCMF Ԑ JO [a]
JT QPMZNPSQIJD 1PMZNPSQIJTN JT BO JNQPSUBOU GFBUVSF PG
)BTLFMM 'PS DPODBUFOBUJPO FWFSZ MJTU NVTU CF UIF TBNF UZQF
PG MJTU XF DBOOPU DPODBUFOBUF B MJTU PG OVNCFST XJUI B MJTU PG
DIBSBDUFST GPS FYBNQMF )PXFWFS TJODF UIF Ԑ JT B WBSJBCMF BU
UIF UZQF MFWFM UIF MJUFSBM WBMVFT JO FBDI MJTU XF DPODBUFOBUF
OFFE OPU CF UIF TBNF POMZ UIF TBNF UZQF *O PUIFS XPSET Ԑ
NVTU FRVBM Ԑ B  B


Prelude> "hello" ++ " Chris"


"hello Chris"

-- but

Prelude> "hello" ++ [1, 2, 3]

<interactive>:14:13:
No instance for (Num Char) arising
from the literal ‘1’
In the expression: 1
In the second argument of ‘(++)’,
namely ‘[1, 2, 3]’
In the expression: "hello" ++ [1, 2, 3]
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

*O UIF ƶSTU FYBNQMF XF IBWF UXP TUSJOHT TP UIF UZQF PG Ԑ


NBUDIFT ƈ UIFZƊSF CPUI $IBS JO [Char] FWFO UIPVHI UIF MJUFSBM
WBMVFT BSF EJƵFSFOU 4JODF UIF UZQF NBUDIFT OP UZQF FSSPS
PDDVST BOE XF TFF UIF DPODBUFOBUFE SFTVMU
*O UIF TFDPOE FYBNQMF XF IBWF UXP MJTUT B 4USJOH BOE B
MJTU PG OVNCFST
XIPTF UZQFT EP OPU NBUDI TP XF HFU UIF
FSSPS NFTTBHF ()$J BTLT GPS BO JOTUBODF PG UIF OVNFSJD
UZQFDMBTT Num GPS UIF UZQF Char 8F XJMM EJTDVTT UZQFDMBTTFT MBUFS
5ZQFDMBTTFT QSPWJEF EFƶOJUJPOT PG PQFSBUJPOT PS GVODUJPOT
UIBU DBO CF TIBSFE BDSPTT TFUT PG UZQFT 'PS OPX ZPV DBO
VOEFSTUBOE UIJT NFTTBHF BT UFMMJOH ZPV UIF UZQFT EPOƊU NBUDI
TP JU DBOƊU DPODBUFOBUF UIF UXP MJTUT

&YFSDJTFT 4ZOUBY &SSPST


3FBE UIF TZOUBY PG UIF GPMMPXJOH GVODUJPOT BOE EFDJEF XIFUIFS
JU XJMM DPNQJMF 5FTU UIFN JO ZPVS 3&1- BOE USZ UP ƶY UIF
TZOUBY FSSPST XIFSF UIFZ PDDVS

 ++ [1, 2, 3] [4, 5, 6]

 '<3' ++ ' Haskell'

 concat ["<3", " Haskell"]


$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

 $PODBUFOBUJPO BOE TDPQJOH


8F XJMM VTF QBSFOUIFTFT UP DBMM ++ BT B QSFƶY OPU JOƶY
GVODUJPO

-- print3flipped.hs
module Print3Flipped where

myGreeting :: String
myGreeting = (++) "hello" " world!"

hello :: String
hello = "hello"

world :: String
world = "world!"

main :: IO ()
main = do
putStrLn myGreeting
putStrLn secondGreeting
where secondGreeting =
(++) hello ((++) " " world)
-- could've been:
-- secondGreeting = hello ++ " " ++ world
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

*O secondGreeting VTJOH ++ BT B QSFƶY GVODUJPO GPSDFT VT UP


TIJǒ TPNF UIJOHT BSPVOE 1BSFOUIFTJ[JOH JU UIBU XBZ FNQIB
TJ[FT UIF SJHIU BTTPDJBUJWJUZ PG UIF ++ GVODUJPO 4JODF JUƊT BO JOƶY
PQFSBUPS ZPV DBO DIFDL GPS ZPVSTFMG UIBU JUƊT SJHIU BTTPDJBUJWF

Prelude> :i (++)
(++) :: [a] -> [a] -> [a] -- Defined in ‘GHC.Base’
infixr 5 ++

5IF where DMBVTF DSFBUFT MPDBM CJOEJOHT GPS FYQSFTTJPOT UIBU


BSF OPU WJTJCMF BU UIF UPQ MFWFM *O PUIFS XPSET UIF where DMBVTF
JO UIF NBJO GVODUJPO JOUSPEVDFT B EFƶOJUJPO WJTJCMF POMZ XJUIJO
UIF FYQSFTTJPO PS GVODUJPO JUƊT BUUBDIFE UP SBUIFS UIBO NBL
JOH JU WJTJCMF UP UIF FOUJSF NPEVMF 4PNFUIJOH WJTJCMF BU UIF
UPQ MFWFM JT JO TDPQF GPS BMM QBSUT PG UIF NPEVMF BOE NBZ CF
FYQPSUFE CZ UIF NPEVMF PS JNQPSUFE CZ B EJƵFSFOU NPEVMF
-PDBM EFƶOJUJPOT PO UIF PUIFS IBOE BSF POMZ WJTJCMF UP UIBU
POF GVODUJPO :PV DBOOPU JNQPSU JOUP B EJƵFSFOU NPEVMF BOE
SFVTF secondGreeting
5P JMMVTUSBUF
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

-- print3broken.hs
module Print3Broken where

printSecond :: IO ()
printSecond = do
putStrLn greeting

main :: IO ()
main = do
putStrLn greeting
printSecond
where greeting = "Yarrrrr"

:PV TIPVME HFU BO FSSPS MJLF UIJT

Prelude> :l print3broken.hs
[1 of 1] Compiling Print3Broken ( print3broken.hs, interpreted

print3broken.hs:6:12: Not in scope: ‘greeting’


Failed, modules loaded: none.

-FUƊT UBLF B DMPTFS MPPL BU UIJT FSSPS

print3broken.hs:6:12: Not in scope: ‘greeting’


# [1][2] [3] [4]

 5IF MJOF UIF FSSPS PDDVSSFE PO JO UIJT DBTF MJOF 


$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

 5IF DPMVNO UIF FSSPS PDDVSSFE PO DPMVNO  5FYU


PO DPNQVUFST JT PǒFO EFTDSJCFE JO UFSNT PG MJOFT BOE
DPMVNOT 5IFTF MJOF BOE DPMVNO OVNCFST BSF BCPVU MJOFT
BOE DPMVNOT JO ZPVS UFYU ƶMF DPOUBJOJOH UIF TPVSDF DPEF

 5IF BDUVBM QSPCMFN 8F SFGFS UP TPNFUIJOH OPU JO TDPQF


UIBU JT OPU WJTJCMF UP UIF printSecond GVODUJPO

 5IF UIJOH XF SFGFSSFE UP UIBU JTOƊU WJTJCMF PS JO TDPQF

/PX NBLF UIF Print3Broken DPEF DPNQJMF *U TIPVME QSJOU


ƌ:BSSSSSƍ UXJDF PO UXP EJƵFSFOU MJOFT BOE UIFO FYJU

 .PSF MJTU GVODUJPOT


4JODF B String JT B TQFDJBMJ[FE UZQF PG MJTU ZPV DBO VTF TUBOEBSE
MJTU PQFSBUJPOT PO TUSJOHT BT XFMM
)FSF BSF TPNF FYBNQMFT

Prelude> :t 'c'
'c' :: Char
Prelude> :t "c"
"c" :: [Char] -- List of Char is String, same thing.

-- the : operator, called "cons," builds a list


Prelude> 'c' : "hris"
"chris"
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

Prelude> 'P' : ""


"P"

-- head returns the head or first element of a list


Prelude> head "Papuchon"
'P'

-- tail returns the list with the head chopped off


Prelude> tail "Papuchon"
"apuchon"

-- take returns the specified number of elements


-- from the list, starting from the left:
Prelude> take 1 "Papuchon"
"P"
Prelude> take 0 "Papuchon"
""
Prelude> take 6 "Papuchon"
"Papuch"

-- drop returns the remainder of the list after the


-- specified number of elements has been dropped:
Prelude> drop 4 "Papuchon"
"chon"
Prelude> drop 9001 "Papuchon"
""
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

Prelude> drop 1 "Papuchon"


"apuchon"

-- we've already seen the ++ operator


Prelude> "Papu" ++ "chon"
"Papuchon"
Prelude> "Papu" ++ ""
"Papu"

-- !! returns the element that is in the specified


-- position in the list. Note that this is an
-- indexing function, and indices in Haskell start
-- from 0. That means the first element of your
-- list is 0, not 1, when using this function.
Prelude> "Papuchon" !! 0
'P'
Prelude> "Papuchon" !! 4
'c'

/PUF UIBU XIJMF BMM UIFTF GVODUJPOT BSF TUBOEBSE 1SFMVEF


GVODUJPOT NBOZ PG UIFN BSF DPOTJEFSFE VOTBGF 5IFZ BSF VO
TBGF CFDBVTF UIFZ EP OPU DPWFS UIF DBTF XIFSF UIFZ BSF HJWFO
BO FNQUZ MJTU BT JOQVU *OTUFBE UIFZ KVTU UISPX PVU BO FSSPS
NFTTBHF PS FYDFQUJPO

Prelude> head ""


$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

*** Exception: Prelude.head: empty list


Prelude> "" !! 4
*** Exception: Prelude.!!: index too large

5IJT JTOƊU JEFBM CFIBWJPS TP UIF VTF PG UIFTF GVODUJPOT JT


DPOTJEFSFE VOXJTF GPS QSPHSBNT PG BOZ SFBM TJ[F PS DPNQMFYJUZ
BMUIPVHI XF XJMM VTF UIFN JO UIFTF ƶSTU GFX DIBQUFST 8F XJMM
BEESFTT IPX UP DPWFS BMM DBTFT BOE NBLF TBGFS WFSTJPOT PG TVDI
GVODUJPOT JO B MBUFS DIBQUFS

 $IBQUFS &YFSDJTFT


3FBEJOH TZOUBY
 'PS UIF GPMMPXJOH MJOFT PG DPEF SFBE UIF TZOUBY DBSFGVMMZ
BOE EFDJEF JG UIFZ BSF XSJUUFO DPSSFDUMZ 5FTU UIFN JO ZPVS
3&1- BǒFS ZPVƊWF EFDJEFE UP DIFDL ZPVS XPSL $PSSFDU
BT NBOZ BT ZPV DBO

B
concat [[1, 2, 3], [4, 5, 6]]

C
++ [1, 2, 3] [4, 5, 6]

D
(++) "hello" " world"

E
["hello" ++ " world]

F
4 !! "hello"

G
(!!) "hello" 4
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

H
take "4 lovely"

I
take 3 "awesome"

 /FYU XF IBWF UXP TFUT UIF ƶSTU TFU JT MJOFT PG DPEF BOE
UIF PUIFS JT B TFU PG SFTVMUT 3FBE UIF DPEF BOE ƶHVSF PVU
XIJDI SFTVMUT DBNF GSPN XIJDI MJOFT PG DPEF #F TVSF UP
UFTU UIFN JO UIF 3&1-

B
concat [[1 * 6], [2 * 6], [3 * 6]]

C
"rain" ++ drop 2 "elbow"

D
10 * head [1, 2, 3]

E
(take 3 "Julie") ++ (tail "yes")

F
concat [tail [1, 2, 3],
tail [4, 5, 6],
tail [7, 8, 9]]

$BO ZPV NBUDI FBDI PG UIF QSFWJPVT FYQSFTTJPOT UP POF


PG UIFTF SFTVMUT QSFTFOUFE JO B TDSBNCMFE PSEFS

B
"Jules"
C
[2,3,5,6,8,9]
D
"rainbow"
E
[6,12,18]
F
10
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

#VJMEJOH GVODUJPOT
 (JWFO UIF MJTUNBOJQVMBUJPO GVODUJPOT NFOUJPOFE JO UIJT
DIBQUFS XSJUF GVODUJPOT UIBU UBLF UIF GPMMPXJOH JOQVUT BOE
SFUVSO UIF FYQFDUFE PVUQVUT %P UIFN EJSFDUMZ JO ZPVS
3&1- BOE VTF UIF take BOE drop GVODUJPOT ZPVƊWF BMSFBEZ
TFFO

&YBNQMF

-- If you apply your function to this value:


"Hello World"
-- Your function should return:
"ello World"

5IF GPMMPXJOH XPVME CF B ƶOF TPMVUJPO

Prelude> drop 1 "Hello World"


"ello World"

/PX XSJUF FYQSFTTJPOT UP QFSGPSN UIF GPMMPXJOH USBOT


GPSNBUJPOT KVTU XJUI UIF GVODUJPOT ZPVƊWF TFFO JO UIJT
DIBQUFS :PV EP OPU OFFE UP EP BOZUIJOH DMFWFS IFSF

B
-- Given
"Curry is awesome"
-- Return
"Curry is awesome!"
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

C
-- Given
"Curry is awesome!"
-- Return
"y"

D
-- Given
"Curry is awesome!"
-- Return
"awesome!"

 /PX UBLF FBDI PG UIF BCPWF BOE SFXSJUF JU JO B TPVSDF


ƶMF BT B HFOFSBM GVODUJPO UIBU DPVME UBLF EJƵFSFOU TUSJOH
JOQVUT BT BSHVNFOUT CVU SFUBJO UIF TBNF CFIBWJPS 6TF
B WBSJBCMF BT UIF BSHVNFOU UP ZPVS OBNFE
GVODUJPOT *G
ZPVƊSF VOTVSF IPX UP EP UIJT SFGSFTI ZPVS NFNPSZ CZ
MPPLJOH BU UIF waxOff FYFSDJTF GSPN UIF QSFWJPVT DIBQUFS
BOE UIF TopOrLocal NPEVMF GSPN UIJT DIBQUFS

 8SJUF B GVODUJPO PG UZQF String -> Char XIJDI SFUVSOT UIF


UIJSE DIBSBDUFS JO B 4USJOH 3FNFNCFS UP HJWF UIF GVODUJPO
B OBNF BOE BQQMZ JU UP B WBSJBCMF OPU B TQFDJƶD 4USJOH
TP UIBU JU DPVME CF SFVTFE GPS EJƵFSFOU 4USJOH JOQVUT BT
EFNPOTUSBUFE GFFM GSFF UP OBNF UIF GVODUJPO TPNFUIJOH
FMTF #F TVSF UP ƶMM JO UIF UZQF TJHOBUVSF BOE ƶMM JO UIF
GVODUJPO EFƶOJUJPO BǒFS UIF FRVBMT TJHO

$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

thirdLetter ::
thirdLetter x =

-- If you apply your function to this value:


"Curry is awesome"
-- Your function should return
`r'

/PUF UIBU QSPHSBNNJOH MBOHVBHFT DPOWFOUJPOBMMZ TUBSU


JOEFYJOH UIJOHT CZ [FSP TP HFUUJOH UIF [FSPUI JOEFY PG B
TUSJOH XJMM HFU ZPV UIF ƶSTU MFUUFS "DDPSEJOHMZ JOEFYJOH
XJUI  XJMM BDUVBMMZ HFU ZPV UIF GPVSUI ,FFQ UIJT JO NJOE
BT ZPV XSJUF UIJT GVODUJPO

 /PX DIBOHF UIBU GVODUJPO TP UIF TUSJOH PQFSBUFE PO JT


BMXBZT UIF TBNF BOE UIF WBSJBCMF SFQSFTFOUT UIF OVNCFS
PG UIF MFUUFS ZPV XBOU UP SFUVSO ZPV DBO VTF ƌ$VSSZ JT
BXFTPNFƍ BT ZPVS TUSJOH JOQVU PS B EJƵFSFOU TUSJOH JG ZPV
QSFGFS


letterIndex :: Int -> Char


letterIndex x =

 6TJOH UIF take BOE drop GVODUJPOT XF MPPLFE BU BCPWF TFF


JG ZPV DBO XSJUF B GVODUJPO DBMMFE rvrs BO BCCSFWJBUJPO PG
ƉSFWFSTFƊ VTFE CFDBVTF UIFSF JT B GVODUJPO DBMMFE ƉSFWFSTFƊ
BMSFBEZ JO 1SFMVEF TP JG ZPV DBMM ZPVS GVODUJPO UIF TBNF
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

OBNF ZPVƊMM HFU BO FSSPS NFTTBHF


 rvrs TIPVME UBLF UIF
TUSJOH ƌ$VSSZ JT BXFTPNFƍ BOE SFUVSO UIF SFTVMU ƌBXFTPNF
JT $VSSZƍ 5IJT NBZ OPU CF UIF NPTU MPWFMZ )BTLFMM DPEF
ZPV XJMM FWFS XSJUF CVU JU JT RVJUF QPTTJCMF VTJOH POMZ XIBU
XFƊWF MFBSOFE TP GBS 'JSTU XSJUF JU BT B TJOHMF GVODUJPO JO
B TPVSDF ƶMF 5IJT EPFTOƊU OFFE UP BOE TIPVMEOƊU XPSL
GPS SFWFSTJOH UIF XPSET PG BOZ TFOUFODF :PVƊSF FYQFDUFE
POMZ UP TMJDF BOE EJDF UIJT QBSUJDVMBS TUSJOH XJUI take BOE
drop

 -FUƊT TFF JG XF DBO FYQBOE UIBU GVODUJPO JOUP B NPEVMF


8IZ XPVME XF XBOU UP #Z FYQBOEJOH JU JOUP B NPEVMF
XF DBO BEE NPSF GVODUJPOT MBUFS UIBU DBO JOUFSBDU XJUI
FBDI PUIFS 8F DBO BMTP UIFO FYQPSU JU UP PUIFS NPEVMFT
JG XF XBOU UP BOE VTF UIJT DPEF JO UIPTF PUIFS NPEVMFT
5IFSF BSF EJƵFSFOU XBZT ZPV DPVME MBZ JU PVU CVU GPS UIF
TBLF PG DPOWFOJFODF XFƊMM TIPX ZPV B TBNQMF MBZPVU TP
UIBU ZPV DBO ƶMM JO UIF CMBOLT

module Reverse where

rvrs :: String -> String


rvrs x =

main :: IO ()
main = print ()
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

*OUP UIF QBSFOUIFTFT BǒFS print ZPVƊMM OFFE UP ƶMM JO ZPVS


GVODUJPO OBNF rvrs QMVT UIF BSHVNFOU ZPVƊSF BQQMZJOH
rvrs UP JO UIJT DBTF ƌ$VSSZ JT BXFTPNFƍ 5IBU rvrs GVODUJPO
QMVT JUT BSHVNFOU BSF OPX UIF BSHVNFOU UP print *UƊT
JNQPSUBOU UP QVU UIFN JOTJEF UIF QBSFOUIFTFT TP UIBU UIBU
GVODUJPO HFUT BQQMJFE BOE FWBMVUFE ƶSTU BOE UIFO UIBU
SFTVMU JT QSJOUFE
0G DPVSTF XF IBWF BMTP NFOUJPOFE UIBU ZPV DBO VTF UIF $
TZNCPM UP BWPJE VTJOH QBSFOUIFTFT UPP 5SZ NPEJGZJOH
ZPVS NBJO GVODUJPO UP VTF UIBU JOTUFBE PG UIF QBSFOUIFTFT

 %FƶOJUJPOT
 " 4USJOH JT B TFRVFODF PG DIBSBDUFST *O )BTLFMM String JT
SFQSFTFOUFE CZ B MJOLFEMJTU PG Char WBMVFT BLB [Char]

 " UZQF PS EBUBUZQF JT B DMBTTJƶDBUJPO PG WBMVFT PS EBUB


5ZQFT JO )BTLFMM EFUFSNJOF XIBU WBMVFT BSF NFNCFST
PG UIF UZQF PS UIBU JOIBCJU UIF UZQF 6OMJLF JO PUIFS MBO
HVBHFT EBUBUZQFT JO )BTLFMM CZ EFGBVMU EP OPU EFMJNJU UIF
PQFSBUJPOT UIBU DBO CF QFSGPSNFE PO UIBU EBUB

 $PODBUFOBUJPO JT UIF KPJOJOH UPHFUIFS PG TFRVFODFT PG WBM


VFT 0ǒFO JO )BTLFMM UIJT JT NFBOU XJUI SFTQFDU UP UIF []
PS ƌ-JTUƍ EBUBUZQF XIJDI BMTP BQQMJFT UP String XIJDI JT
$)"15&3  4*.1-& 01&3"5*0/4 8*5) 5&95 

[Char] 5IF DPODBUFOBUJPO GVODUJPO JO )BTLFMM JT (++) XIJDI


IBT UZQF [a] -> [a] -> [a] 'PS FYBNQMF

Prelude> "tacos" ++ " " ++ "rock"


"tacos rock"

 4DPQF JT XIFSF B WBSJBCMF SFGFSSFE UP CZ OBNF JT WBMJE


"OPUIFS XPSE VTFE XJUI UIF TBNF NFBOJOH JT WJTJCJMJUZ
CFDBVTF JG B WBSJBCMF JTOƊU WJTJCMF JUƊT OPU JO TDPQF

 -PDBM CJOEJOHT BSF CJOEJOHT MPDBM UP QBSUJDVMBS FYQSFTTJPOT


5IF QSJNBSZ EFMJOFBUJPO IFSF GSPN UPQ MFWFM CJOEJOHT JT
UIBU MPDBM CJOEJOHT DBOOPU CF JNQPSUFE CZ PUIFS QSPHSBNT
PS NPEVMFT

 5PQ MFWFM CJOEJOHT JO )BTLFMM BSF CJOEJOHT UIBU TUBOE PVUTJEF


PG BOZ PUIFS EFDMBSBUJPO 5IF NBJO GFBUVSF PG UPQMFWFM
CJOEJOHT JT UIBU UIFZ DBO CF NBEF BWBJMBCMF UP PUIFS NPE
VMFT XJUIJO ZPVS QSPHSBNT PS UP PUIFS QFPQMFƊT QSPHSBNT

 %BUB TUSVDUVSFT BSF B XBZ PG PSHBOJ[JOH EBUB TP UIBU UIF


EBUB DBO CF BDDFTTFE DPOWFOJFOUMZ PS FƸDJFOUMZ
$IBQUFS 

#BTJD EBUBUZQFT

5IFSF BSF NBOZ XBZT PG


USZJOH UP VOEFSTUBOE
QSPHSBNT 1FPQMF PǒFO
SFMZ UPP NVDI PO POF
XBZ XIJDI JT DBMMFE
ƌEFCVHHJOHƍ BOE DPOTJTUT
PG SVOOJOH B
QBSUMZVOEFSTUPPE
QSPHSBN UP TFF JG JU EPFT
XIBU ZPV FYQFDUFE
"OPUIFS XBZ XIJDI .-
BEWPDBUFT JT UP JOTUBMM
TPNF NFBOT PG
VOEFSTUBOEJOH JO UIF WFSZ
QSPHSBNT UIFNTFMWFT

3PCJO .JMOFS


$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

 #BTJD %BUBUZQFT


)BTLFMM IBT B SPCVTU BOE FYQSFTTJWF UZQF TZTUFN 5ZQFT QMBZ BO
JNQPSUBOU SPMF JO UIF SFBEBCJMJUZ TBGFUZ BOE NBJOUBJOBCJMJUZ PG
)BTLFMM DPEF BT UIFZ BMMPX VT UP DMBTTJGZ BOE EFMJNJU EBUB UIVT
SFTUSJDUJOH UIF GPSNT PG EBUB PVS QSPHSBNT DBO QSPDFTT 5ZQFT
BMTP DBMME EBUBUZQFT QSPWJEF UIF NFBOT UP CVJME QSPHSBNT NPSF
RVJDLMZ BOE BMTP BMMPX GPS HSFBUFS FBTF PG NBJOUFOBODF "T XF
MFBSO NPSF )BTLFMM XFƊMM MFBSO IPX UP MFWFSBHF UZQFT JO B XBZ
UIBU MFUT VT BDDPNQMJTI UIF TBNF UIJOHT CVU XJUI MFTT DPEF
4P GBS XFƊWF MPPLFE BU FYQSFTTJPOT JOWPMWJOH OVNCFST DIBS
BDUFST BOE MJTUT PG DIBSBDUFST BMTP DBMMFE TUSJOHT 5IFTF BSF
TPNF PG UIF TUBOEBSE CVJMUJO EBUBUZQFT UIBU DBUFHPSJ[F BOE
EFMJNJU WBMVFT 8IJMF UIPTF BSF VTFGVM EBUBUZQFT BOE DPWFS B
MPU PG UZQFT PG WBMVFT UIFZ DFSUBJOMZ EPOƊU DPWFS FWFSZ UZQF PG
EBUB *O UIJT DIBQUFS XF XJMM

Ƒ SFWJFX UZQFT XF IBWF TFFO JO QSFWJPVT DIBQUFST

Ƒ MFBSO BCPVU EBUBUZQFT UZQF DPOTUSVDUPST BOE EBUB DPO


TUSVDUPST

Ƒ XPSL XJUI QSFEFƶOFE EBUBUZQFT

Ƒ MFBSO NPSF BCPVU UZQF TJHOBUVSFT BOE B CJU BCPVU UZQF


DMBTTFT
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

 8IBU BSF UZQFT


&YQSFTTJPOT XIFO FWBMVBUFE SFEVDF UP WBMVFT &WFSZ WBMVF
IBT B UZQF 5ZQFT BSF IPX XF HSPVQ B TFU PG WBMVFT UPHFUIFS
UIBU TIBSF TPNFUIJOH JO DPNNPO 4PNFUJNFT UIBU ƌTPNFUIJOH
JO DPNNPOƍ JT BCTUSBDU TPNFUJNFT JUƊT B TQFDJƶD NPEFM PG B
QBSUJDVMBS DPODFQU PS EPNBJO *G ZPVƊWF UBLFO B NBUIFNBUJDT
DPVSTF UIBU DPWFSFE TFUT UIJOLJOH BCPVU UZQFT BT CFJOH MJLF
TFUT XJMM IFMQ HVJEF ZPVS JOUVJUJPO PO XIBU UZQFT BSF BOE IPX
UIFZ XPSL JO B NBUIFNBUJDBM TFOTF

 "OBUPNZ PG B EBUB EFDMBSBUJPO


%BUB EFDMBSBUJPOT BSF IPX EBUBUZQFT BSF EFƶOFE
5IF UZQF DPOTUSVDUPS JT UIF OBNF PG UIF UZQF BOE JT DBQJ
UBMJ[FE 8IFO ZPV BSF SFBEJOH PS XSJUJOH UZQF TJHOBUVSFT UIF
UZQF MFWFM PG ZPVS DPEF
UIF UZQF OBNFT PS UZQF DPOTUSVDUPST
BSF XIBU ZPV VTF
%BUB DPOTUSVDUPST BSF UIF WBMVFT UIBU JOIBCJU UIF UZQF UIFZ
BSF EFƶOFE JO 5IFZ BSF UIF WBMVFT UIBU TIPX VQ JO ZPVS DPEF
BU UIF UFSN MFWFM JOTUFBE PG UIF UZQF MFWFM #Z ƌUFSN MFWFMƍ XF
NFBO UIFZ BSF UIF WBMVFT BT UIFZ BQQFBS JO ZPVS DPEF PS UIF
WBMVFT UIBU ZPVS DPEF FWBMVBUFT UP

4FU UIFPSZ JT UIF TUVEZ PG NBUIFNBUJDBM DPMMFDUJPOT PG PCKFDUT 4FU UIFPSZ XBT B
QSFDVSTPS UP UZQF UIFPSZ UIF MBUUFS CFJOH VTFE QSPMJƶDBMMZ JO UIF EFTJHO PG QSPHSBNNJOH
MBOHVBHFT MJLF )BTLFMM -PHJDBM PQFSBUJPOT MJLF EJTKVODUJPO PS
BOE DPOKVODUJPO BOE
VTFE
JO UIF NBOJQVMBUJPO PG TFUT IBWF FRVJWBMFOUT JO )BTLFMMƊT UZQF TZTUFN
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

8F XJMM TUBSU XJUI B CBTJD EBUBUZQF UP TFF IPX EBUBUZQFT BSF


TUSVDUVSFE BOE HFU BDRVBJOUFE XJUI UIF WPDBCVMBSZ Bool JTOƊU B
EBUBUZQF XFƊWF TFFO ZFU JO UIF CPPL CVU JU QSPWJEFT GPS USVUI
WBMVFT *U JT OBNFE BǒFS UIF HSFBU MPHJDJBO (FPSHF #PPMF BOE
UIF TZTUFN PG MPHJD OBNFE GPS IJN #FDBVTF UIFSF BSF POMZ
UXP USVUI WBMVFT JUƊT FBTZ UP MJTU BMM UIF EBUB DPOTUSVDUPST

-- the definition of Bool


data Bool = False | True
-- [1] [2] [3] [4]

 5ZQF DPOTUSVDUPS GPS EBUBUZQF Bool 5IJT JT UIF OBNF PG


UIF UZQF BOE TIPXT VQ JO UZQF TJHOBUVSFT

 %BUB DPOTUSVDUPS GPS UIF WBMVF False

 1JQF | JOEJDBUFT B TVN UZQF PS MPHJDBM EJTKVODUJPO ƌPSƍ 4P


B Bool WBMVF JT True PS False

 %BUB DPOTUSVDUPS GPS UIF WBMVF True

5IF XIPMF UIJOH JT DBMMFE B EBUB EFDMBSBUJPO %BUB EFDMBSB


UJPOT EP OPU BMXBZT GPMMPX QSFDJTFMZ UIF TBNF QBUUFSO ƈ UIFSF
BSF EBUBUZQFT UIBU VTF MPHJDBM DPOKVODUJPO ƌBOEƍ
JOTUFBE PG
EJTKVODUJPO BOE TPNF UZQF DPOTUSVDUPST BOE EBUB DPOTUSVDUPST
NBZ IBWF BSHVNFOUT 5IF UIJOH UIFZ IBWF JO DPNNPO JT UIF
LFZXPSE data GPMMPXFE CZ UIF UZQF DPOTUSVDUPS PS OBNF PG
UIF UZQF UIBU XJMM BQQFBS JO UZQF TJHOBUVSFT
UIF FRVBMT TJHO UP
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

EFOPUF B EFƶOJUJPO BOE UIFO EBUB DPOTUSVDUPST PS OBNFT PG


WBMVFT UIBU JOIBCJU ZPVS UFSNMFWFM DPEF

:PV DBO ƶOE UIF EBUBUZQF EFƶOJUJPO GPS CVJMUJO EBUBUZQFT
CZ VTJOH :info JO ()$J

Prelude> :info Bool


data Bool = False | True

-FUƊT MPPL BU XIFSF EJƵFSFOU QBSUT PG EBUBUZQFT TIPX VQ


JO PVS DPEF *G XF RVFSZ UIF UZQF JOGPSNBUJPO GPS B GVODUJPO
DBMMFE not XF TFF UIBU JU UBLFT POF Bool WBMVF BOE SFUVSOT BOPUIFS
Bool WBMVF TP UIF UZQF TJHOBUVSF NBLFT SFGFSFODF UP UIF UZQF
DPOTUSVDUPS PS EBUBUZQF OBNF

Prelude> :t not
not :: Bool -> Bool

#VU XIFO XF VTF UIF not GVODUJPO XF VTF UIF EBUB DPOTUSVD
UPST PS WBMVFT

Prelude> not True


False

"OE PVS FYQSFTTJPO FWBMVBUFT UP BOPUIFS EBUB DPOTUSVDUPS


PS WBMVF ƈ JO UIJT DBTF UIF PUIFS EBUB DPOTUSVDUPS GPS UIF TBNF
EBUBUZQF
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

&YFSDJTFT .PPE 4XJOH


(JWFO UIF GPMMPXJOH EBUBUZQF BOTXFS UIF GPMMPXJOH RVFTUJPOT

data Mood = Blah | Woot deriving Show

5IF deriving Show QBSU JT OPU TPNFUIJOH XFƊWF FYQMBJOFE


ZFU 'PS OPX BMM XFƊMM TBZ JT UIBU XIFO ZPV NBLF ZPVS PXO
EBUBUZQFT EFSJWJOH Show BMMPXT UIF WBMVFT PG UIBU UZQF UP CF
QSJOUFE UP UIF TDSFFO 8FƊMM UBML BCPVU JU NPSF XIFO XF UBML
BCPVU UZQFDMBTTFT JO EFUBJM

 8IBU JT UIF UZQF DPOTUSVDUPS PS OBNF PG UIJT UZQF

 *G UIF GVODUJPO SFRVJSFT B Mood WBMVF XIBU BSF UIF WBMVFT


ZPV DPVME QPTTJCMZ VTF UIFSF

 8F BSF USZJOH UP XSJUF B GVODUJPO changeMood UP DIBOHF


$ISJTƊT NPPE JOTUBOUBOFPVTMZ *U TIPVME BDU MJLF not JO
UIBU HJWFO POF WBMVF JU SFUVSOT UIF PUIFS WBMVF PG UIF TBNF
UZQF 4P GBS XFƊWF XSJUUFO B UZQF TJHOBUVSF changeMood ::
Mood -> Woot 8IBUƊT XSPOH XJUI UIBU

 /PX XF XBOU UP XSJUF UIF GVODUJPO UIBU DIBOHFT IJT NPPE


(JWFO BO JOQVU NPPE JU HJWFT VT UIF PUIFS POF 'JY BOZ
NJTUBLFT BOE DPNQMFUF UIF GVODUJPO

changeMood Mood = Woot


changeMood _ = Blah
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

8FƊSF EPJOH TPNFUIJOH IFSF DBMMFE QBUUFSO NBUDIJOH 8F


DBO EFƶOF B GVODUJPO CZ NBUDIJOH PO B EBUB DPOTUSVDUPS
PS WBMVF BOE EFTDSCJOH UIF CFIBWJPS UIF GVODUJPO TIPVME
IBWF CBTFE PO XIJDI WBMVF JU NBUDIFT 5IF VOEFSTDPSF
JO UIF TFDPOE MJOF EFOPUFT B DBUDIBMM PUIFSXJTF DBTF 4P
JO UIF ƶSTU MJOF PG UIF GVODUJPO XFƊSF UFMMJOH JU XIBU UP EP
JO UIF DBTF PG B TQFDJƶD JOQVU *O UIF TFDPOE POF XFƊSF
UFMMJOH JU XIBU UP EP SFHBSEMFTT PG BMM QPUFOUJBM JOQVUT *UƊT
USJWJBM XIFO UIFSF BSF POMZ UXP QPUFOUJBM WBMVFT PG B HJWFO
UZQF CVU BT XF EFBM XJUI NPSF DPNQMFY DBTFT JU DBO CF
DPOWFOJFOU 8FƊMM UBML BCPVU QBUUFSO NBUDIJOH JO HSFBUFS
EFUBJM JO B MBUFS DIBQUFS

 &OUFS BMM PG UIF BCPWF ƈ EBUBUZQF JODMVEJOH UIF deriving


Show CJU
ZPVS DPSSFDUFE UZQF TJHOBUVSF BOE UIF DPSSFDUFE
GVODUJPO JOUP B TPVSDF ƶMF -PBE JU BOE SVO JU JO ()$J UP
NBLF TVSF ZPV HPU JU SJHIU

 /VNFSJD UZQFT


-FUƊT OFYU MPPL BU OVNFSJD UZQFT CFDBVTF XFƊWF BMSFBEZ TFFO
UIFTF UZQFT JO QSFWJPVT DIBQUFST BOE OVNCFST BSF GBNJMJBS
UFSSJUPSZ *UƊT JNQPSUBOU UP VOEFSTUBOE UIBU )BTLFMM EPFT OPU
KVTU VTF POF UZQF PG OVNCFS 'PS NPTU QVSQPTFT UIF UZQFT PG
OVNCFST XF OFFE UP CF DPODFSOFE XJUI BSF
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

*OUFHSBM OVNCFST 5IFTF BSF XIPMF OVNCFST QPTJUJWF BOE


OFHBUJWF

 Int 5IJT UZQF JT B ƶYFEQSFDJTJPO JOUFHFS #Z ƌƶYFE QSF


DJTJPO ƍ XF NFBO JU IBT B SBOHF XJUI B NBYJNVN BOE B
NJOJNVN BOE TP JU DBOOPU CF BSCJUSBSJMZ MBSHF PS TNBMM
ƈ NPSF BCPVU UIJT JO B NPNFOU

 Integer 5IJT UZQF JT BMTP GPS JOUFHFST CVU UIJT POF TVQQPSUT
BSCJUSBSJMZ MBSHF PS TNBMM
OVNCFST

'SBDUJPOBM 5IFTF BSF OPU JOUFHFST Fractional WBMVFT JODMVEF


UIF GPMMPXJOH GPVS UZQFT

 Float 5IJT JT UIF UZQF VTFE GPS TJOHMFQSFDJTJPO ƷPBU


JOH QPJOU OVNCFST 'JYFEQPJOU OVNCFS SFQSFTFOUBUJPOT
IBWF JNNVUBCMF OVNCFST PG EJHJUT BTTJHOFE GPS UIF QBSUT
PG UIF OVNCFS CFGPSF BOE BǒFS UIF EFDJNBM QPJOU *O
DPOUSBTU ƷPBUJOH QPJOU DBO TIJǒ IPX NBOZ CJUT JU VTFT UP
SFQSFTFOU OVNCFST CFGPSF PS BǒFS UIF EFDJNBM QPJOU 5IJT
ƷFYJCJMJUZ EPFT IPXFWFS NFBO UIBU ƷPBUJOH QPJOU BSJUI
NFUJD WJPMBUFT TPNF DPNNPO BTTVNQUJPOT BOE TIPVME
POMZ CF VTFE XJUI HSFBU DBSF (FOFSBMMZ ƷPBUJOH QPJOU
OVNCFST TIPVME OPU CF VTFE BU BMM JO CVTJOFTT BQQMJDBUJPOT

 Double 5IJT JT B EPVCMFQSFDJTJPO ƷPBUJOH QPJOU OVNCFS


UZQF *U IBT UXJDF BT NBOZ CJUT XJUI XIJDI UP EFTDSJCF
OVNCFST BT UIF Float UZQF
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

 Rational 5IJT JT B GSBDUJPOBM OVNCFS UIBU SFQSFTFOUT B


SBUJP PG UXP JOUFHFST 5IF WBMVF 1 / 2 :: Rational XJMM CF B
WBMVF DBSSZJOH UXP Integer WBMVFT UIF OVNFSBUPS  BOE UIF
EFOPNJOBUPS  BOE SFQSFTFOUT B SBUJP PG  UP  Rational JT
BSCJUSBSJMZ QSFDJTF CVU OPU BT FƸDJFOU BT Scientific

 Scientific 5IJT JT B TQBDF FƸDJFOU BOE BMNPTUBSCJUSBSZ


QSFDJTJPO TDJFOUJƶD OVNCFS UZQF Scientific OVNCFST BSF
SFQSFTFOUFE VTJOH TDJFOUJƶD OPUBUJPO *U TUPSFT UIF DPFG
ƶDJFOU BT BO Integer BOE UIF FYQPOFOU BT BO Int 4JODF
Int JTOƊU BSCJUSBSJMZMBSHF UIFSF JT UFDIOJDBMMZ B MJNJU UP
UIF TJ[F PG OVNCFS ZPV DBO FYQSFTT XJUI Scientific CVU
IJUUJOH UIBU MJNJU JT RVJUF VOMJLFMZ Scientific JT BWBJMBCMF
JO B MJCSBSZ

5IFTF OVNFSJD EBUBUZQFT BMM IBWF JOTUBODFT PG B UZQFDMBTT


DBMMFE Num 8F XJMM UBML BCPVU UZQFDMBTTFT JO UIF VQDPNJOH
DIBQUFST CVU BT XF MPPL BU UIF UZQFT JO UIJT TFDUJPO ZPV XJMM
TFF Num MJTUFE JO TPNF PG UIF UZQF JOGPSNBUJPO
5ZQFDMBTTFT BSF B XBZ PG BEEJOH GVODUJPOBMJUZ UP UZQFT UIBU
JT SFVTBCMF BDSPTT BMM UIF UZQFT UIBU IBWF JOTUBODFT PG UIBU UZQF
DMBTT Num JT B UZQFDMBTT GPS XIJDI NPTU OVNFSJD UZQFT XJMM
IBWF BO JOTUBODF CFDBVTF UIFSF BSF TUBOEBSE GVODUJPOT UIBU BSF
DPOWFOJFOU UP IBWF BWBJMBCMF GPS BMM UZQFT PG OVNCFST 5IF Num
UZQFDMBTT JT XIBU QSPWJEFT ZPVS TUBOEBSE (+) (-) BOE (*) PQFS

)BDLBHF QBHF GPS TDJFOUJƶD https://hackage.haskell.org/package/scientific BOE DBO CF
JOTUBMMFE VTJOH cabal install PS stack install
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

BUPST BMPOH XJUI B GFX PUIFST "OZ UZQF UIBU IBT BO JOTUBODF PG
Num DBO CF VTFE XJUI UIPTF GVODUJPOT "O JOTUBODF EFƶOFT IPX
UIF GVODUJPOT XPSL GPS UIBU TQFDJƶD UZQF 8F XJMM UBML BCPVU
UZQFDMBTTFT JO NVDI NPSF EFUBJM TPPO

*OUFHSBM OVNCFST
"T XF OPUFE BCPWF UIFSF BSF UXP NBJO UZQFT PG JOUFHSBM OVN
CFST Int BOE Integer
*OUFHSBM OVNCFST BSF XIPMF OVNCFST XJUI OP GSBDUJPOBM
DPNQPOFOU 5IF GPMMPXJOH BSF JOUFHSBM OVNCFST

1 2 199 32442353464675685678

5IF GPMMPXJOH BSF OPU JOUFHSBM OVNCFST

1.3 1/2

*OUFHFS
5IF OVNCFST PG UZQF Integer BSF TUSBJHIUGPSXBSE FOPVHI GPS
UIF NPTU QBSU UIFZ BSF UIF TPSUT PG OVNCFST XFƊSF BMM VTFE UP
XPSLJOH XJUI JO BSJUINFUJD FRVBUJPOT UIBU JOWPMWF XIPMF OVN
CFST 5IFZ DBO CF QPTJUJWF PS OFHBUJWF BOE Integer FYUFOET BT
GBS JO FJUIFS EJSFDUJPO BT POF OFFET UIFN UP HP
5IF Bool EBUBUZQF POMZ IBT UXP QPTTJCMF WBMVFT TP XF DBO MJTU
UIFN FYQMJDJUMZ BT EBUB DPOTUSVDUPST *O UIF DBTF PG Integer BOE
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

NPTU OVNFSJD EBUBUZQFT UIFTF EBUB DPOTUSVDUPST BSF OPU XSJU


UFO PVU CFDBVTF UIFZ JODMVEF BO JOƶOJUF TFSJFT PG XIPMF OVN
CFST 8FƊE OFFE JOƶOJUF EBUB DPOTUSVDUPST TUSFUDIJOH VQ BOE
EPXO GSPN [FSP )ZQPUIFUJDBMMZ XF DPVME SFQSFTFOU Integer BT
B TVN PG UISFF DBTFT SFDVSTJWF DPOTUSVDUPST IFBEFE UPXBSET
OFHBUJWF JOƶOJUZ [FSP BOE SFDVSTJWF DPOTUSVDUPST IFBEFE UP
XBSET QPTJUJWF JOƶOJUZ 5IJT SFQSFTFOUBUJPO XPVME CF UFSSJCMZ
JOFƸDJFOU TP UIFSFƊT TPNF ()$ NBHJD TQSJOLMFE PO JU

8IZ EP XF IBWF *OU


5IF Int OVNFSJD UZQF JT BO BSUJGBDU PG XIBU DPNQVUFS IBSE
XBSF IBT TVQQPSUFE OBUJWFMZ PWFS UIF ZFBST .PTU QSPHSBNT
TIPVME VTF Integer BOE OPU Int VOMFTT UIF MJNJUBUJPOT PG UIF
UZQF BSF VOEFSTUPPE BOE UIF BEEJUJPOBM QFSGPSNBODF NBLFT B
EJƵFSFODF
5IF EBOHFS PG Int BOE UIF SFMBUFE UZQFT Int8 Int16 FU BM JT
UIBU UIFZ DBOOPU FYQSFTT BSCJUSBSJMZ MBSHF RVBOUJUJFT PG JOGPS
NBUJPO 4JODF UIFZ BSF JOUFHSBM UIJT NFBOT UIFZ DBOOPU CF
BSCJUSBSJMZ MBSHF JO UIF QPTJUJWF PS OFHBUJWF TFOTF
)FSFƊT XIBU IBQQFOT JG XF USZ UP SFQSFTFOU B OVNCFS UPP
MBSHF GPS Int8

Prelude> import GHC.Int


Prelude> 127 :: Int8
127
Prelude> 128 :: Int8
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

<interactive>:11:1: Warning:
Literal 128 is out of the Int8 range -128..127
If you are trying to write a large negative literal,
use NegativeLiterals
-128
Prelude> (127 + 1) :: Int8
-128

5IF TZOUBY ZPV TFF UIFSF :: Int8 JT VT BTTJHOJOH UIF Int8


UZQF UP UIFTF OVNCFST "T XF XJMM FYQMBJO JO NPSF EFUBJM JO
UIF OFYU DIBQUFS OVNCFST BSF QPMZNPSQIJD VOEFSOFBUI BOE
UIF DPNQJMFS EPFTOƊU BTTJHO UIFN B DPODSFUF UZQF VOUJM JU JT
GPSDFE UP *U XPVME CF XFJSE BOE VOFYQFDUFE JG UIF DPNQJMFS
EFGBVMUFE BMM OVNCFST UP Int8 TP JO PSEFS UP SFQSPEVDF UIF
TJUVBUJPO PG IBWJOH B OVNCFS UPP MBSHF GPS BO Int UZQF XF IBE
UP BTTJHO UIBU DPODSFUF UZQF UP JU
5IF ƶSTU DPNQVUBUJPO JT ƶOF CFDBVTF JU JT XJUIJO UIF SBOHF
PG WBMJE WBMVFT PG UZQF Int8 CVU UIF 127 + 1 PWFSƷPXT BOE SF
TFUT CBDL UP JUT TNBMMFTU OVNFSJD WBMVF #FDBVTF UIF NFNPSZ
UIF WBMVF JT BMMPXFE UP PDDVQZ JT ƶYFE GPS Int8 JU DBOOPU HSPX
UP BDDPNNPEBUF UIF WBMVF  UIF XBZ Integer DBO )FSF UIF
 SFQSFTFOUT IPX NBOZ CJUT UIF UZQF VTFT UP SFQSFTFOU JOUF
HSBM OVNCFST #FJOH PG B ƶYFE TJ[F DBO CF VTFGVM JO TPNF
BQQMJDBUJPOT CVU NPTU PG UIF UJNF Integer JT QSFGFSSFE

5IF SFQSFTFOUBUJPO VTFE GPS UIF ƶYFETJ[F Int UZQFT JT UXPƊT DPNQMFNFOU
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

:PV DBO ƶOE PVU UIF NJOJNVN BOE NBYJNVN CPVOET PG


OVNFSJD UZQFT VTJOH maxBound BOE minBound GSPN UIF Bounded
UZQFDMBTT )FSFƊT BO FYBNQMF VTJOH PVS Int8 BOE Int16 FYBNQMF

Prelude> import GHC.Int


Prelude> :t minBound
minBound :: Bounded a => a
Prelude> :t maxBound
maxBound :: Bounded a => a

Prelude> minBound :: Int8


-128
Prelude> minBound :: Int16
-32768
Prelude> minBound :: Int32
-2147483648
Prelude> minBound :: Int64
-9223372036854775808

Prelude> maxBound :: Int8


127
Prelude> maxBound :: Int16
32767
Prelude> maxBound :: Int32
2147483647
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

Prelude> maxBound :: Int64


9223372036854775807

5IVT ZPV DBO ƶOE UIF MJNJUBUJPOT PG QPTTJCMF WBMVFT GPS


BOZ UZQF UIBU IBT BO JOTUBODF PG UIBU QBSUJDVMBS UZQFDMBTT *O
UIJT DBTF XF BSF BCMF UP ƶOE PVU UIF SBOHF PG WBMVFT XF DBO
SFQSFTFOU XJUI BO Int8 JT  UP 
:PV DBO ƶOE PVU JG B UZQF IBT BO JOTUBODF PG Bounded PS BOZ
PUIFS UZQFDMBTT CZ BTLJOH ()$J GPS UIF :info GPS UIBU UZQF
%PJOH UIJT XJMM BMTP HJWF ZPV UIF EBUBUZQF SFQSFTFOUBUJPO GPS
UIF UZQF ZPV RVFSJFE

Prelude> :i Int
data Int = GHC.Types.I# GHC.Prim.Int#
instance Bounded Int -- Defined in ‘GHC.Enum’

Int PG DPVSTF IBT NBOZ NPSF UZQFDMBTT JOTUBODFT CVU Bounded


JT UIF POF XF DBSFE BCPVU BU UIJT UJNF

'SBDUJPOBM OVNCFST
5IF GPVS DPNNPO Fractional UZQFT JO VTF JO )BTLFMM BSF Float
Double Rational BOE Scientific Rational Double BOE Float DPNF
XJUI ZPVS JOTUBMM PG ()$ Scientific DPNFT GSPN B MJCSBSZ BT
XF NFOUJPOFE QSFWJPVTMZ Rational BOE Scientific BSF BSCJUSBSZ
QSFDJTJPO XJUI UIF MBUUFS CFJOH NVDI NPSF FƸDJFOU "SCJUSBSZ
QSFDJTJPO NFBOT UIBU UIFTF DBO CF VTFE UP EP DBMDVMBUJPOT SF
RVJSJOH B IJHI EFHSFF PG QSFDJTJPO SBUIFS UIBO CFJOH MJNJUFE
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

UP B TQFDJƶD EFHSFF PG QSFDJTJPO UIF XBZ Float BOE Double BSF


:PV BMNPTU OFWFS XBOU B Float VOMFTT ZPVƊSF EPJOH HSBQIJDT
QSPHSBNNJOH TVDI BT XJUI 0QFO(-
4PNF DPNQVUBUJPOT JOWPMWJOH OVNCFST XJMM CF GSBDUJPOBM
SBUIFS UIBO JOUFHSBM " HPPE FYBNQMF PG UIJT JT UIF EJWJTJPO
GVODUJPO (/) XIJDI IBT UIF UZQF

Prelude> :t (/)
(/) :: Fractional a => a -> a -> a

5IF OPUBUJPO Fractional a => EFOPUFT B UZQFDMBTT DPOTUSBJOU


:PV DBO SFBE JU BT ƌUIF UZQF WBSJBCMF Ԑ NVTU JNQMFNFOU UIF
Fractional UZQFDMBTTƍ 5IJT UFMMT VT UIBU XIBUFWFS UZQF PG OVN
CFS Ԑ UVSOT PVU UP CF JU NVTU CF B UZQF UIBU IBT BO JOTUBODF PG
UIF Fractional UZQFDMBTT UIBU JT UIFSF NVTU CF B EFDMBSBUJPO
PG IPX UIF PQFSBUJPOT GSPN UIBU UZQFDMBTT XJMM XPSL GPS UIF
UZQF 5IF / GVODUJPO XJMM UBLF POF OVNCFS UIBU JNQMFNFOUT
Fractional EJWJEF JU CZ BOPUIFS PG UIF TBNF UZQF BOE SFUVSO B
WBMVF PG UIF TBNF UZQF BT UIF SFTVMU
Fractional JT B UZQFDMBTT UIBU SFRVJSFT UZQFT UP BMSFBEZ IBWF
BO JOTUBODF PG UIF Num UZQFDMBTT 8F EFTDSJCF UIJT SFMBUJPO
TIJQ CFUXFFO UZQFDMBTTFT CZ TBZJOH UIBU Num JT B TVQFSDMBTT PG
Fractional 4P (+) BOE PUIFS GVODUJPOT GSPN UIF Num UZQFDMBTT
DBO CF VTFE XJUI Fractional OVNCFST CVU GVODUJPOT GSPN UIF
Fractional UZQFDMBTT DBOOPU CF VTFE XJUI BMM UZQFT UIBU IBWF B
Num JOTUBODF
)FSFƊT XIBU IBQQFOT XIFO XF VTF (/) JO UIF 3&1-
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

Prelude> 1 / 2
0.5
Prelude> 4 / 2
2.0

/PUF UIBU FWFO XIFO XF IBE B XIPMF OVNCFS BT B SFTVMU


UIF OVNCFS XBT QSJOUFE BT 2.0 EFTQJUF IBWJOH OP GSBDUJPOBM
DPNQPOFOU 5IJT JT CFDBVTF WBMVFT PG Fractional a => a EFGBVMU
UP UIF ƷPBUJOH QPJOU UZQF Double *O NPTU DBTFT ZPV XPOƊU XBOU
UP FYQMJDJUMZ VTF Double :PVƊSF VTVBMMZ CFUUFS PƵ VTJOH UIF
BSCJUSBSZ QSFDJTJPO TJCMJOH UP Integer Scientific .PTU QFPQMF
EP OPU ƶOE JU FBTZ UP SFBTPO BCPVU ƷPBUJOH QPJOU BSJUINFUJD
BOE ƶOE JU EJƸDVMU UP DPEF BSPVOE UIF RVJSLT UIPTF RVJSLT
FYJTU CZ EFTJHO CVU UIBUƊT BOPUIFS TUPSZ
TP JO PSEFS UP BWPJE
NBLJOH NJTUBLFT VTF BSCJUSBSZQSFDJTJPO UZQFT BT B NBUUFS PG
DPVSTF

 $PNQBSJOH WBMVFT


6Q UP UIJT QPJOU NPTU PG PVS PQFSBUJPOT XJUI OVNCFST IBWF
JOWPMWFE EPJOH TJNQMF BSJUINFUJD 8F DBO BMTP DPNQBSF OVN
CFST UP EFUFSNJOF XIFUIFS UIFZ BSF FRVBM HSFBUFS UIBO PS MFTT
UIBO

Prelude> let x = 5
Prelude> x == 5
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

True
Prelude> x == 6
False
Prelude> x < 7
True
Prelude> x > 3
True
Prelude> x /= 5
False

/PUJDF IFSF UIBU XF ƶSTU EFDMBSFE B WBMVF GPS ԧ VTJOH UIF


TUBOEBSE FRVBMT TJHO /PX XF LOPX UIBU GPS UIF SFNBJOEFS PG
PVS 3&1- TFTTJPO BMM JOTUBODFT PG ԧ XJMM CF UIF WBMVF  #FDBVTF
UIF FRVBMT TJHO JO )BTLFMM JT BMSFBEZ VTFE UP EFƶOF WBSJBCMFT
BOE GVODUJPOT XF NVTU VTF B EPVCMF FRVBMT TJHO == UP IBWF
UIF TQFDJƶD NFBOJOH ƌJT FRVBM UPƍ 5IF /= TZNCPM NFBOT ƌJT
OPU FRVBM UPƍ 5IF PUIFS TZNCPMT TIPVME BMSFBEZ CF GBNJMJBS UP
ZPV
)BWJOH EPOF UIJT XF TFF UIBU ()$J JT SFUVSOJOH B SFTVMU PG
FJUIFS True PS False EFQFOEJOH PO XIFUIFS UIF FYQSFTTJPO JT
USVF PS GBMTF True BOE False BSF UIF EBUB DPOTUSVDUPST GPS UIF
Bool EBUBUZQF XF TBX BCPWF *G ZPV MPPL BU UIF UZQF JOGPSNBUJPO
GPS BOZ PG UIFTF JOƶY PQFSBUPST ZPVƊMM ƶOE UIF SFTVMU UZQF MJTUFE
BT Bool

Prelude> :t (==)
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

(==) :: Eq a => a -> a -> Bool


Prelude> :t (<)
(<) :: Ord a => a -> a -> Bool

/PUJDF UIBU XF HFU TPNF UZQFDMBTT DPOTUSBJOUT BHBJO Eq JT B


UZQFDMBTT UIBU JODMVEFT FWFSZUIJOH UIBU DBO CF DPNQBSFE BOE
EFUFSNJOFE UP CF FRVBM JO WBMVF Ord JT B UZQFDMBTT UIBU JODMVEFT
BMM UIJOHT UIBU DBO CF PSEFSFE /PUF UIBU OFJUIFS PG UIFTF JT
MJNJUFE UP OVNCFST /VNCFST DBO CF DPNQBSFE BOE PSEFSFE
PG DPVSTF CVU TP DBO MFUUFST TP UIJT UZQFDMBTT DPOTUSBJOU BMMPXT
GPS ƷFYJCJMJUZ 5IFTF FRVBMJUZ BOE DPNQBSJTPO GVODUJPOT DBO
UBLF BOZ WBMVFT UIBU DBO CF TBJE UP IBWF FRVBM WBMVF PS DBO CF
PSEFSFE 5IF SFTU PG UIF UZQF JOGPSNBUJPO UFMMT VT UIBU JU UBLFT
POF PG UIFTF WBMVFT DPNQBSFT JU UP BOPUIFS WBMVF PG UIF TBNF
UZQF BOE SFUVSOT B Bool WBMVF "T XFƊWF BMSFBEZ TFFO UIF Bool
WBMVFT BSF True PS False
8JUI UIJT JOGPSNBUJPO MFUƊT USZ QMBZJOH XJUI TPNF PUIFS
WBMVFT

Prelude> 'a' == 'a'


True
Prelude> 'a' == 'b'
False
Prelude> 'a' < 'b'
True
Prelude> 'a' > 'b'
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

False
Prelude> 'a' == 'A'
False
Prelude> "Julie" == "Chris"
False

5IFTF FYBNQMFT BSF FBTZ FOPVHI UP VOEFSTUBOE 8F LOPX


UIBU BMQIBCFUJDBM DIBSBDUFST DBO CF PSEFSFE BMUIPVHI XF EP
OPU OPSNBMMZ UIJOL PG ƉBƊ BT CFJOH ƌMFTT UIBOƍ ƉCƊ #VU XF DBO
VOEFSTUBOE UIBU IFSF JU NFBOT ƊBƊ DPNFT CFGPSF ƊCƊ JO BMQIBCFUJDBM
PSEFS 'VSUIFS XF TFF UIJT BMTP XPSLT XJUI TUSJOHT TVDI BT
ƌ+VMJFƍ PS ƌ$ISJTƍ ()$J IBT GBJUIGVMMZ EFUFSNJOFE UIBU UIPTF
UXP TUSJOHT BSF OPU FRVBM JO WBMVF
/PX VTF ZPVS 3&1- UP EFUFSNJOF XIFUIFS ƉBƊ PS Ɖ"Ɗ JT HSFBUFS
/FYU UBLF B MPPL BU UIJT TBNQMF BOE TFF JG ZPV DBO ƶHVSF PVU
XIZ ()$J SFUVSOT UIF HJWFO SFTVMUT

Prelude> "Julie" > "Chris"


True
Prelude> "Chris" > "Julie"
False

(PPE UP TFF )BTLFMM DPEF UIBU SFƷFDUT SFBMJUZ ƌ+VMJFƍ JT


HSFBUFS UIBO ƌ$ISJTƍ CFDBVTF + > $ JG UIF XPSET IBE CFFO ƌ#BDLƍ
BOE ƌ#SBDLƍ UIFO JU XPVMEƊWF TLJQQFE UIF ƶSTU MFUUFS UP EFUFS
NJOF XIJDI XBT HSFBUFS CFDBVTF #  # UIFO ƍ#SBDLƍ XPVMEƊWF
CFFO HSFBUFS CFDBVTF ƉSƊ > ƉBƊ JO UIF MFYJDPHSBQIJD PSEFSJOH
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

)BTLFMM VTFT GPS DIBSBDUFST /PUF UIBU UIJT JT MFBOJOH PO UIF


Ord UZQFDMBTT JOTUBODFT GPS MJTU BOE Char :PV DBO POMZ DPNQBSF
MJTUT PG JUFNT XIFSF UIF JUFNT UIFNTFMWFT BMTP IBWF BO JOTUBODF
PG Ord "DDPSEJOHMZ UIF GPMMPXJOH XJMM XPSL CFDBVTF Char BOE
Integer IBWF JOTUBODFT PG Ord

Prelude> ['a', 'b'] > ['b', 'a']


False
Prelude> 1 > 2
False
Prelude> [1, 2] > [2, 1]
False

" EBUBUZQF UIBU IBT OP JOTUBODF PG Ord XJMM OPU XPSL XJUI
UIFTF GVODUJPOT

Prelude> data Mood = Blah | Woot deriving Show


Prelude> [Blah, Woot]
[Blah,Woot]
Prelude> [Blah, Woot] > [Woot, Blah]

<interactive>:28:14:
No instance for (Ord Mood) arising
from a use of ‘>’
In the expression: [Blah, Woot] > [Woot, Blah]
In an equation for ‘it’:
it = [Blah, Woot] > [Woot, Blah]
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

ƌ/P JOTUBODF GPS (Ord Mood)ƍ NFBOT JU EPFTOƊU IBWF BO Ord


JOTUBODF UP LOPX IPX UP PSEFS UIFTF WBMVFT
)FSF JT BOPUIFS UIJOH UIBU EPFTOƊU XPSL XJUI UIFTF GVODUJPOT

Prelude> "Julie" == 8

<interactive>:38:12:
No instance for (Num [Char]) arising from
the literal ‘8’

In the second argument of ‘(==)’, namely ‘8’


In the expression: "Julie" == 8
In an equation for ‘it’: it = "Julie" == 8

8F TBJE BCPWF UIBU DPNQBSJTPO GVODUJPOT BSF QPMZNPSQIJD


BOE DBO XPSL XJUI B MPU PG EJƵFSFOU UZQFT #VU XF BMTP OPUFE
UIBU UIF UZQF JOGPSNBUJPO POMZ BENJUUFE WBMVFT PG NBUDIJOH
UZQFT 0ODF ZPVƊWF HJWFO B UFSNMFWFM WBMVF UIBU JT B TUSJOH
TVDI BT ƌ+VMJF ƍ UIF UZQF JT EFUFSNJOFE BOE UIF PUIFS BSHVNFOU
NVTU IBWF UIF TBNF UZQF 5IF FSSPS NFTTBHF XF TFF BCPWF JT
UFMMJOH VT UIBU UIF UZQF PG UIF MJUFSBM WBMVF ƉƊ EPFTOƊU NBUDI UIF
UZQF PG UIF ƶSTU WBMVF BOE GPS UIJT GVODUJPO JU NVTU

 (P PO BOE #PPM NF


*O )BTLFMM UIF Bool EBUBUZQF DPNFT TUBOEBSE JO UIF 1SFMVEF "T
XF TBX FBSMJFS Bool JT B TVN UZQF XJUI UXP DPOTUSVDUPST
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

data Bool = False | True

5IJT EFDMBSBUJPO DSFBUFT B EBUBUZQF XJUI UIF UZQF DPOTUSVD


UPS Bool BOE XF SFGFS UP TQFDJƶD UZQFT CZ UIFJS UZQF DPOTUSVD
UPST 8F VTF UZQF DPOTUSVDUPST JO UZQF TJHOBUVSFT OPU JO UIF
FYQSFTTJPOT UIBU NBLF VQ PVS UFSNMFWFM DPEF 5IF UZQF DPO
TUSVDUPS Bool UBLFT OP BSHVNFOUT TPNF UZQF DPOTUSVDUPST EP
UBLF BSHVNFOUT
 5IF EFƶOJUJPO PG Bool BCPWF BMTP DSFBUFT UXP
EBUB DPOTUSVDUPST True BOE False #PUI PG UIFTF WBMVFT BSF PG
UZQF Bool "OZ GVODUJPO UIBU BDDFQUT WBMVFT PG UZQF #PPM NVTU
BMMPX GPS UIF QPTTJCJMJUZ PG True PS False ZPV DBOOPU TQFDJGZ
JO UIF UZQF UIBU JU TIPVME POMZ BDDFQU POF TQFDJƶD WBMVF "O
&OHMJTI MBOHVBHF GPSNVMBUJPO PG UIJT EBUBUZQF XPVME CF TPNF
UIJOH MJLF ƌ5IF EBUBUZQF Bool JT SFQSFTFOUFE CZ UIF WBMVFT
5SVF PS 'BMTFƍ
3FNFNCFS ZPV DBO ƶOE UIF UZQF PG BOZ WBMVF CZ BTLJOH
GPS JU JO ()$J KVTU BT ZPV DBO XJUI GVODUJPOT

Prelude> :t True
True :: Bool
Prelude> :t "Julie"
"Julie" :: [Char]

/PX MFUƊT IBWF TPNF GVO XJUI Bool 8FƊMM TUBSU CZ SFWJFXJOH
UIF not GVODUJPO

Prelude> :t not
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

not :: Bool -> Bool


Prelude> not True
False

/PUF UIBU XF DBQJUBMJ[F True BOE False CFDBVTF UIFZ BSF PVS
EBUB DPOTUSVDUPST 8IBU IBQQFOT JG ZPV USZ UP VTF not XJUIPVU
DBQJUBMJ[JOH UIFN
-FUƊT USZ TPNFUIJOH TMJHIUMZ NPSF DPNQMFY

Prelude> let x = 5
Prelude> not (x == 5)
False
Prelude> not (x > 7)
True

8F LOPX UIBU DPNQBSJTPO GVODUJPOT FWBMVBUF UP B Bool WBMVF


TP XF DBO VTF UIFN XJUI not
-FUƊT QMBZ XJUI JOƶY PQFSBUPST UIBU EFBM EJSFDUMZ XJUI CPPMFBO
MPHJD )PX EP XF VTF Bool BOE UIFTF BTTPDJBUFE GVODUJPOT

-- && is conjunction, so
-- this means "true and true."
Prelude> True && True
True
-- || is disjunction, so
-- this means "false or true."
Prelude> False || True
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

True
Prelude> True && False
False
Prelude> not True
False
Prelude> not (True && True)
False

8F DBO MPPL VQ JOGP BCPVU EBUBUZQFT UIBU BSF JO TDPQF JG


UIFZƊSF OPU JO TDPQF XF IBWF UP JNQPSU UIF NPEVMF UIFZ MJWF
JO UP CSJOH UIFN JOUP TDPQF
VTJOH UIF :info DPNNBOE ()$J
QSPWJEFT 4DPQF JT B XBZ UP SFGFS UP XIFSF B OBNFE CJOEJOH UP
BO FYQSFTTJPO JT WBMJE 8IFO XF TBZ TPNFUIJOH JT ƌJO TDPQFƍ JU
NFBOT ZPV DBO VTF UIBU FYQSFTTJPO CZ JUT CPVOE OBNF FJUIFS
CFDBVTF JU XBT EFƶOFE JO UIF TBNF GVODUJPO PS NPEVMF PS
CFDBVTF ZPV JNQPSUFE JU 4P JUƊT WJTJCMF UP UIF QSPHSBN XFƊSF
USZJOH UP SVO SJHIU OPX 8IBU JT CVJMU JOUP )BTLFMMƊT Prelude
NPEVMF JT TJHOJƶDBOU CFDBVTF FWFSZUIJOH JO JU JT BVUPNBUJDBMMZ
JNQPSUFE BOE JO TDPQF 8F XJMM EFNPOTUSBUF IPX UP TIVU UIJT
PƵ MBUFS CVU GPS OPX UIJT JT XIBU ZPV XBOU

&YFSDJTFT 'JOE UIF .JTUBLFT


5IF GPMMPXJOH MJOFT PG DPEF NBZ IBWF NJTUBLFT ƈ TPNF PG
UIFN XPOƊU DPNQJMF :PV LOPX XIBU ZPV OFFE UP EP

 not True && true


$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

 not (x = 6)

 (1 * 2) > 5

 [Merry] > [Happy]

 [1, 2, 3] ++ "look at me!"

$POEJUJPOBMT XJUI JGUIFOFMTF


)BTLFMM EPFTOƊU IBWF ƉJGƊ TUBUFNFOUT CVU JU EPFT IBWF JG FY
QSFTTJPOT *UƊT B CVJMUJO CJU PG TZOUBY UIBU XPSLT XJUI UIF Bool
EBUBUZQF

Prelude> if True then "Truthin'" else "Falsin'"


"Truthin'"
Prelude> if False then "Truthin'" else "Falsin'"
"Falsin'"
Prelude> :t if True then "Truthin'" else "Falsin'"
if True then "Truthin'" else "Falsin'" :: [Char]

5IF TUSVDUVSF IFSF JT

if CONDITION
then EXPRESSION\_A
else EXPRESSION\_B

*G UIF DPOEJUJPO XIJDI NVTU FWBMVBUF UP Bool


SFEVDFT UP
UIF #PPM WBMVF True UIFO EXPRESSION_A JT UIF SFTVMU PUIFSXJTF
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

EXPRESSION_B )FSF UIF UZQF XBT String BLB [Char]


CFDBVTF
UIBUƊT UIF UZQF PG UIF WBMVF UIBU JT SFUVSOFE BT B SFTVMU
*GFYQSFTTJPOT DBO CF UIPVHIU PG BT B XBZ UP DIPPTF CFUXFFO
UXP WBMVFT :PV DBO FNCFE B WBSJFUZ PG FYQSFTTJPOT XJUIJO
UIF if PG BO JGUIFOFMTF BT MPOH BT JU FWBMVBUFT UP Bool 5IF
UZQFT PG UIF FYQSFTTJPOT JO UIF then BOE else DMBVTFT NVTU CF
UIF TBNF BT JO UIF GPMMPXJOH

Prelude> let x = 0
Prelude> if (x + 1 == 1) then "AWESOME" else "wut"
"AWESOME"

)FSFƊT IPX JU SFEVDFT


$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

-- Given:
x = 0

if (x + 1 == 1) then "AWESOME" else "wut"


-- x is zero

if (0 + 1 == 1) then "AWESOME" else "wut"


-- reduce 0 + 1 so we can see if it's equal to 1

if (1 == 1) then "AWESOME" else "wut"


-- Does 1 equal 1?

if True then "AWESOME" else "wut"


-- pick the branch based on the Bool value

"AWESOME"
-- dunzo

#VU UIJT EPFT OPU XPSL

Prelude> let x = 0
Prelude> if x * 100 then "adopt a dog" else "or a cat"

<interactive>:15:7:
No instance for (Num Bool) arising
from a use of ‘*’
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

In the expression: (x * 100)


In the expression:
if (x * 100)
then "adopt a dog"
else "or a cat"
In an equation for ‘it’:
it = if (x * 100)
then "adopt a dog"
else "or a cat"

8F HPU UIJT UZQF FSSPS CFDBVTF UIF DPOEJUJPO QBTTFE UP UIF


if FYQSFTTJPO JT PG UZQF Num a => a OPU Bool BOE Bool EPFTOƊU
JNQMFNFOU UIF Num UZQFDMBTT 5P PWFSTJNQMJGZ (x * 100) FWBMV
BUFT UP B OVNFSJD SFTVMU BOE OVNCFST BSFOƊU USVUI WBMVFT *U
XPVME IBWF UZQFDIFDLFE IBE UIF DPOEJUJPO CFFO x * 100 == 0
PS x * 100 == 9001 *O UIPTF DBTFT JU XPVMEƊWF CFFO BO FRVBMJUZ
DIFDL PG UXP OVNCFST XIJDI SFEVDFT UP B #PPM WBMVF
)FSFƊT BO FYBNQMF PG B GVODUJPO UIBU VTFT B Bool WBMVF JO BO
JG FYQSFTTJPO
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

-- greetIfCool1.hs
module GreetIfCool1 where

greetIfCool :: String -> IO ()


greetIfCool coolness =
if cool
then putStrLn "eyyyyy. What's shakin'?"
else
putStrLn "pshhhh."
where cool = coolness == "downright frosty yo"

8IFO ZPV UFTU UIJT JO UIF 3&1- JU TIPVME QMBZ PVU MJLF UIJT

Prelude> :l greetIfCool1.hs
[1 of 1] Compiling GreetIfCool1
Ok, modules loaded: GreetIfCool1.
Prelude> greetIfCool "downright frosty yo"
eyyyyy. What's shakin'?
Prelude> greetIfCool "please love me"
pshhhh.

"MTP OPUF UIBU greetIfCool DPVMEƊWF CFFO XSJUUFO XJUI cool


CFJOH B GVODUJPO SBUIFS UIBO B WBMVF EFƶOFE BHBJOTU UIF BSHV
NFOU EJSFDUMZ MJLF TP
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

-- greetIfCool2.hs
module GreetIfCool2 where

greetIfCool :: String -> IO ()


greetIfCool coolness =
if cool coolness
then putStrLn "eyyyyy. What's shakin'?"
else
putStrLn "pshhhh."
where cool v = v == "downright frosty yo"

 5VQMFT
5IF UVQMF JO )BTLFMM JT B UZQF UIBU BMMPXT ZPV UP TUPSF BOE QBTT
BSPVOE NVMUJQMF WBMVFT XJUIJO B TJOHMF WBMVF 5VQMFT IBWF B
EJTUJODUJWF CVJMUJO TZOUBY UIBU JT VTFE BU CPUI UZQF BOE UFSN
MFWFMT BOE FBDI UVQMF IBT B ƶYFE OVNCFS PG DPOTUJUVFOUT 8F
SFGFS UP UVQMFT CZ IPX NBOZ DPOTUJUVFOUT BSF JO FBDI UVQMF UIF
UXPUVQMF PS QBJS GPS FYBNQMF IBT UXP WBMVFT JOTJEF JU (x, y)
UIF UISFFUVQMF PS USJQMF IBT UISFF (x, y, z) BOE TP PO 5IJT
OVNCFS JT BMTP LOPXO BT UIF UVQMFƊT BSJUZ "T XF XJMM TFF UIF
WBMVFT XJUIJO B UVQMF EP OPU IBWF UP CF PG UIF TBNF UZQF
8F XJMM TUBSU CZ MPPLJOH BU UIF UXPUVQMF B UVQMF XJUI UXP
DPOTUJUVFOUT 5IF UXPUVQMF JT FYQSFTTFE BU CPUI UIF UZQF MFWFM
BOE UFSN MFWFM XJUI UIF DPOTUSVDUPS (,) 5IF EBUBUZQF EFDMBSB
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

UJPO MPPLT MJLF UIJT

Prelude> :info (,)


data (,) a b = (,) a b

5IJT JT EJƵFSFOU GSPN UIF Bool UZQF XF MPPLFE BU FBSMJFS JO B


DPVQMF PG JNQPSUBOU XBZT FWFO BQBSU GSPN UIBU TQFDJBM UZQF
DPOTUSVDUPS TZOUBY 5IF ƶSTU JT UIBU JU IBT UXP QBSBNFUFST
SFQSFTFOUFE CZ UIF UZQF WBSJBCMFT Ԑ BOE ԑ 5IPTF IBWF UP CF
BQQMJFE UP DPODSFUF UZQFT NVDI BT WBSJBCMFT BU UIF UFSN MFWFM
IBWF UP CF BQQMJFE UP WBMVFT UP FWBMVBUF B GVODUJPO 5IF TFDPOE
NBKPS EJƵFSFODF JT UIBU UIJT JT B QSPEVDU UZQF OPU B TVN UZQF
" QSPEVDU UZQF SFQSFTFOUT B MPHJDBM DPOKVODUJPO ZPV NVTU
TVQQMZ CPUI BSHVNFOUT UP QSPEVDF B WBMVF
/PUJDF UIBU UIF UXP UZQF WBSJBCMFT BSF EJƵFSFOU TP UIBU BM
MPXT GPS UVQMFT UIBU DPOUBJO WBMVFT PG UXP EJƵFSFOU UZQFT 5IF
UZQFT BSF OPU IPXFWFS SFRVJSFE UP CF EJƵFSFOU

λ> (,) 8 10
(8,10)
λ> (,) 8 "Julie"
(8,"Julie")
λ> (,) True 'c'
(True,'c')

#VU JG XF USZ UP BQQMZ JU UP POMZ POF BSHVNFOU


$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

λ> (,) 9

<interactive>:34:1:
No instance for (Show (b0 -> (a0, b0)))
(maybe you haven't applied enough arguments to a function?)
arising from a use of ‘print’
In the first argument of ‘print’, namely ‘it’
In a stmt of an interactive GHCi command: print it

8FMM MPPL BU UIBU FSSPS 5IJT JT POF XF XJMM FYQMPSF JO EFUBJM


TPPO CVU GPS OPX UIF JNQPSUBOU QBSU JT UIF QBSU JO QBSFOUIF
TFT XF IBWFOƊU BQQMJFE UIF GVODUJPO ƈ JO UIJT DBTF UIF EBUB
DPOTUSVDUPS ƈ FOPVHI BSHVNFOUT
5IF UXPUVQMF JO )BTLFMM IBT TPNF EFGBVMU DPOWFOJFODF
GVODUJPOT GPS HFUUJOH UIF ƶSTU PS TFDPOE WBMVF 5IFZƊSF OBNFE
fst BOE snd

fst :: (a, b) -> a


snd :: (a, b) -> b

"T ZPV DBO TFF GSPN UIF BCPWF UZQFT UIFSFƊT OPUIJOH UIPTF
GVODUJPOT DPVME EP PUIFS UIBO SFUVSO UIF ƶSTU PS TFDPOE WBMVF
SFTQFDUJWFMZ
)FSF BSF TPNF FYBNQMFT PG NBOJQVMBUJOH UVQMFT TQFDJƶDBMMZ
UIF UXPUVQMF

Prelude> let myTup = (1 :: Integer, "blah")


$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

Prelude> :t myTup
myTup :: (Integer, [Char])
Prelude> fst myTup
1
Prelude> snd myTup
"blah"
Prelude> import Data.Tuple
Prelude> swap myTup
("blah",1)

8F IBE UP JNQPSU Data.Tuple CFDBVTF swap JTOƊU JODMVEFE JO


UIF 1SFMVEF
8F DBO BMTP DPNCJOF UVQMFT XJUI PUIFS FYQSFTTJPOT

Prelude> 2 + fst (1, 2)


3
Prelude> 2 + snd (1, 2)
4

5IF (x, y) TZOUBY PG UIF UVQMF JT TQFDJBM 5IF DPOTUSVDUPST


ZPV VTF JO UIF UZQF TJHOBUVSFT BOE JO ZPVS DPEF UFSNT
BSF
TZOUBDUJDBMMZ JEFOUJDBM FWFO UIPVHI UIFZƊSF EJƵFSFOU UIJOHT
4PNFUJNFT UIBU UZQF DPOTUSVDUPS JT SFGFSSFE UP XJUIPVU UIF
UZQF WBSJBCMFT FYQMJDJUMZ JOTJEF PG JU TVDI BT (,) 0UIFS UJNFT
ZPVƊMM TFF (a, b)  QBSUJDVMBSMZ JO UZQF TJHOBUVSFT
:PV DBO VTF UIBU TZOUBY UP QBUUFSO NBUDI
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

*UƊT HFOFSBMMZ VOXJTF UP VTF UVQMFT PG BO PWFSMZ MBSHF TJ[F


CPUI GPS FƸDJFODZ BOE TBOJUZ SFBTPOT .PTU UVQMFT ZPV TFF XJMM
CF ( , , , , ) UVQMF
PS TNBMMFS

 -JTUT
-JTUT JO )BTLFMM BSF BOPUIFS UZQF VTFE UP DPOUBJO NVMUJQMF
WBMVFT XJUIJO B TJOHMF WBMVF )PXFWFS UIFZ EJƵFS GSPN UVQMFT
JO UISFF JNQPSUBOU XBZT 'JSTU BMM DPOTUJUVFOUT PG B MJTU NVTU
CF PG UIF TBNF UZQF 4FDPOE -JTUT IBWF UIFJS PXO EJTUJODU
[] TZOUBY -JLF UIF UVQMF TZOUBY JU JT VTFE GPS CPUI UIF UZQF
DPOTUSVDUPS JO UZQF TJHOBUVSFT BOE BU UIF UFSN MFWFM UP FYQSFTT
MJTU WBMVFT 5IJSE UIF OVNCFS PG DPOTUJUVFOUT XJUIJO B MJTU DBO
DIBOHF BT ZPV PQFSBUF PO UIF MJTU VOMJLF UVQMFT XIFSF UIF BSJUZ
JT TFU JO UIF UZQF BOE JNNVUBCMF
)FSFƊT BO FYBNQMF GPS ZPVS 3&1-

Prelude> let awesome = ["Papuchon", "curry", ":)"]


Prelude> awesome
["Papuchon","curry",":)"]

Prelude> :t awesome
awesome :: [[Char]]

'JSTU UIJOH UP OPUF JT UIBU awesome JT B MJTU PG MJTUT PG Char WBMVFT


CFDBVTF JU JT B MJTU PG TUSJOHT BOE B TUSJOH JT JUTFMG KVTU B UZQF
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

BMJBT GPS [Char] 5IJT NFBOT BMM UIF GVODUJPOT BOE PQFSBUJPOT
WBMJE GPS MJTUT PG BOZ WBMVF VTVBMMZ FYQSFTTFE BT [a] BSF WBMJE
GPS String CFDBVTF [Char] JT NPSF TQFDJƶD UIBO [a]

Prelude> let alsoAwesome = ["Quake", "The Simons"]


Prelude> :t (++)
(++) :: [a] -> [a] -> [a]
Prelude> awesome ++ alsoAwesome
["Papuchon","curry",":)","Quake","The Simons"]

Prelude> let allAwesome = [awesome, alsoAwesome]


Prelude> allAwesome
[["Papuchon","curry",":)"],["Quake","The Simons"]]
Prelude> :t allAwesome
allAwesome :: [[[Char]]]
Prelude> :t concat
concat :: [[a]] -> [a]
Prelude> concat allAwesome
["Papuchon","curry",":)","Quake","The Simons"]

8FƊMM TBWF B GVMM FYQMPSBUJPO PG UIF MJTU EBUBUZQF VOUJM XF


HFU UP UIF DIBQUFS PO MJTUT 5IF MJTU EBUB TUSVDUVSF HFUT B XIPMF
DIBQUFS CFDBVTF MJTUT IBWF TPNF JOUFSFTUJOH DPNQMFYJUZ XFƊSF
HPJOH UP VTF UIFN UP EFNPOTUSBUF TPNF UIJOHT BCPVU )BTLFMMƊT
OPOTUSJDU FWBMVBUJPO BOE UIFSF BSF NBOZ TUBOEBSE GVODUJPOT
BOE DPOTUSVDUT UIBU DBO CF VTFE XJUI MJTUT
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

 $IBQUFS &YFSDJTFT


"T JO QSFWJPVT DIBQUFST ZPV XJMM HBJO NPSF CZ XPSLJOH PVU
UIF BOTXFS CFGPSF ZPV DIFDL XIBU ()$J UFMMT ZPV CVU CF TVSF
UP VTF ZPVS 3&1- UP DIFDL ZPVS BOTXFST UP UIF GPMMPXJOH FYFS
DJTFT "MTP ZPV XJMM OFFE UP IBWF UIF awesome alsoAwesome BOE
allAwesome DPEF GSPN BCPWF JO TDPQF GPS UIJT 3&1- TFTTJPO 'PS
DPOWFOJFODF PG SFGFSFODF IFSF BSF UIPTF WBMVFT BHBJO

awesome = ["Papuchon", "curry", ":)"]


alsoAwesome = ["Quake", "The Simons"]
allAwesome = [awesome, alsoAwesome]

length JT B GVODUJPO UIBU UBLFT B MJTU BOE SFUVSOT B SFTVMU UIBU


UFMMT IPX NBOZ JUFNT BSF JO UIF MJTU

 (JWFO UIF EFƶOJUJPO PG length BCPWF XIBU XPVME UIF UZQF


TJHOBUVSF CF )PX NBOZ BSHVNFOUT PG XIBU UZQF EPFT JU
UBLF 8IBU JT UIF UZQF PG UIF SFTVMU JU FWBMVBUFT UP

 8IBU BSF UIF SFTVMUT PG UIF GPMMPXJOH FYQSFTTJPOT

B
length [1, 2, 3, 4, 5]
C
length [(1, 2), (2, 3), (3, 4)]
D
length allAwesome
E
length (concat allAwesome)
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

 (JWFO XIBU XF LOPX BCPVU OVNFSJD UZQFT BOE UIF UZQF


TJHOBUVSF PG length MPPL BU UIFTF UXP FYQSFTTJPOT 0OF
XPSLT BOE POF SFUVSOT BO FSSPS %FUFSNJOF XIJDI XJMM
SFUVSO BO FSSPS BOE XIZ
OC ZPV XJMM ƶOE Foldable t => t a SFQSFTFOUJOH [a] BT
XJUI concat JO UIF QSFWJPVT DIBQUFS "HBJO DPOTJEFS Foldable
t UP SFQSFTFOU B MJTU IFSF FWFO UIPVHI MJTU JT POMZ POF PG
UIF QPTTJCMF UZQFT

Prelude> 6 / 3
-- and
Prelude> 6 / length [1, 2, 3]

 )PX DBO ZPV ƶY UIF CSPLFO DPEF GSPN UIF QSFDFEJOH


FYFSDJTF VTJOH B EJƵFSFOU EJWJTJPO GVODUJPOPQFSBUPS

 8IBU JT UIF UZQF PG UIF FYQSFTTJPO 2 + 3 == 5 8IBU XPVME


XF FYQFDU BT B SFTVMU

 8IBU JT UIF UZQF BOE FYQFDUFE SFTVMU WBMVF PG UIF GPMMPX


JOH

Prelude> let x = 5
Prelude> x + 3 == 5

 #FMPX BSF TPNF CJUT PG DPEF 8IJDI XJMM XPSL 8IZ PS


XIZ OPU *G UIFZ XJMM XPSL XIBU WBMVF XPVME UIFTF SFEVDF
UP
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

Prelude> length allAwesome == 2


Prelude> length [1, 'a', 3, 'b']
Prelude> length allAwesome + length awesome
Prelude> (8 == 8) && ('b' < 'a')
Prelude> (8 == 8) && 9

 8SJUF B GVODUJPO UIBU UFMMT ZPV XIFUIFS PS OPU B HJWFO


4USJOH PS MJTU
JT B QBMJOESPNF )FSF ZPVƊMM XBOU UP VTF B
GVODUJPO DBMMFE ƊSFWFSTF Ɗ B QSFEFƶOFE GVODUJPO UIBU EPFT
KVTU XIBU JU TPVOET MJLF

reverse :: [a] -> [a]


reverse "blah"
"halb"

isPalindrome :: (Eq a) => [a] -> Bool


isPalindrome x = undefined

 8SJUF B GVODUJPO UP SFUVSO UIF BCTPMVUF WBMVF PG B OVNCFS


VTJOH JGUIFOFMTF

myAbs :: Integer -> Integer


myAbs = undefined

 'JMM JO UIF EFƶOJUJPO PG UIF GPMMPXJOH GVODUJPO VTJOH fst


BOE snd
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

f :: (a, b) -> (c, d) -> ((b, d), (a, c))


f = undefined

$PSSFDUJOH TZOUBY
*O UIF GPMMPXJOH FYBNQMFT ZPVƊMM CF TIPXO TZOUBDUJDBMMZ JODPS
SFDU DPEF 5ZQF JU JO BOE USZ UP DPSSFDU JU JO ZPVS UFYU FEJUPS
WBMJEBUJOH JU XJUI ()$ PS ()$J

 )FSF XF XBOU B GVODUJPO UIBU BEET  UP UIF MFOHUI PG B


TUSJOH BSHVNFOU BOE SFUVSOT UIBU SFTVMU

x = (+)

F xs = w 'x' 1
where w = length xs

 5IJT JT TVQQPTFE UP CF UIF JEFOUJUZ GVODUJPO id

\ X = x

 8IFO ƶYFE UIJT GVODUJPO XJMM SFUVSO  GSPN UIF WBMVF [1,
2, 3] )JOU ZPV NBZ OFFE UP SFGFS CBDL UP UIF TFDUJPO
BCPVU WBSJBCMFT DPOWFOUJPOT JO ƌ)FMMP )BTLFMMƍ UP SFGSFTI
ZPVS NFNPSZ PG UIJT OPUBUJPO

\ x : xs -> x
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

 8IFO ƶYFE UIJT GVODUJPO XJMM SFUVSO  GSPN UIF WBMVF (1,
2)

f (a b) = A

.BUDI UIF GVODUJPO OBNFT UP UIFJS UZQFT


 8IJDI PG UIF GPMMPXJOH UZQFT JT UIF UZQF PG show

B
show a => a -> String

C
Show a -> a -> String

D
Show a => a -> String

 8IJDI PG UIF GPMMPXJOH UZQFT JT UIF UZQF PG (==)

B
a -> a -> Bool

C
Eq a => a -> a -> Bool

D
Eq a -> a -> a -> Bool

E
Eq a => A -> Bool

 8IJDI PG UIF GPMMPXJOH UZQFT JT UIF UZQF PG fst

B
(a, b) -> a

C
b -> a

D
(a, b) -> b

 8IJDI PG UIF GPMMPXJOH UZQFT JT UIF UZQF PG (+)


$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

B
(+) :: Num a -> a -> a -> Bool

C
(+) :: Num a => a -> a -> Bool

D
(+) :: num a => a -> a -> a

E
(+) :: Num a => a -> a -> a

F
(+) :: a -> a -> a

 %FƶOJUJPOT
 " UVQMF JT BO PSEFSFE HSPVQJOH PG WBMVFT *O )BTLFMM ZPV
DBOOPU IBWF B UVQMF XJUI POMZ POF FMFNFOU CVU UIFSF JT B
[FSP UVQMF BMTP DBMMFE VOJU PS () 5IF UZQFT PG UIF FMFNFOUT
PG UVQMFT BSF BMMPXFE UP WBSZ TP ZPV DBO IBWF CPUI 4USJOH
4USJOH
PS *OUFHFS 4USJOH
 5VQMFT JO )BTLFMM BSF UIF VTVBM
NFBOT PG FYQSFTTJOH BO BOPOZNPVT QSPEVDU

 " UZQFDMBTT JT B TFU PG PQFSBUJPOT EFƶOFE XJUI SFTQFDU UP


B QPMZNPSQIJD UZQF 8IFO B UZQF JT BO JOTUBODF PG B
UZQFDMBTT WBMVFT PG UIBU UZQF DBO CF VTFE JO UIF TUBOEBSE
PQFSBUJPOT EFƶOFE GPS UIBU UZQFDMBTT *O )BTLFMM UZQF
DMBTTFT BSF VOJRVF QBJSJOHT PG DMBTT BOE DPODSFUF JOTUBODF
5IJT NFBOT UIBU JG B HJWFO UZQF Ԑ IBT BO JOTUBODF PG Eq JU
IBT POMZ POF JOTUBODF PG Eq

 %BUB DPOTUSVDUPST JO )BTLFMM QSPWJEF B NFBOT PG DSFBUJOH


WBMVFT UIBU JOIBCJU B HJWFO UZQF %BUB DPOTUSVDUPST JO
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

)BTLFMM IBWF B UZQF BOE DBO FJUIFS CF DPOTUBOU WBMVFT


OVMMBSZ
PS UBLF POF PS NPSF BSHVNFOUT KVTU MJLF GVODUJPOT
*O UIF GPMMPXJOH FYBNQMF Cat JT B OVMMBSZ EBUB DPOTUSVDUPS
GPS Pet BOE Dog JT B EBUB DPOTUSVDUPS UIBU UBLFT BO BSHVNFOU

-- Why name a cat? They don't answer anyway.


type Name = String

data Pet = Cat | Dog Name

5IF EBUB DPOTUSVDUPST IBWF UIF GPMMPXJOH UZQFT

Prelude> :t Cat
Cat :: Pet
Prelude> :t Dog
Dog :: Name -> Pet

 5ZQF DPOTUSVDUPST JO )BTLFMM BSF OPU WBMVFT BOE DBO POMZ CF


VTFE JO UZQF TJHOBUVSFT +VTU BT EBUB EFDMBSBUJPOT HFOFSBUF
EBUB DPOTUSVDUPST UP DSFBUF WBMVFT UIBU JOIBCJU UIBU UZQF
EBUB EFDMBSBUJPOT HFOFSBUF UZQF DPOTUSVDUPST XIJDI DBO CF
VTFE UP EFOPUF UIBU UZQF *O UIF BCPWF FYBNQMF Pet JT UIF
UZQF DPOTUSVDUPS " HVJEFMJOF GPS EJƵFSFOUJBUJOH UIF UXP
LJOET PG DPOTUSVDUPST JT UIBU UZQF DPOTUSVDUPST BMXBZT HP
UP UIF MFǒ PG UIF = JO B EBUB EFDMBSBUJPO
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

 %BUB EFDMBSBUJPOT EFƶOF OFX EBUBUZQFT JO )BTLFMM %BUB


EFDMBSBUJPOT BMXBZT DSFBUF B OFX UZQF DPOTUSVDUPS CVU NBZ
PS NBZ OPU DSFBUF OFX EBUB DPOTUSVDUPST %BUB EFDMBSBUJPOT
BSF IPX XF SFGFS UP UIF FOUJSF EFƶOJUJPO UIBU CFHJOT XJUI
UIF data LFZXPSE

 " UZQF BMJBT JT B XBZ UP SFGFS UP B UZQF DPOTUSVDUPS PS UZQF


DPOTUBOU CZ BO BMUFSOBUF OBNF VTVBMMZ UP DPNNVOJDBUF
TPNFUIJOH NPSF TQFDJƶD PS GPS CSFWJUZ

type Name = String


-- creates a new type alias Name of the
-- type String *not* a data declaration,
-- just a type alias declaration

 "SJUZ JT UIF OVNCFS PG BSHVNFOUT B GVODUJPO BDDFQUT 5IJT


OPUJPO JT B MJUUMF TMJQQFSZ JO )BTLFMM BT EVF UP DVSSZJOH BMM
GVODUJPOT BSF BSJUZ BOE XF IBOEMF BDDFQUJOH NVMUJQMF
BSHVNFOUT CZ OFTUJOH GVODUJPOT

 1PMZNPSQIJTN JO )BTLFMM NFBOT CFJOH BCMF UP XSJUF DPEF


JO UFSNT PG WBMVFT XIJDI NBZ CF POF PG TFWFSBM PS BOZ
UZQF 1PMZNPSQIJTN JO )BTLFMM JT FJUIFS QBSBNFUSJD PS
DPOTUSBJOFE 5IF JEFOUJUZ GVODUJPO id JT BO FYBNQMF PG B
QBSBNFUSJDBMMZ QPMZNPSQIJD GVODUJPO

id :: a -> a
id x = x
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

)FSF id XPSLT GPS B WBMVF PG BOZ UZQF CFDBVTF JU EPFTOƊU


VTF BOZ JOGPSNBUJPO TQFDJƶD UP B HJWFO UZQF PS TFU PG UZQFT
8IFSFBT UIF GPMMPXJOH GVODUJPO isEqual

isEqual :: Eq a => a -> a -> Bool


isEqual x y = x == y

*T QPMZNPSQIJD CVU DPOTUSBJOFE PS CPVOEFE UP UIF TFU PG


UZQFT XIJDI IBWF BO JOTUBODF PG UIF Eq UZQFDMBTT 5IF EJG
GFSFOU LJOET PG QPMZNPSQIJTN XJMM CF EJTDVTTFE JO HSFBUFS
EFUBJM JO B MBUFS DIBQUFS

 /BNFT BOE WBSJBCMFT


/BNFT
*O )BTLFMM UIFSF BSF TFWFO DBUFHPSJFT PG FOUJUJFT UIBU IBWF
OBNFT GVODUJPOT UFSNMFWFM WBSJBCMFT EBUB DPOTUSVDUPST UZQF
WBSJBCMFT UZQF DPOTUSVDUPST UZQFDMBTTFT BOE NPEVMFT 5FSN
MFWFM WBSJBCMFT BOE EBUB DPOTUSVDUPST FYJTU JO ZPVS UFSNT 5FSN
MFWFM JT XIFSF ZPVS WBMVFT MJWF BOE JT UIF DPEF UIBU FYFDVUFT
XIFO ZPVS QSPHSBN JT SVOOJOH "U UIF UZQFMFWFM XIJDI JT
VTFE EVSJOH UIF TUBUJD BOBMZTJT  WFSJƶDBUJPO PG ZPVS QSPHSBN
XF IBWF UZQF WBSJBCMFT UZQF DPOTUSVDUPST BOE UZQFDMBTTFT
-BTUMZ GPS UIF QVSQPTF PG PSHBOJ[JOH PVS DPEF JOUP DPIFSFOU
HSPVQJOHT BDSPTT EJƵFSFOU ƶMFT NPSF MBUFS
XF IBWF NPEVMFT
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

$POWFOUJPOT GPS WBSJBCMFT


)BTLFMM VTFT B MPU PG WBSJBCMFT BOE TPNF DPOWFOUJPOT IBWF
EFWFMPQFE *UƊT OPU DSJUJDBM UIBU ZPV NFNPSJ[F UIJT CFDBVTF GPS
UIF NPTU QBSU UIFTF BSF NFSFMZ DPOWFOUJPOT CVU GBNJMJBSJ[JOH
ZPVSTFMG XJUI UIFN XJMM IFMQ ZPV SFBE )BTLFMM DPEF
5ZQF WBSJBCMFT UIBU JT WBSJBCMFT JO UZQF TJHOBUVSFT
HFOFS
BMMZ TUBSU BU Ԑ BOE HP GSPN UIFSF Ԑ ԑ Ԓ BOE TP GPSUI :PV NBZ
PDDBTJPOBMMZ TFF UIFN XJUI OVNCFST BQQFOEFE UP UIFN FH
Ԑ
'VODUJPOT DBO CF VTFE BT BSHVNFOUT BOE JO UIBU DBTF BSF
UZQJDBMMZ MBCFMFE XJUI WBSJBCMFT TUBSUJOH BU ԕ GPMMPXFE CZ Ԗ BOE
TP PO
 5IFZ NBZ TPNFUJNFT IBWF OVNCFST BQQFOEFE FH ԕ

BOE NBZ BMTP TPNFUJNFT CF EFDPSBUFE XJUI UIF ஥ DIBSBDUFS BT


JO ԕ ஥  5IJT XPVME CF QSPOPVODFE ƌFƵQSJNF ƍ TIPVME ZPV IBWF
OFFE UP TBZ JU BMPVE 6TVBMMZ UIJT EFOPUFT B GVODUJPO UIBU JT
DMPTFMZ SFMBUFE UP PS B IFMQFS GVODUJPO UP GVODUJPO ԕ 'VODUJPOT
NBZ BMTP CF HJWFO WBSJBCMF OBNFT UIBU BSF OPU PO UIJT TQFDUSVN
BT B NOFNPOJD 'PS FYBNQMF B GVODUJPO UIBU SFTVMUT JO B MJTU
PG QSJNF OVNCFST NJHIU CF DBMMFE ԟ PS B GVODUJPO UIBU GFUDIFT
TPNF UFYU NJHIU CF DBMMFE ԣԧԣ
7BSJBCMFT EP OPU IBWF UP CF B TJOHMF MFUUFS *O TNBMM QSPHSBNT
UIFZ PǒFO BSF JO MBSHFS QSPHSBNT UIFZ BSF PǒFO OPU B TJOHMF
MFUUFS *G UIFSF BSF NBOZ WBSJBCMFT JO B GVODUJPO PS QSPHSBN BT
JT DPNNPO JU JT IFMQGVM UP IBWF EFTDSJQUJWF WBSJBCMF OBNFT *U
JT PǒFO BEWJTBCMF JO EPNBJOTQFDJƶD DPEF UP UP VTF EPNBJO
$)"15&3  #&$"64& 1*(4 $"/Ɗ5 '-: 

TQFDJƶD WBSJBCMF OBNFT


"SHVNFOUT UP GVODUJPOT BSF NPTU PǒFO HJWFO OBNFT TUBSU
JOH BU ԧ BHBJO PDDBTJPOBMMZ TFFO OVNCFSFE BT JO ԧ 0UIFS
TJOHMFMFUUFS WBSJBCMF OBNFT NBZ CF DIPTFO XIFO UIFZ TFSWF B
NOFNPOJD SPMF TVDI BT DIPPTJOH ԡ UP SFQSFTFOU B WBMVF UIBU JT
UIF SBEJVT PG B DJSDMF
*G ZPV IBWF B MJTU PG UIJOHT ZPV IBWF OBNFE ԧ CZ DPOWFOUJPO
UIBU XJMM VTVBMMZ CF DBMMFE ԧԢ UIBU JT UIF QMVSBM PG ԧ :PV XJMM
TFF UIJT DPOWFOUJPO PǒFO JO UIF GPSN (x:xs) XIJDI NFBOT ZPV
IBWF B MJTU JO XIJDI UIF IFBE PG UIF MJTU JT ԧ BOE UIF SFTU PG UIF
MJTU JT ԧԢ
"MM PG UIFTF UIPVHI BSF NFSFMZ DPOWFOUJPOT OPU EFƶOJUF
SVMFT 8IJMF XF XJMM HFOFSBMMZ BEIFSF UP UIF DPOWFOUJPOT JO
UIJT CPPL BOZ )BTLFMM DPEF ZPV TFF PVU JO UIF XJME NBZ OPU
$BMMJOH B UZQF WBSJBCMF ԧ JOTUFBE PG Ԑ JT OPU HPJOH UP CSFBL
BOZUIJOH "T JO UIF MBNCEB DBMDVMVT UIF OBNFT EPOƊU IBWF BOZ
JOIFSFOU NFBOJOH 8F PƵFS UIJT JOGPSNBUJPO BT B EFTDSJQUJWF
HVJEF PG )BTLFMM DPOWFOUJPOT OPU BT SVMFT ZPV NVTU GPMMPX JO
ZPVS PXO DPEF
$IBQUFS 

5ZQFT

4IF XBT UIF TJOHMF


BSUJƶDFS PG UIF XPSME
*O XIJDI TIF TBOH "OE
XIFO TIF TBOH UIF TFB
8IBUFWFS TFMG JU IBE
CFDBNF UIF TFMG
5IBU XBT IFS TPOH GPS TIF
XBT UIF NBLFS

8BMMBDF 4UFWFOT ƌ5IF


*EFB PG 0SEFS BU ,FZ
8FTUƍ


$)"15&3  5:1&4 

 5ZQFT
*O UIF MBTU DIBQUFS XF MPPLFE BU TPNF CVJMUJO EBUBUZQFT TVDI
BT Bool BOE UVQMFT BOE XF IBE B CSJFG SVOJO XJUI UIF UZQF
DMBTTFT Num BOE Eq )PXFWFS B EFFQ VOEFSTUBOEJOH PG UZQFT
BOE IPX UP SFBE BOE JOUFSQSFU UIFN JT GVOEBNFOUBM UP SFBEJOH
BOE XSJUJOH )BTLFMM
"T XF IBWF TFFO B EBUBUZQF EFDMBSBUJPO EFƶOFT B UZQF DPO
TUSVDUPS BOE EBUB DPOTUSVDUPST %BUB DPOTUSVDUPST BSF UIF WBM
VFT PG B QBSUJDVMBS UZQF UIFZ BSF BMTP GVODUJPOT UIBU MFU VT
DSFBUF EBUB PS WBMVFT PG B QBSUJDVMBS UZQF BMUIPVHI JU XJMM
UBLF TPNF UJNF CFGPSF UIF GVMM JNQPSU PG UIJT CFDPNFT DMFBS
*O )BTLFMM ZPV DBOOPU DSFBUF VOUZQFE EBUB TP FYDFQU GPS B
TQSJOLMJOH PG TZOUBDUJD TVHBS GPS UIJOHT MJLF OVNCFST PS GVOD
UJPOT FWFSZUIJOH PSJHJOBUFT JO B EBUB DPOTUSVDUPS GSPN TPNF
EFƶOJUJPO PG B UZQF
*O UIJT DIBQUFS XFƊSF HPJOH UP UBLF B EFFQFS MPPL BU UIF UZQF
TZTUFN BOE

Ƒ MFBSO NPSF BCPVU RVFSZJOH BOE SFBEJOH UZQF TJHOBUVSFT

Ƒ TFF UIBU DVSSZJOH IBT VOGPSUVOBUFMZ OPUIJOH UP EP XJUI


GPPE

Ƒ UBLF B DMPTFS MPPL BU EJƵFSFOU LJOET PG QPMZNPSQIJTN

Ƒ MPPL BU UZQF JOGFSFODF BOE IPX UP EFDMBSF UZQFT GPS PVS


GVODUJPOT
$)"15&3  5:1&4 

 8IBU BSF UZQFT GPS


)BTLFMM JT BO JNQMFNFOUBUJPO PG B QVSF MBNCEB DBMDVMVT JO
UIF TFOTF UIBU JU JTOƊU NVDI NPSF UIBO TZOUBDUJD TVHBS PWFS UIF
CBTJD TZTUFN PG WBSJBCMFT BCTUSBDUJPOT BOE BQQMJDBUJPOT UIBU
DPOTUJUVUF UIF SVMFT PG UIF MBNCEB DBMDVMVT ƈ BU MFBTU PG B UZQFE
MBNCEB DBMDVMVT %FWFMPQNFOUT JO MPHJD NBUIFNBUJDT BOE
DPNQVUFS TDJFODF MFE UP UIF EJTDPWFSZ PS JOWFOUJPO UBLF ZPVS
QJDL
PG B UZQFE MBNCEB DBMDVMVT DBMMFE 4ZTUFN ' JO UIF T
)BTLFMM IBT JNQSPWFE PO 4ZTUFN ' JO TPNF LFZ XBZT TVDI BT
CZ BMMPXJOH HFOFSBM SFDVSTJPO NPSF PO UIBU JO B MBUFS DIBQUFS

BOE UIF )JOEMFZ.JMOFS TZTUFN UP QFSNJU UZQF JOGFSFODF NPSF


PO UIBU MBUFS JO UIJT DIBQUFS
CVU UIF DPSF MPHJD JT UIF TBNF
4P XIZ EP XF XBOU UZQFT 5ZQF TZTUFNT JO MPHJD BOE NBUI
FNBUJDT IBWF CFFO EFTJHOFE UP JNQPTF DPOTUSBJOUT UIBU FOGPSDF
DPSSFDUOFTT 'PS PVS QVSQPTFT XF DBO TBZ UIBU XFMMEFTJHOFE
UZQF TZTUFNT IFMQ FMJNJOBUF TPNF DMBTTFT PG FSSPST BT XFMM BT
DPODFSOT TVDI BT XIBU UIF FƵFDU PG B DPOEJUJPOBM PWFS B OPO
#PPMFBO WBMVF NJHIU CF " UZQF TZTUFN EFƶOFT UIF BTTPDJBUJPOT
CFUXFFO EJƵFSFOU QBSUT PG B QSPHSBN BOE DIFDLT UIBU BMM UIF
QBSUT ƶU UPHFUIFS JO B MPHJDBMMZ DPOTJTUFOU QSPWBCMZ DPSSFDU
XBZ
-FUƊT DPOTJEFS B TIPSU TPNFXIBU PWFSTJNQMJƶFE FYBNQMF
5IF Bool UZQF JT B TFU XJUI UXP JOIBCJUBOUT True BOE False BT
XF TBX JO UIF MBTU DIBQUFS "OZUJNF UIF WBMVF True PS False
PDDVST JO B )BTLFMM QSPHSBN UIF UZQFDIFDLFS XJMM LOPX UIFZƊSF
$)"15&3  5:1&4 

NFNCFST PG UIF Bool UZQF 5IF JOWFSTF JT UIBU XIFOFWFS UIF


UZQF Bool JT EFDMBSFE JO B UZQF TJHOBUVSF UIF DPNQJMFS XJMM
FYQFDU POF PG UIPTF UXP WBMVFT BOE POMZ POF PG UIPTF UXP
WBMVFT ZPV HFU B UZQF FSSPS JG ZPV USZ UP QBTT B OVNCFS XIFSF
B Bool JT FYQFDUFE
*O )BTLFMM XIFSF UZQJOH JT TUBUJD UZQFDIFDLJOH PDDVST BU
DPNQJMF UJNF 5IBU NFBOT NBOZ FSSPST XJMM CF DBVHIU CFGPSF
ZPV USZ UP FYFDVUF PS SVO ZPVS QSPHSBN 5IF EJƵFSFODF JTOƊU
BMXBZT PCWJPVT CFDBVTF ()$J BMMPXT ZPV UP UZQFDIFDL UIJOHT
JOUFSBDUJWFMZ BT ZPVƊSF XSJUJOH UIFN BT XFMM BT FYFDVUF UIFN JG
UIFZ UZQFDIFDL /P UZQF TZTUFN DBO FMJNJOBUF BMM QPTTJCJMJUJFT
GPS FSSPS TP UIF QPTTJCJMJUZ PG SVOUJNF FSSPST BOE FYDFQUJPOT
TUJMM FYJTUT BOE UFTUJOH UP XIJDI XF EFWPUF BO FOUJSF MBUFS
DIBQUFS
PG QSPHSBNT JT TUJMM OFDFTTBSZ CVU UIF UZQF TZTUFN
DVUT EPXO PO JU B HSFBU EFBM
(PPE UZQF TZTUFNT DBO BMTP FOBCMF DPNQJMFS PQUJNJ[BUJPOT
CFDBVTF UIF DPNQJMFS DBO LOPX BOE QSFEJDU DFSUBJO UIJOHT
BCPVU UIF FYFDVUJPO PG B QSPHSBN CBTFE PO UIF UZQFT 5ZQFT
DBO BMTP TFSWF BT EPDVNFOUBUJPO PG ZPVS QSPHSBN XIJDI JT
XIZ XF FODPVSBHF ZPV UP EFDMBSF UZQFT UIBU JT XSJUF UIF UZQF
TJHOBUVSFT
GPS ZPVS GVODUJPOT *U XPOƊU NBUUFS UPP NVDI XIFO
ZPVƊSF XSJUJOH TNBMM QSPHSBNT CVU BT QSPHSBNT HFU MPOHFS
UZQF TJHOBUVSFT BMPOF DBO IFMQ ZPV SFBE ZPVS QSPHSBN BOE
SFNFNCFS XIBU ZPV XFSF EPJOH BOE IFMQ BOZPOF FMTF XIP
NJHIU CF USZJOH UP VTF ZPVS DPEF BT XFMM *G UIJT QBSBHSBQI
EJEOƊU NBLF TFOTF UP ZPV OPX UIBUƊT ƶOF ƈ XFƊMM SFUVSO UP
$)"15&3  5:1&4 

UIFTF QPJOUT BU TFWFSBM QPJOUT MBUFS JO UIF CPPL


:PV NBZ GFFM UIBU )BTLFMMƊT UZQF TZTUFN SFRVJSFT B MPU PG VQ
GSPOU XPSL 5IJT VQGSPOU DPTU DPNFT XJUI B MBUFS QBZPƵ DPEF
UIBU JT TBGFS BOE EPXO UIF MJOF FBTJFS UP NBJOUBJO 8PSLJOH
XJUI B HPPE UZQF TZTUFN DBO FMJNJOBUF UIPTF UFTUT UIBU POMZ
DIFDL UIBU ZPVƊSF QBTTJOH UIF SJHIU TPSU PG EBUB BSPVOE BOE
TJODF UFTUT BSF NPSF DPEF UIBU ZPV IBWF UP XSJUF DPSSFDUMZ
BOE
NBJOUBJO JU XJMM FWFOUVBMMZ TBWF ZPV UJNF BOE FƵPSU
.BOZ QFSIBQT NPTU QSPHSBNNJOH MBOHVBHFT IBWF UZQF
TZTUFNT UIBU GFFM MJLF IBHHMJOH XJUI B QFUUZ NFSDIBOU )PXFWFS
XF CFMJFWF )BTLFMM QSPWJEFT B UZQF TZTUFN UIBU NPSF DMPTFMZ
SFTFNCMFT B RVJFU QMFBTBOU DPOWFSTBUJPO XJUI B DPMMFBHVF UIBO
BO BSHVNFOU JO UIF CB[BBS .VDI PG XIBU XF TVHHFTU XJUI
SFHBSET UP QVUUJOH DPEF JO B ƶMF MPBEJOH JU JO B 3&1- RVFSZJOH
UZQFT JO UIF 3&1- BOE TP GPSUI JT BCPVU DSFBUJOH IBCJUT DPO
EVDJWF UP IBWJOH UIJT QMFBTBOU CBDL BOE GPSUI XJUI ZPVS UZQF
TZTUFN

 )PX UP SFBE UZQF TJHOBUVSFT


*O QSFWJPVT DIBQUFST XFƊWF TFFO UIBU XF DBO RVFSZ UZQFT JO UIF
3&1- CZ VTF PG UIF :type PS :t DPNNBOE :PV DBO RVFSZ UZQFT
GPS GVODUJPOT QBSUJBMMZ BQQMJFE GVODUJPOT BOE WBMVFT XIJDI
BSF JO B XBZ GVMMZ BQQMJFE GVODUJPOT
8IFO XF RVFSZ UIF UZQFT PG WBMVFT XF TFF TPNFUIJOH MJLF
UIJT
$)"15&3  5:1&4 

Prelude> :type 't'


't' :: Char -- 't' has the type Char
Prelude> :type "julie"
"julie" :: [Char] -- "julie" has the type String
Prelude> :type True
True :: Bool -- True has the type Bool

8IFO XF RVFSZ UIF UZQFT PG OVNFSJD WBMVFT XF TFF UZQF


DMBTT JOGPSNBUJPO JOTUFBE PG B DPODSFUF UZQF CFDBVTF UIF DPN
QJMFS EPFTOƊU LOPX XIJDI TQFDJƶD OVNFSJD UZQF B WBMVF JT VOUJM
UIF UZQF JT FJUIFS EFDMBSFE PS UIF DPNQJMFS JT GPSDFE UP JOGFS
B TQFDJƶD UZQF CBTFE PO UIF GVODUJPO 'PS FYBNQMF  NBZ
MPPL MJLF BO JOUFHFS UP VT CVU UIBU XPVME POMZ BMMPX VT UP VTF JU
JO DPNQVUBUJPOT UIBU UBLF JOUFHFST BOE OPU TBZ JO GSBDUJPOBM
EJWJTJPO
 'PS UIBU SFBTPO UIF DPNQJMFS HJWFT JU UIF UZQF XJUI
UIF CSPBEFTU BQQMJDBCJMJUZ NPTU QPMZNPSQIJD
BOE TBZT JUƊT B
DPOTUSBJOFE QPMZNPSQIJD Num a => a WBMVF

Prelude> :type 13
13 :: Num a => a

-- we can give it a concrete type


-- by declaring it
Prelude> let x = 13 :: Integer
Prelude> :t x
x :: Integer
$)"15&3  5:1&4 

1PMZNPSQIJTN QPMZNPSQIJD OVNFSBMT BOE UZQF JOGFSFODF


XJMM BMM CF BEESFTTFE JO NPSF EFUBJM MBUFS
:PV DBO BMTP RVFSZ UIF UZQF TJHOBUVSFT PG GVODUJPOT BT XFƊWF
TFFO

Prelude> :type not


not :: Bool -> Bool

5IJT UBLFT POF JOQVU PG B Bool WBMVF BOE SFUVSOT POF Bool
WBMVF (JWFO UIBU UZQF UIFSF BSFOƊU UPP NBOZ UIJOHT JU FWFO
DPVME EP

6OEFSTUBOEJOH UIF GVODUJPO UZQF


5IF BSSPX (->) JT UIF UZQF DPOTUSVDUPS GPS GVODUJPOT JO )BTLFMM
*UƊT CBLFE JOUP UIF MBOHVBHF CVU TZOUBDUJDBMMZ JU XPSLT JO WFSZ
NVDI UIF TBNF XBZ BT BMM UIF PUIFS UZQFT ZPVƊWF TFFO TP GBS *UƊT
B UZQF DPOTUSVDUPS MJLF Bool FYDFQU UIF (->) UZQF DPOTUSVDUPS
UBLFT BSHVNFOUT BOE IBT OP EBUB DPOTUSVDUPST

Prelude> :info (->)


data (->) a b
-- some further information is elided

'PVS UP CF QSFDJTF #VU JG XF BTTVNF UIBU UIF TUBOEBSE 1SFMVEF GVODUJPOT BSF HFOFSBMMZ
VTFGVM GVODUJPOT JU IFMQT OBSSPX JU EPXO DPOTJEFSBCMZ -BUFS XF XJMM TIPX ZPV IPX UP
DBMDVMBUF UIF DBSEJOBMJUZ PG UZQFT TVDI UIBU ZPV XJMM LOPX IPX NBOZ XBZT UIFSF BSF UP
EFƶOF TPNFUIJOH PG B QBSUJDVMBS UZQF
$)"15&3  5:1&4 

*G ZPV DPNQBSF UIJT UP UIF UZQF DPOTUSVDUPS GPS UIF UXP


UVQMF ZPV TFF UIF TJNJMBSJUZ

Prelude> :info (,)


data (,) a b = (,) a b

8F TBX FBSMJFS UIBU UIF UVQMF DPOTUSVDUPS OFFET UP CF BQQMJFE


UP UXP WBMVFT JO PSEFS UP DPOTUSVDU B UVQMF " GVODUJPO NVTU
TJNJMBSMZ IBWF UXP BSHVNFOUT ƈ POF JOQVU BOE POF SFTVMU ƈ
JO PSEFS UP CF B GVODUJPO 6OMJLF UIF UVQMF DPOTUSVDUPS UIPVHI
UIF GVODUJPO UZQF IBT OP EBUB DPOTUSVDUPST 5IF WBMVF UIBU
TIPXT VQ BU UFSN MFWFM JT UIF GVODUJPO 'VODUJPOT BSF WBMVFT
"T XFƊWF TBJE UIF IBMMNBSL PG B GVODUJPO JT UIBU JU DBO CF
BQQMJFE BOE UIF TUSVDUVSF PG UIF UZQF EFNPOTUSBUFT UIJT 5IF
BSSPX JT BO JOƶY PQFSBUPS UIBU IBT UXP QBSBNFUFST BOE BTTPDJBUFT
UP UIF SJHIU BMUIPVHI GVODUJPO BQQMJDBUJPO JT MFǒ BTTPDJBUJWF

5IF QBSBNFUFSJ[BUJPO TVHHFTUT UIBU XF XJMM BQQMZ UIF GVODUJPO
UP TPNF BSHVNFOU UIBU XJMM CF CPVOE UP UIF ƶSTU QBSBNFUFS
XJUI UIF TFDPOE QBSBNFUFS ԑ SFQSFTFOUJOH UIF SFUVSO PS SFTVMU
UZQF 8F XJMM DPWFS UIFTF UIJOHT JO NPSF EFUBJM UISPVHIPVU
UIJT DIBQUFS
-FUƊT SFUVSO UP SFBEJOH UZQF TJHOBUVSFT 5IF GVODUJPO fst JT
B WBMVF PG UZQF (a, b) -> a XIFSF -> JT BO JOƶY UZQF DPOTUSVDUPS
UIBU UBLFT UXP BSHVNFOUT

fst :: (a, b) -> a


-- [1] [2] [3]
$)"15&3  5:1&4 

 5IF ƶSTU QBSBNFUFS PG fst IBT UIF UZQF (a, b) /PUF UIBU
UIF UVQMF UZQF JUTFMG (,) UBLFT UXP BSHVNFOUT Ԑ BOE ԑ IFSF

 5IF GVODUJPO UZQF (->) IBT UXP QBSBNFUFST IFSF 0OF JT


(a, b) BOE POF JT UIF SFTVMU Ԑ

 5IF SFTVMU PG UIF GVODUJPO XIJDI IBT UZQF Ԑ *UƊT UIF TBNF
Ԑ UIBU XBT JO UIF UVQMF (a, b)

)PX EP XF LOPX JUƊT UIF TBNF Ԑ "T XF MFBSO NPSF BCPVU


UZQF WBSJBCMFT JU XJMM CFDPNF NPSF DMFBS IPX XF LOPX 8F DBO
TBZ UIBU XF LOPX UIF JOQVU UZQF Ԑ BOE UIF PVUQVU UZQF Ԑ NVTU
CF UIF TBNF UZQF BOE XF DBO TFF UIBU OPUIJOH IBQQFOT CFUXFFO
UIF JOQVU BOE UIF PVUQVU UIBU JT UIFSF JT OP PQFSBUJPO UIBU
DPNFT CFUXFFO UIFN UIBU DPVME USBOTGPSN UIBU Ԑ JOUP TPNF
PUIFS WBMVF PG UIBU UZQF 8FƊMM HP JOUP NPSF EFUBJM BCPVU UIPTF
QPJOUT MBUFS JO UIF DIBQUFS
-FUƊT MPPL BU BOPUIFS GVODUJPO

Prelude> :type length


length :: [a] -> Int

5IF length GVODUJPO UBLFT POF BSHVNFOU UIBU JT B MJTU ƈ OPUF


UIF TRVBSF CSBDLFUT ƈ BOE SFUVSOT BO Int SFTVMU 5IF Int SFTVMU
JO UIJT DBTF XJMM CF UIF OVNCFS PG JUFNT JO UIF MJTU 5IF UZQF PG
UIF JOIBCJUBOUT PG UIF MJTU JT MFǒ VOTQFDJƶFE UIJT GVODUJPO EPFT
OPU DBSF JO GBDU DBOOPU DBSF XIBU UZQFT PG WBMVFT BSF JOTJEF
UIF MJTU
$)"15&3  5:1&4 

5ZQFDMBTTDPOTUSBJOFE UZQF WBSJBCMFT


/FYU MFUƊT MPPL BU UIF UZQFT PG TPNF BSJUINFUJD GVODUJPOT :PV
NBZ SFDBMM UIBU UIF BDU PG XSBQQJOH BO JOƶY PQFSBUPS JO QBSFO
UIFTFT BMMPXT VT UP VTF UIF GVODUJPO KVTU MJLF B OPSNBM QSFƶY
GVODUJPO JODMVEJOH CFJOH BCMF UP RVFSZ UIF UZQF

Prelude> :type (+)


(+) :: Num a => a -> a -> a
Prelude> :type (/)
(/) :: Fractional a => a -> a -> a

5P EFTDSJCF UIFTF DBTVBMMZ XF DPVME TBZ BEEJUJPO UBLFT POF


OVNFSJD BSHVNFOU BEET JU UP B TFDPOE OVNFSJD BSHVNFOU PG
UIF TBNF UZQF BOE SFUVSOT B OVNFSJD WBMVF PG UIF TBNF UZQF
BT B SFTVMU 4JNJMBSMZ UIF GSBDUJPOBM EJWJTJPO GVODUJPO UBLFT B
GSBDUJPOBM WBMVF EJWJEFT JU CZ B TFDPOE GSBDUJPOBM WBMVF BOE
SFUVSOT B UIJSE GSBDUJPOBM WBMVF BT B SFTVMU 5IJT JTOƊU QSFDJTF
CVU JU XJMM EP GPS OPX
5IF DPNQJMFS HJWFT UIF MFBTU TQFDJƶD BOE NPTU HFOFSBM UZQF
JU DBO *OTUFBE PG MJNJUJOH UIJT GVODUJPO UP B DPODSFUF UZQF XF
HFU B UZQFDMBTTDPOTUSBJOFE QPMZNPSQIJD UZQF WBSJBCMF 8FƊMM
TBWF B GVMMFS FYQMBOBUJPO PG UZQFDMBTTFT GPS UIF OFYU DIBQUFS
8IBU XF OFFE UP LOPX IFSF JT UIBU FBDI UZQFDMBTT PƵFST B TUBO
EBSE TFU PG GVODUJPOT UIBU DBO CF VTFE BDSPTT TFWFSBM DPODSFUF
UZQFT 8IFO B UZQFDMBTT JT DPOTUSBJOJOH B UZQF WBSJBCMF JO UIJT
XBZ UIF WBSJBCMF DPVME SFQSFTFOU BOZ PG UIF DPODSFUF UZQFT
$)"15&3  5:1&4 

UIBU IBWF JOTUBODFT PG UIBU UZQFDMBTT TP UIBU TQFDJƶD PQFSBUJPOT


PO XIJDI UIF GVODUJPO EFQFOET BSF EFƶOFE GPS UIBU UZQF 8F
TBZ JUƊT DPOTUSBJOFE CFDBVTF XF TUJMM EPOƊU LOPX UIF DPODSFUF
UZQF PG Ԑ CVU XF EP LOPX JU DBO POMZ CF POF PG UIF UZQFT UIBU
IBT UIF SFRVJSFE UZQFDMBTT JOTUBODF
5IJT HFOFSBMJ[BUJPO PG OVNCFSIPPE JT XIBU MFUT VT VTF UIF
TBNF OVNFSJDBM MJUFSBMT UP SFQSFTFOU OVNFSJD WBMVFT PG EJG
GFSFOU UZQFT 8F DBO TUBSU XJUI B Num a => a WBMVF BOE UIFO
DSFBUF TQFDJƶD WFSTJPOT PG JU XJUI B DPODSFUF UZQF VTJOH UIF ::
UP BTTJHO B UZQF UP UIF WBMVF

Prelude> let fifteen = 15


Prelude> :t fifteen
fifteen :: Num a => a
Prelude> let fifteenInt = fifteen :: Int
Prelude> let fifteenDouble = fifteen :: Double
Prelude> :t fifteenInt
fifteenInt :: Int
Prelude> :t fifteenDouble
fifteenDouble :: Double

8F XFOU GSPN Num a => a UP Int BOE Double 5IJT XPSLT CF
DBVTF Int BOE Double FBDI IBWF BO JOTUBODF PG UIF Num UZQFDMBTT

Prelude> :info Num


[...irrelevant bits elided...]
instance Num Int -- Defined in ‘GHC.Num’
$)"15&3  5:1&4 

instance Num Double -- Defined in ‘GHC.Float’

4JODF UIFZ CPUI IBWF JOTUBODFT PG Num UIF PQFSBUJPOT GSPN


Num TVDI BT BEEJUJPO BSF EFƶOFE GPS CPUI PG UIFN

Prelude> fifteenInt + fifteenInt


30
Prelude> fifteenDouble + fifteenDouble
30.0

8F DBO BMTP NBLF NPSF TQFDJƶD WFSTJPOT PG PVS Num a => a


WBMVF OBNFE fifteen CZ VTJOH JU JO B XBZ UIBU SFRVJSFT JU UP
CFDPNF TPNFUIJOH NPSF TQFDJƶD

Prelude> fifteenDouble + fifteen


30.0
Prelude> fifteenInt + fifteen
30

8IBU XF DBOOPU EP JT UIJT

Prelude> fifteenDouble + fifteenInt

Couldn't match expected type ‘Double’


with actual type ‘Int’
In the second argument of ‘(+)’,
namely ‘fifteenInt’
In the expression: fifteenDouble + fifteenInt
$)"15&3  5:1&4 

8F DBOƊU BEE UIPTF UXP WBMVFT CFDBVTF UIFJS UZQFT BSF OP


MPOHFS QPMZNPSQIJD BOE UIFJS DPODSFUF UZQFT BSF EJƵFSFOU TP
UIFZ IBWF EJƵFSFOU EFƶOJUJPOT PG IPX UP JNQMFNFOU BEEJUJPO
5IF UZQF FSSPS NFTTBHF DPOUSBTUT UIF BDUVBM UZQF XJUI UIF FY
QFDUFE UZQF 5IF BDUVBM UZQF JT XIBU XF QSPWJEFE UIF FYQFDUFE
UZQF JT XIBU UIF DPNQJMFS FYQFDUFE 4JODF XF IBE fifteenDouble
BT PVS ƶSTU BSHVNFOU JU FYQFDUFE UIF TFDPOE WBMVF UP BMTP IBWF
UIF UZQF Double CVU JU BDUVBMMZ IBT UIF UZQF Int
" UZQF TJHOBUVSF NJHIU IBWF NVMUJQMF UZQFDMBTT DPOTUSBJOUT
PO POF PS NPSF PG UIF WBSJBCMFT :PV XJMM TPNFUJNFT TFF PS
XSJUF
UZQF TJHOBUVSFT TVDI BT

(Num a, Num b) => a -> b -> b

-- or

(Ord a, Num a) => a -> a -> Ordering

)FSF UIF DPOTUSBJOUT MPPL MJLF B UVQMF CVU UIFZ EPOƊU BEE
BOPUIFS GVODUJPO BSHVNFOU UIBU ZPV NVTU QSPWJEF BOE UIFZ
EPOƊU BQQFBS BT B UVQMF BU UIF WBMVF PS UFSN MFWFM /PUIJOH UP
UIF MFǒ PG UIF UZQFDMBTT BSSPX => TIPXT VQ BU UFSN MFWFM 5IF
UVQMF PG DPOTUSBJOUT EPFT SFQSFTFOU B QSPEVDU PS DPOKVODUJPO
PG DPOTUSBJOUT
*O UIF ƶSTU FYBNQMF BCPWF UIFSF BSF UXP DPOTUSBJOUT POF
GPS FBDI WBSJBCMF #PUI Ԑ BOE ԑ NVTU IBWF JOTUBODFT PG UIF
$)"15&3  5:1&4 

Num UZQFDMBTT *O UIF TFDPOE FYBNQMF CPUI PG UIF DPOTUSBJOUT


BSF PO UIF POF WBSJBCMF Ԑ ƈ UIBU JT Ԑ NVTU CF B UZQF UIBU
JNQMFNFOUT CPUI Ord BOE Num

&YFSDJTFT 5ZQF .BUDIJOH


#FMPX ZPVƊMM ƶOE B MJTU PG TFWFSBM TUBOEBSE GVODUJPOT XFƊWF
UBMLFE BCPVU QSFWJPVTMZ 6OEFS UIBU JT B MJTU PG UIFJS UZQF TJH
OBUVSFT .BUDI UIF GVODUJPO UP JUT UZQF TJHOBUVSF 5SZ UP EP
JU XJUIPVU QFFLJOH BU UIF UZQF TJHOBUVSFT FJUIFS JO UIF UFYU PS
JO ()$J
BOE UIFO DIFDL ZPVS XPSL :PV NBZ ƶOE JU FBTJFS UP
TUBSU GSPN UIF UZQFT BOE XPSL PVU XIBU ZPV UIJOL B GVODUJPO
PG UIBU UZQF XPVME EP

 'VODUJPOT

B
not
C
length
D
concat
E
head
F
(<)

 5ZQF TJHOBUVSFT

B
_ :: [a] -> a

C
_ :: [[a]] -> [a]
$)"15&3  5:1&4 

D
_ :: Bool -> Bool

E
_ :: [a] -> Int

F
_ :: Ord a => a -> a -> Bool

 $VSSZJOH
"T JO UIF MBNCEB DBMDVMVT BSHVNFOUT QMVSBM
JT B TIPSUIBOE
GPS UIF USVUI JO )BTLFMM BMM GVODUJPOT JO )BTLFMM UBLF POF BSHV
NFOU BOE SFUVSO POF SFTVMU 0UIFS QSPHSBNNJOH MBOHVBHFT
JG ZPV IBWF BOZ FYQFSJFODF XJUI UIFN UZQJDBMMZ BMMPX ZPV UP
EFƶOF GVODUJPOT UIBU DBO UBLF NVMUJQMF BSHVNFOUT 5IFSF JT
OP TVQQPSU GPS UIJT CVJMU JOUP )BTLFMM *OTUFBE UIFSF BSF TZO
UBDUJD DPOWFOJFODFT UIBU DPOTUSVDU DVSSJFE GVODUJPOT CZ EFGBVMU
$VSSZJOH SFGFST UP UIF OFTUJOH PG NVMUJQMF GVODUJPOT FBDI BD
DFQUJOH POF BSHVNFOU BOE SFUVSOJOH POF SFTVMU UP BMMPX UIF
JMMVTJPO PG NVMUJQMFQBSBNFUFS GVODUJPOT
5IF BSSPXT XFƊWF TFFO JO UZQF TJHOBUVSFT EFOPUF UIF GVOD
UJPO UZQF 8F MPPLFE BU UIF EBUBUZQF EFƶOJUJPO FBSMJFS CVU
MFUƊT SFWJFX

data (->) a b

*O PSEFS UP IBWF B GVODUJPO ZPV NVTU IBWF POF JOQVU UIF Ԑ


UP BQQMZ UIF GVODUJPO UP BOE ZPVƊMM HFU POF SFTVMU UIF ԑ CBDL
&BDI BSSPX JO B UZQF TJHOBUVSF SFQSFTFOUT POF BSHVNFOU BOE
POF SFTVMU XJUI UIF ƶOBM UZQF CFJOH UIF ƶOBM SFTVMU *G ZPV
$)"15&3  5:1&4 

BSF DPOTUSVDUJOH B GVODUJPO UIBU SFRVJSFT NVMUJQMF QBSBNFUFST


UIFO UIF ԑ DBO CF BOPUIFS GVODUJPO UIF Ԑ DBO CF BOPUIFS GVOD
UJPO BT XFMM XIJDI XFƊMM MPPL BU NPSF MBUFS
 *O UIBU DBTF KVTU
MJLF JO MBNCEB BCTUSBDUJPOT UIBU IBWF NVMUJQMF IFBET UIFZ BSF
OFTUFE
-FUƊT CSFBL UIJT EPXO CZ MPPLJOH BU UIF UZQF TJHOBUVSF GPS
BEEJUJPO B GVODUJPO UIBU OFFET NVMUJQMF JOQVUT

(+) :: Num a => a -> a -> a


-- | 1 |

(+) :: Num a => a -> a -> a


-- | 2 |

(+) :: Num a => a -> a -> a


-- [3]

 )FSF JT UIF UZQFDMBTT DPOTUSBJOU TBZJOH UIBU Ԑ NVTU IBWF


BO JOTUBODF PG Num "EEJUJPO JT EFƶOFE JO UIF Num UZQFDMBTT

 5IF CPVOEBSJFT PG  EFNBSDBUF XIBU ZPV NJHIU DBMM UIF


UXP QBSBNFUFST UP UIF GVODUJPO (+) CVU BMM GVODUJPOT JO
)BTLFMM UBLF POF BSHVNFOU BOE SFUVSO POF SFTVMU 5IJT JT
CFDBVTF GVODUJPOT JO )BTLFMM BSF OFTUFE MJLF .BUSZPTILB
EPMMT JO PSEFS UP BDDFQU ƌNVMUJQMFƍ BSHVNFOUT 5IF XBZ
UIF (->) UZQF DPOTUSVDUPS GPS GVODUJPOT XPSLT NFBOT a ->
a -> a SFQSFTFOUT TVDDFTTJWF GVODUJPO BQQMJDBUJPOT FBDI
$)"15&3  5:1&4 

UBLJOH POF BSHVNFOU BOE SFUVSOJOH POF SFTVMU 5IF EJƵFS


FODF JT UIBU UIF GVODUJPO BU UIF PVUFSNPTU MBZFS JT BDUVBMMZ
SFUVSOJOH BOPUIFS GVODUJPO UIBU BDDFQUT UIF OFYU BSHVNFOU
5IJT JT DBMMFE DVSSZJOH

 5IJT JT UIF SFTVMU UZQF GPS UIJT GVODUJPO *U XJMM CF B OVNCFS


PG UIF TBNF UZQF BT UIF UXP JOQVUT

5IF XBZ UIF UZQF DPOTUSVDUPS GPS GVODUJPOT (->) JT EFƶOFE


NBLFT DVSSZJOH UIF EFGBVMU JO )BTLFMM 5IJT JT CFDBVTF JU JT BO
JOƶY PQFSBUPS BOE SJHIU BTTPDJBUJWF #FDBVTF JU BTTPDJBUFT UP
UIF SJHIU UZQFT BSF JNQMJDJUMZ QBSFOUIFTJ[FE MJLF TP

f :: a -> a -> a

-- associates to

f :: a -> (a -> a)

BOE

map :: (a -> b) -> [a] -> [b]

-- associates into

map :: (a -> b) -> ([a] -> [b])


$)"15&3  5:1&4 

-FUƊT TFF JG XF DBO VOQBDL UIF OPUJPO PG B SJHIUBTTPDJBUJOH


JOƶY PQFSBUPS HJWJOH VT DVSSJFE GVODUJPOT 5IF BTTPDJBUJPO
IFSF PS HSPVQJOH JOUP QBSFOUIFTFT JT OPU UP DPOUSPM QSFDF
EFODF PS PSEFS PG FWBMVBUJPO JU POMZ TFSWFT UP HSPVQ UIF QB
SBNFUFST JOUP BSHVNFOU BOE SFTVMU TJODF UIFSF DBO POMZ CF
POF BSHVNFOU BOE POF SFTVMU QFS BSSPX 4JODF BMM UIF BSSPXT
IBWF UIF TBNF QSFDFEFODF UIF BTTPDJBUJWJUZ EPFT OPU DIBOHF
UIF QSFDFEFODF PS PSEFS PG FWBMVBUJPO
3FNFNCFS XIFO XF IBWF B MBNCEB FYQSFTTJPO UIBU BQQFBST
UP IBWF UXP QBSBNFUFST UIFZ BSF BDUVBMMZ OFTUFE MBNCEBT
"QQMZJOH UIF FYQSFTTJPO UP POF BSHVNFOU SFUVSOT B GVODUJPO
UIBU BXBJUT BQQMJDBUJPO UP B TFDPOE BSHVNFOU "ǒFS ZPV BQQMZ
JU UP B TFDPOE BSHVNFOU ZPV IBWF B ƶOBM SFTVMU :PV DBO OFTU
NPSF MBNCEBT UIBO UXP PG DPVSTF CVU UIF QSPDFTT JT UIF TBNF
POF BSHVNFOU POF SFTVMU FWFO UIPVHI UIBU SFTVMU NBZ CF B
GVODUJPO BXBJUJOH BQQMJDBUJPO UP BOPUIFS BSHVNFOU
5IF UZQF DPOTUSVDUPS GPS GVODUJPOT BOE UIF UZQFT XF TFF
BCPWF BSF UIF TBNF UIJOH CVU XSJUUFO JO )BTLFMM 8IFO UIFSF
BSF ƌUXP BSHVNFOUTƍ JO )BTLFMM XF BQQMZ PVS GVODUJPO UP BO
BSHVNFOU KVTU MJLF XIFO XF BQQMZ B MBNCEB FYQSFTTJPO UP BO
BSHVNFOU BOE UIFO SFUVSO B SFTVMU UIBU JT B GVODUJPO BOE OFFET
UP CF BQQMJFE UP B TFDPOE BSHVNFOU
&YQMJDJU QBSFOUIFTJ[BUJPO BT XIFO BO JOQVU QBSBNFUFS JT
JUTFMG B GVODUJPO TVDI BT JO map BCPWF
NBZ CF VTFE UP JOEJDBUF
PSEFS PG FWBMVBUJPO CVU UIF JNQMJDJU BTTPDJBUJWJUZ PG UIF GVOD
UJPO UZQF EPFT OPU NFBO UIF JOOFS PS ƶOBM TFU PG QBSFOUIFTFT
$)"15&3  5:1&4 

JF UIF SFTVMU UZQF FWBMVBUFT ƶSTU "QQMJDBUJPO JT FWBMVBUJPO


JO PUIFS XPSET UIF POMZ XBZ UP FWBMVBUF BOZUIJOH JT CZ BQQMZ
JOH GVODUJPOT BOE GVODUJPO BQQMJDBUJPO JT MFǕ BTTPDJBUJWF 4P
UIF MFǒNPTU PS PVUFSNPTU BSHVNFOUT XJMM CF FWBMVBUFE ƶSTU
BTTVNJOH BOZUIJOH HFUT FWBMVBUFE TJODF )BTLFMM JT OPOTUSJDU
ZPV DBOƊU BTTVNF UIBU BOZUIJOH XJMM CF FWBMVBUFE CVU UIJT XJMM
CF NPSF DMFBS MBUFS


1BSUJBM BQQMJDBUJPO
$VSSZJOH NBZ CF JOUFSFTUJOH CVU NBOZ QFPQMF XPOEFS XIBU
UIF QSBDUJDBM FƵFDU PS WBMVF PG DVSSZJOH JT 8FƊMM MPPL OPX BU
B TUSBUFHZ DBMMFE QBSUJBM BQQMJDBUJPO UP TFF XIBU DVSSZJOH EPFT
GPS VT *UƊT TPNFUIJOH XFƊMM FYQMPSF NPSF BT XF HP UISPVHI UIF
CPPL CVU XFƊMM TUBSU XJUI B SFMBUJWFMZ VODPNQMJDBUFE FYBNQMF

-- we use the double colon to assign a type


-- making the type concrete will eliminate
-- the typeclass constraint
addStuff :: Integer -> Integer -> Integer
addStuff a b = a + b + 5

4P addStuff BQQFBST UP UBLF UXP Integer BSHVNFOUT BOE SF


UVSO BO Integer SFTVMU #VU BǒFS MPBEJOH UIBU JO ()$J XF TFF
UIBU JU JT UBLJOH POF BSHVNFOU BOE SFUVSOJOH B GVODUJPO UIBU
UBLFT POF BSHVNFOU BOE SFUVSOT POF SFTVMU
$)"15&3  5:1&4 

Prelude> :t addStuff
addStuff :: Integer -> Integer -> Integer
Prelude> let addTen = addStuff 5
Prelude> :t addTen
addTen :: Integer -> Integer
Prelude> let fifteen = addTen 5
Prelude> fifteen
15
Prelude> addTen 15
25
Prelude> addStuff 5 5
15

)FSF fifteen JT FRVBM UP addStuff 5 5 CFDBVTF addTen JT FRVBM


UP addStuff 5 5IF BCJMJUZ UP BQQMZ POMZ TPNF PG B GVODUJPOƊT BS
HVNFOUT JT DBMMFE QBSUJBM BQQMJDBUJPO 5IJT MFUT VT SFVTF addStuff
BOE DSFBUF B OFX GVODUJPO GSPN JU XJUI POF PG UIF BSHVNFOUT
BQQMJFE
*G XF SFDBMM UIBU (->) JT B UZQF DPOTUSVDUPS BOE BTTPDJBUFT UP
UIF SJHIU UIJT CFDPNFT NPSF DMFBS

addStuff :: Integer -> Integer -> Integer

-- but with explicit parenthesization

addStuff :: Integer -> (Integer -> Integer)


$)"15&3  5:1&4 

"QQMZJOH addStuff UP POF Integer BSHVNFOU HBWF VT UIF GVOD


UJPO addTen XIJDI JT UIF SFUVSO GVODUJPO PG addStuff "QQMZJOH
addTen UP BO Integer BSHVNFOU HJWFT VT B SFUVSO WBMVF TP UIF
UZQF PG fifteen JT Integer ƈ OP NPSF GVODUJPO BSSPXT
-FUƊT DIFDL PVS VOEFSTUBOEJOH XJUI B GVODUJPO UIBU JTOƊU
DPNNVUBUJWF

subtractStuff :: Integer -> Integer -> Integer


subtractStuff x y = x - y - 10
subtractOne = subtractStuff 1

Prelude> :t subtractOne
subtractOne :: Integer -> Integer
Prelude> let result = subtractOne 11
Prelude> result
-20

8IZ EJE XF HFU UIJT SFTVMU #FDBVTF PG UIF PSEFS JO XIJDI


XF BQQMJFE BSHVNFOUT result JT FRVBM UP 1 - 11 - 10

.BOVBM DVSSZJOH BOE VODVSSZJOH


)BTLFMM JT DVSSJFE CZ EFGBVMU CVU ZPV DBO VODVSSZ GVODUJPOT
6ODVSSZJOH NFBOT VOOFTUJOH UIF GVODUJPOT BOE SFQMBDJOH UIF
UXP GVODUJPOT XJUI B UVQMF PG UXP WBMVFT UIFTF XPVME CF UIF UXP
WBMVFT ZPV XBOU UP VTF BT BSHVNFOUT
 *G ZPV VODVSSZ (+) UIF
UZQF DIBOHFT GSPN Num a => a -> a -> a UP Num a => (a, a) -> a
$)"15&3  5:1&4 

XIJDI CFUUFS ƶUT UIF EFTDSJQUJPO ƌUBLFT UXP BSHVNFOUT SFUVSOT


POF SFTVMUƍ UIBO DVSSJFE GVODUJPOT 4PNF PMEFS GVODUJPOBM
MBOHVBHFT EFGBVMU UP VTJOH B QSPEVDU UZQF MJLF UVQMFT UP FYQSFTT
NVMUJQMF BSHVNFOUT

Ƒ 6ODVSSJFE GVODUJPOT 0OF GVODUJPO NBOZ BSHVNFOUT

Ƒ $VSSJFE GVODUJPOT .BOZ GVODUJPOT POF BSHVNFOU BQJFDF

:PV DBO BMTP EFTVHBS UIF BVUPNBUJD DVSSZJOH ZPVSTFMG CZ


OFTUJOH UIF BSHVNFOUT XJUI MBNCEBT UIPVHI UIFSFƊT BMNPTU
OFWFS B SFBTPO UP EP TP
8FƊMM VTF BOPOZNPVT MBNCEB TZOUBY IFSF UP TIPX ZPV TPNF
FYBNQMFT PG VODVSSZJOH :PV NBZ XBOU UP SFWJFX BOPOZNPVT
MBNCEB TZOUBY PS USZ DPNQBSJOH UIFTF GVODUJPOT EJSFDUMZ BOE
UIJOLJOH PG UIF CBDLTMBTI BT B MBNCEB

nonsense :: Bool -> Integer


nonsense True = 805
nonsense False = 31337

curriedFunction :: Integer
-> Bool
-> Integer
curriedFunction i b =
i + (nonsense b)
$)"15&3  5:1&4 

uncurriedFunction :: (Integer, Bool)


-> Integer
uncurriedFunction (i, b) =
i + (nonsense b)

anonymous :: Integer -> Bool -> Integer


anonymous = \i b -> i + (nonsense b)

anonNested :: Integer
-> Bool
-> Integer
anonNested =
\i -> \b -> i + (nonsense b)

5IFO XIFO XF UFTU UIF GVODUJPOT GSPN UIF 3&1-

Prelude> curriedFunction 10 False


31347
Prelude> anonymous 10 False
31347
Prelude> anonNested 10 False
31347

5IFZ BSF BMM UIF TBNF GVODUJPO BMM HJWJOH UIF TBNF SFTVMUT
*O anonNested XF NBOVBMMZ OFTUFE UIF BOPOZNPVT MBNCEBT UP
HFU B GVODUJPO UIBU XBT TFNBOUJDBMMZ JEFOUJDBM UP curriedFunction
$)"15&3  5:1&4 

CVU EJEOƊU MFWFSBHF UIF BVUPNBUJD DVSSZJOH 5IJT NFBOT GVOD


UJPOT UIBU TFFN UP BDDFQU NVMUJQMF BSHVNFOUT TVDI BT XJUI a ->
a -> a -> a BSF IJHIFSPSEFS GVODUJPOT UIFZ ZJFME NPSF GVODUJPO
WBMVFT BT FBDI BSHVNFOU JT BQQMJFE VOUJM UIFSF BSF OP NPSF (->)
UZQF DPOTUSVDUPST BOE JU UFSNJOBUFT JO B OPOGVODUJPO WBMVF

$VSSZJOH BOE VODVSSZJOH FYJTUJOH GVODUJPOT


*U UVSOT PVU XF DBO DVSSZ BOE VODVSSZ GVODUJPOT XJUI NVMUJQMF
QBSBNFUFST HFOFSJDBMMZ XJUIPVU XSJUJOH OFX DPEF GPS FBDI POF
$POTJEFS UIF GPMMPXJOH FYBNQMF GPS DVSSZJOH

Prelude> let curry f a b = f (a, b)


Prelude> :t curry
curry :: ((t1, t2) -> t) -> t1 -> t2 -> t
Prelude> :t fst
fst :: (a, b) -> a
Prelude> :t curry fst
curry fst :: t -> b -> t
Prelude> fst (1, 2)
1
Prelude> curry fst 1 2
1

5IFO GPS VODVSSZJOH

Prelude> let uncurry f (a, b) = f a b


$)"15&3  5:1&4 

Prelude> :t uncurry
uncurry :: (t1 -> t2 -> t) -> (t1, t2) -> t
Prelude> :t (+)
(+) :: Num a => a -> a -> a
Prelude> (+) 1 2
3
Prelude> uncurry (+) (1, 2)
3

$VSSZJOH BOE VODVSSZJOH GVODUJPOT PG UISFF PS NPSF BSHV


NFOUT BVUPNBUJDBMMZ JT RVJUF QPTTJCMF CVU USJDLJFS 8FƊMM MFBWF
UIBU CF CVU JOWFTUJHBUF PO ZPVS PXO JG ZPV MJLF

4FDUJPOJOH
8F NFOUJPOFE TFDUJPOJOH JO $IBQUFS  BOE OPX UIBU XFƊWF
UBMLFE B CJU NPSF BCPVU DVSSZJOH BOE QBSUJBM BQQMJDBUJPO JU
TIPVME CF NPSF DMFBS XIBUƊT IBQQFOJOH UIFSF 5IF UFSN TFDUJPO
JOH TQFDJƶDBMMZ SFGFST UP QBSUJBM BQQMJDBUJPO PG JOƶY PQFSBUPST
XIJDI IBT B TQFDJBM TZOUBY BOE BMMPXT ZPV UP DIPPTF XIFUIFS
UIF BSHVNFOU ZPVƊSF QBSUJBMMZ BQQMZJOH UIF PQFSBUPS UP JT UIF
ƶSTU PS TFDPOE BSHVNFOU

Prelude> let x = 5
Prelude> let y = (2^)
Prelude> let z = (^2)
Prelude> y x
$)"15&3  5:1&4 

32
Prelude> z x
25

8JUI DPNNVUBUJWF GVODUJPOT TVDI BT BEEJUJPO UIF BSHV


NFOU PSEFS EPFT OPU NBUUFS 8F XJMM VTVBMMZ TFDUJPO BEEJUJPO
BT GPS FYBNQMF (+3) CVU MBUFS XIFO XF TUBSU VTJOH QBSUJBMMZ
BQQMJFE GVODUJPOT B MPU XJUI NBQT BOE GPMET BOE TP GPSUI ZPVƊMM
CF BCMF UP TFF UIF EJƵFSFODF UIBU UIF BSHVNFOU PSEFS DBO NBLF
XJUI OPODPNNVUBUJWF PQFSBUPST
5IJT EPFT OPU POMZ XPSL XJUI BSJUINFUJD UIPVHI

Prelude> let celebrate = (++ " woot!")


Prelude> celebrate "naptime"
"naptime woot!"
Prelude> celebrate "dogs"
"dogs woot!"

:PV DBO BMTP VTF UIF TZOUBY XJUI GVODUJPOT UIBU BSF OPSNBMMZ
QSFƶY JG ZPV VTF UIF CBDLUJDLT UP NBLF UIFN JOƶY OPUF UIF
.. JT B TIPSUIBOE GPS DPOTUSVDUJOH B MJTU PG BMM UIF FMFNFOUT
CFUXFFO UIF ƶSTU BOE MBTU WBMVFT HJWFO ƈ HP BIFBE BOE QMBZ
XJUI UIJT JO ZPVS 3&1-


Prelude> elem 9 [1..10]


True
Prelude> 9 `elem` [1..10]
$)"15&3  5:1&4 

True
Prelude> let c = (`elem` [1..10])
Prelude> c 9
True
Prelude> c 25
False

*G ZPV QBSUJBMMZ BQQMJFE elem JO JUT VTVBM QSFƶY GPSN UIFO


UIF BSHVNFOU ZPV BQQMZ JU UP XPVME OFDFTTBSJMZ CF UIF ƶSTU
BSHVNFOU

Prelude> let hasTen = elem 10


Prelude> hasTen [1..9]
False
Prelude> hasTen [5..15]
True

1BSUJBM BQQMJDBUJPO JT DPNNPO FOPVHI JO )BTLFMM UIBU PWFS


UJNF ZPVƊMM EFWFMPQ BO JOUVJUJPO GPS JU 5IF TFDUJPOJOH TZOUBY
FYJTUT UP BMMPX TPNF GSFFEPN JO XIJDI BSHVNFOU PG B CJOBSZ
PQFSBUPS ZPV BQQMZ UIF GVODUJPO UP

&YFSDJTFT 5ZQF "SHVNFOUT


(JWFO B GVODUJPO BOE JUT UZQF UFMM VT XIBU UZQF SFTVMUT GSPN
BQQMZJOH TPNF PS BMM PG UIF BSHVNFOUT
:PV DBO DIFDL ZPVS XPSL JO UIF 3&1- MJLF UIJT VTJOH UIF
ƶSTU RVFTUJPO BT BO FYBNQMF

$)"15&3  5:1&4 

Prelude> let f :: a -> a -> a -> a; f = undefined


Prelude> let x :: Char; x = undefined
Prelude> :t f x

*U UVSOT PVU UIBU ZPV DBO DIFDL UIF UZQFT PG UIJOHT UIBU BSFOƊU
SFBMMZ JNQMFNFOUFE ZFU TP MPOH BT ZPV HJWF ()$J BO VOEFƶOFE
UP CJOE UIF TJHOBUVSF UP

 *G UIF UZQF PG f JT a -> a -> a -> a BOE UIF UZQF PG ԧ JT Char


UIFO UIF UZQF PG f x JT

B
Char -> Char -> Char
C
x -> x -> x -> x
D
a -> a -> a
E
a -> a -> a -> Char

 *G UIF UZQF PG g JT a -> b -> c -> b UIFO UIF UZQF PG


g 0 'c' "woot" JT

B
String
C
Char -> String
D
Int
E
Char

 *G UIF UZQF PG h JT (Num a, Num b) => a -> b -> b UIFO UIF


UZQF PG
h 1.0 2 JT
$)"15&3  5:1&4 

B
Double
C
Integer
D
Integral b => b
E
Num b => b

/PUF UIBU CFDBVTF UIF UZQF WBSJBCMFT Ԑ BOE ԑ BSF EJƵFSFOU


UIF DPNQJMFS NVTU BTTVNF UIBU UIF UZQFT DPVME CF EJƵFSFOU

 *G UIF UZQF PG h JT (Num a, Num b) => a -> b -> b UIFO UIF


UZQF PG
h 1 (5.5 :: Double) JT

B
Integer
C
Fractional b => b
D
Double
E
Num b => b

 *G UIF UZQF PG jackal JT (Ord a, Eq b) => a -> b -> a UIFO


UIF UZQF PG
jackal "keyboard" "has the word jackal in it"

B
[Char]
C
Eq b => b
D
b -> [Char]
E
b
$)"15&3  5:1&4 

F
Eq b => b -> [Char]

 *G UIF UZQF PG jackal JT (Ord a, Eq b) => a -> b -> a UIFO


UIF UZQF PG
jackal "keyboard"

B
b
C
Eq b => b
D
[Char]
E
b -> [Char]
F
Eq b => b -> [Char]

 *G UIF UZQF PG kessel JT (Ord a, Num b) => a -> b -> a UIFO


UIF UZQF PG
kessel 1 2 JT

B
Integer
C
Int
D
a
E
(Num a, Ord a) => a
F
Ord a => a
G
Num a => a

 *G UIF UZQF PG kessel JT (Ord a, Num b) => a -> b -> a UIFO


UIF UZQF PG
kessel 1 (2 :: Integer) JT
$)"15&3  5:1&4 

B
(Num a, Ord a) => a
C
Int
D
a
E
Num a => a
F
Ord a => a
G
Integer

 *G UIF UZQF PG kessel JT (Ord a, Num b) => a -> b -> a UIFO


UIF UZQF PG
kessel (1 :: Integer) 2 JT

B
Num a => a
C
Ord a => a
D
Integer
E
(Num a, Ord a) => a
F
a

 1PMZNPSQIJTN
1PMZNPSQI JT B XPSE PG SFMBUJWFMZ SFDFOU QSPWFOBODF *U XBT
JOWFOUFE JO UIF FBSMZ UI DFOUVSZ GSPN UIF (SFFL XPSET QPMZ
GPS ƌNBOZƍ BOE NPSQI GPS ƌGPSNƍ 5IF JD TVƸY JO QPMZNPSQIJD
NFBOT ƌNBEF PGƍ 4P ƉQPMZNPSQIJDƊ NFBOT ƌNBEF PG NBOZ
GPSNTƍ *O QSPHSBNNJOH UIJT JT VOEFSTUPPE UP CF JO DPOUSBTU
XJUI NPOPNPSQIJD ƌNBEF PG POF GPSNƍ
$)"15&3  5:1&4 

1PMZNPSQIJD UZQF WBSJBCMFT HJWF VT UIF BCJMJUZ UP JNQMFNFOU


FYQSFTTJPOT UIBU DBO BDDFQU BSHVNFOUT BOE SFUVSO SFTVMUT PG
EJƵFSFOU UZQFT XJUIPVU IBWJOH UP XSJUF WBSJBUJPOT PO UIF TBNF
FYQSFTTJPO GPS FBDI UZQF *U XPVME CF JOFƸDJFOU JG ZPV XFSF
EPJOH BSJUINFUJD BOE IBE UP XSJUF UIF TBNF DPEF PWFS BOE
PWFS GPS EJƵFSFOU OVNFSJD UZQFT 5IF HPPE OFXT JT UIF OV
NFSJDBM GVODUJPOT UIBU DPNF XJUI ZPVS ()$ JOTUBMMBUJPO BOE
UIF Prelude BSF QPMZNPSQIJD CZ EFGBVMU #SPBEMZ TQFBLJOH
UZQF TJHOBUVSFT NBZ IBWF UISFF LJOET PG UZQFT DPODSFUF DPO
TUSBJOFE QPMZNPSQIJD PS QBSBNFUSJDBMMZ QPMZNPSQIJD
*O )BTLFMM QPMZNPSQIJTN EJWJEFT JOUP UXP DBUFHPSJFT QBSB
NFUSJD QPMZNPSQIJTN BOE DPOTUSBJOFE QPMZNPSQIJTN *G ZPVƊWF
FODPVOUFSFE QPMZNPSQIJTN CFGPSF JU XBT QSPCBCMZ B GPSN
PG DPOTUSBJOFE PǒFO DBMMFE BEIPD QPMZNPSQIJTN "EIPD
QPMZNPSQIJTN JO )BTLFMM JT JNQMFNFOUFE XJUI UZQFDMBTTFT
1BSBNFUSJD QPMZNPSQIJTN JT CSPBEFS UIBO BEIPD QPMZNPS
QIJTN 1BSBNFUSJD QPMZNPSQIJTN SFGFST UP UZQF WBSJBCMFT PS
QBSBNFUFST UIBU BSF GVMMZ QPMZNPSQIJD 8IFO VODPOTUSBJOFE
CZ B UZQFDMBTT UIFJS ƶOBM DPODSFUF UZQF DPVME CF BOZUIJOH
$POTUSBJOFE QPMZNPSQIJTN PO UIF PUIFS IBOE QVUT UZQFDMBTT
DPOTUSBJOUT PO UIF WBSJBCMF EFDSFBTJOH UIF OVNCFS PG DPODSFUF
UZQFT JU DPVME CF CVU JODSFBTJOH XIBU ZPV DBO BDUVBMMZ EP XJUI
JU CZ EFƶOJOH BOE CSJOHJOH JOUP TDPQF B TFU PG PQFSBUJPOT
3FDBMM UIBU XIFO ZPV TFF B MPXFSDBTF OBNF JO B UZQF TJH

8BEMFSƊT QBQFS PO NBLJOH "EIPD QPMZNPSQIJTN MFTT BEIPD http://people.csail.
mit.edu/dnj/teaching/6898/papers/wadler88.pdf
$)"15&3  5:1&4 

OBUVSF JU JT B UZQF WBSJBCMF BOE QPMZNPSQIJD MJLF Ԑ ԣ FUD


 *G
UIF UZQF JT DBQJUBMJ[FE JU JT B TQFDJƶD DPODSFUF UZQF TVDI BT Int
Bool FUD
-FUƊT DPOTJEFS B QBSBNFUSJDBMMZ QPMZNPSQIJD GVODUJPO JEFO
UJUZ 5IF id GVODUJPO DPNFT XJUI UIF )BTLFMM 1SFMVEF BOE JT
DBMMFE UIF JEFOUJUZ GVODUJPO CFDBVTF JU JT UIF JEFOUJUZ GPS BOZ
WBMVF JO PVS MBOHVBHF *O UIF OFYU FYBNQMF UIF UZQF WBSJBCMF
ƉBƊ JT QBSBNFUSJDBMMZ QPMZNPSQIJD BOE OPU DPOTUSBJOFE CZ B
UZQFDMBTT 1BTTJOH BOZ WBMVF UP id XJMM SFUVSO UIF TBNF WBMVF

id :: a -> a
-- For all 'a', get an argument of some type 'a',
-- return value of same type 'a'

5IJT JT UIF NBYJNBMMZ QPMZNPSQIJD TJHOBUVSF GPS id *U


BMMPXT UIJT GVODUJPO UP XPSL XJUI BOZ UZQF PG EBUB

Prelude> id 1
1
Prelude> id "blah"
"blah"
Prelude> let inc = (+1)
Prelude> inc 2
3
Prelude> (id inc) 2
3
$)"15&3  5:1&4 

#BTFE PO UIF UZQF PG id XF BSF HVBSBOUFFE UIJT CFIBWJPS ƈ


JU DBOOPU EP BOZUIJOH FMTF 5IF Ԑ JO UIF UZQF TJHOBUVSF DBOOPU
DIBOHF CFDBVTF UIF UZQF WBSJBCMF HFUT ƶYFE UP B DPODSFUF UZQF
UISPVHIPVU UIF FOUJSF UZQF TJHOBUVSF B  B
 *G POF BQQMJFT
id UP B WBMVF PG UZQF Int UIF Ԑ JT ƶYFE UP UZQF Int #Z EFGBVMU
UZQF WBSJBCMFT BSF SFTPMWFE BU UIF MFǒNPTU QBSU PG UIF UZQF
TJHOBUVSF BOE BSF ƶYFE PODF TVƸDJFOU JOGPSNBUJPO UP CJOE
UIFN UP B DPODSFUF UZQF JT BWBJMBCMF
5IF BSHVNFOUT JO QBSBNFUSJDBMMZ QPMZNPSQIJD GVODUJPOT
MJLF id DPVME CF BOZUIJOH BOZ UZQF PS UZQFDMBTT TP UIF UFSNT
PG UIF GVODUJPO BSF NPSF SFTUSJDUFE CFDBVTF UIFSF BSF OP NFUI
PET PS JOGPSNBUJPO BUUBDIFE UP UIFN 8JUI UIF UZQF id :: a
-> a JU DBO EP OPUIJOH PUIFS UIBO SFUVSO Ԑ CFDBVTF UIFSF JT
OP JOGPSNBUJPO PS NFUIPE BUUBDIFE UP JUT QBSBNFUFS BU BMM ƈ
OPUIJOH DBO CF EPOF XJUI Ԑ 0O UIF PUIFS IBOE B GVODUJPO MJLF
negate XJUI B TJNJMBSBQQFBSJOH UZQF TJHOBUVSF PG Num a => a
-> a DPOTUSBJOT UIF Ԑ WBSJBCMF BT BO JOTUBODF PG UIF Num UZQFDMBTT
/PX Ԑ IBT GFXFS DPODSFUF UZQFT JU DPVME CF CVU UIFSF JT B TFU PG
NFUIPET ZPV DBO VTF B TFU PG UIJOHT UIBU DBO CF EPOF XJUI Ԑ
*G B WBSJBCMF SFQSFTFOUT B TFU PG QPTTJCMF WBMVFT UIFO B UZQF
WBSJBCMF SFQSFTFOUT B TFU PG QPTTJCMF UZQFT 8IFO UIFSF JT OP
UZQFDMBTT DPOTUSBJOU UIF TFU PG QPTTJCMF UZQFT B WBSJBCMF DPVME
SFQSFTFOU JT FƵFDUJWFMZ VOMJNJUFE 5ZQFDMBTT DPOTUSBJOUT MJNJU
UIF TFU PG QPUFOUJBM UZQFT BOE UIVT QPUFOUJBM WBMVFT
XIJMF
BMTP QBTTJOH BMPOH UIF DPNNPO GVODUJPOT UIBU DBO CF VTFE
XJUI UIPTF WBMVFT
$)"15&3  5:1&4 

$PODSFUF UZQFT IBWF FWFO NPSF ƷFYJCJMJUZ JO UFSNT PG DPN


QVUBUJPO 5IJT IBT UP EP XJUI UIF BEEJUJWF OBUVSF PG UZQFDMBTTFT
'PS FYBNQMF BO Int JT POMZ BO Int CVU JU DBO NBLF VTF PG UIF
NFUIPET PG UIF Num BOE Integral UZQFDMBTTFT CFDBVTF JU IBT JO
TUBODFT PG CPUI 8F DBO EFTDSJCF Num BT B TVQFSDMBTT PG TFWFSBM
PUIFS OVNFSJD UZQFDMBTTFT UIBU BMM JOIFSJU PQFSBUJPOT GSPN Num

*O TVN JG B WBSJBCMF DPVME CF BOZUIJOH UIFO UIFSFƊT MJUUMF


UIBU DBO CF EPOF UP JU CFDBVTF JU IBT OP NFUIPET *G JU DBO CF
TPNF UZQFT TBZ B UZQF UIBU JT BO JOTUBODF PG Num
UIFO JU IBT
TPNF NFUIPET *G JU JT B DPODSFUF UZQF ZPV MPTF UIF UZQF ƷFYJ
CJMJUZ CVU EVF UP UIF BEEJUJWF OBUVSF PG UZQFDMBTT JOIFSJUBODF
HBJO NPSF QPUFOUJBM NFUIPET *UƊT JNQPSUBOU UP OPUF UIBU UIJT
JOIFSJUBODF FYUFOET EPXOXBSE GSPN B TVQFSDMBTT TVDI BT Num
UP TVCDMBTTFT TVDI BT Integral BOE UIFO Int CVU OPU UIF PUIFS
XBZ BSPVOE 5IBU JT JG TPNFUIJOH JT BO JOTUBODF PG Num CVU OPU
BO JOTUBODF PG Integral JU DBOƊU JNQMFNFOU UIF NFUIPET PG UIF
Integral UZQFDMBTT " TVCDMBTT DBOOPU PWFSSJEF UIF NFUIPET PG
JUT TVQFSDMBTT
" GVODUJPO JT QPMZNPSQIJD XIFO JUT UZQF TJHOBUVSF IBT WBSJ
BCMFT UIBU DBO SFQSFTFOU NPSF UIBO POF UZQF 5IBU JT JUT QBSBN
FUFST BSF QPMZNPSQIJD 1BSBNFUSJD QPMZNPSQIJTN SFGFST UP
GVMMZ QPMZNPSQIJD VODPOTUSBJOFE CZ B UZQFDMBTT
QBSBNFUFST
1BSBNFUSJDJUZ JT UIF QSPQFSUZ XF HFU GSPN IBWJOH QBSBNFUSJD
QPMZNPSQIJTN 1BSBNFUSJDJUZ NFBOT UIBU UIF CFIBWJPS PG B
GVODUJPO XJUI SFTQFDU UP UIF UZQFT PG JUT QBSBNFUSJDBMMZ QPMZ
$)"15&3  5:1&4 

NPSQIJD
BSHVNFOUT JT VOJGPSN 5IF CFIBWJPS DBO OPU DIBOHF
KVTU CFDBVTF JU XBT BQQMJFE UP BO BSHVNFOU PG B EJƵFSFOU UZQF

&YFSDJTFT 1BSBNFUSJDJUZ
"MM ZPV DBO SFBMMZ EP XJUI B QBSBNFUSJDBMMZ QPMZNPSQIJD WBMVF
JT QBTT PS OPU QBTT JU UP TPNF PUIFS FYQSFTTJPO 1SPWF UIBU UP
ZPVSTFMG XJUI UIFTF TNBMM EFNPOTUSBUJPOT

 (JWFO UIF UZQF a -> a XIJDI JT UIF UZQF GPS id BUUFNQU


UP NBLF B GVODUJPO UIBU JT OPU CPUUPN BOE UFSNJOBUFT
TVDDFTTGVMMZ UIBU EPFT TPNFUIJOH PUIFS UIBO SFUVSOJOH
UIF TBNF WBMVF 5IJT JT JNQPTTJCMF CVU ZPV TIPVME USZ JU
BOZXBZ

 8F DBO HFU B NPSF DPNGPSUBCMF BQQSFDJBUJPO PG QBSB


NFUSJDJUZ CZ MPPLJOH BU a -> a -> a 5IJT IZQPUIFUJDBM
GVODUJPO a -> a -> a IBT UXPƇBOE POMZ UXPƇJNQMFNFOUB
UJPOT 8SJUF CPUI QPTTJCMF WFSTJPOT PG a -> a -> a "ǒFS
EPJOH TP USZ UP WJPMBUF UIF DPOTUSBJOUT PG QBSBNFUSJDBMMZ
QPMZNPSQIJD WBMVFT XF PVUMJOFE BCPWF

 *NQMFNFOU a -> b -> b )PX NBOZ JNQMFNFOUBUJPOT DBO


JU IBWF %PFT UIF CFIBWJPS DIBOHF XIFO UIF UZQFT PG Ԑ
BOE ԑ DIBOHF
$)"15&3  5:1&4 

1PMZNPSQIJD DPOTUBOUT
8FƊWF TFFO UIBU UIFSF BSF TFWFSBM UZQFT PG OVNCFST JO )BTLFMM
BOE UIBU UIFSF BSF SFTUSJDUJPOT PO VTJOH EJƵFSFOU UZQFT PG OVN
CFST JO EJƵFSFOU GVODUJPOT #VU JOUVJUJWFMZ XF TFF JU XPVME CF
PEE JG XF DPVME OPU EP BSJUINFUJD BMPOH UIF MJOFT PG -10 + 6.3
8FMM MFUƊT USZ JU

Prelude> (-10) + 6.3


-3.7

5IBU XPSLT KVTU ƶOF 8IZ -FUƊT MPPL BU UIF UZQFT BOE TFF JG
XF DBO ƶOE PVU

Prelude> :t (-10) + 6.3


(-10) + 6.3 :: Fractional a => a
Prelude> :t (-10)
(-10) :: Num a => a

/VNFSJD MJUFSBMT MJLF 


BOE  BSF QPMZNPSQIJD BOE TUBZ
TP VOUJM HJWFO B NPSF TQFDJƶD UZQF 5IF Num a => PS Fractional
a => JT B UZQFDMBTT DPOTUSBJOU BOE UIF Ԑ JT UIF UZQF WBSJBCMF
JO TDPQF *O UIF UZQF GPS UIF FOUJSF FRVBUJPO XF TFF UIBU UIF
DPNQJMFS JOGFSSFE UIBU JU XBT XPSLJOH XJUI Fractional OVNCFST
*U IBE UP UP BDDPNNPEBUF UIF GSBDUJPOBM OVNCFS  'JOF
CVU XIBU BCPVU 
8F TFF UIBU UIF UZQF PG 
JT HJWFO
NBYJNVN QPMZNPSQIJTN CZ POMZ CFJOH BO JOTUBODF PG UIF
$)"15&3  5:1&4 

Num UZQFDMBTT XIJDI DPVME CF BOZ UZQF PG OVNCFS 8F DBMM


UIJT B QPMZNPSQIJD DPOTUBOU 
JT OPU B WBSJBCMF PG DPVSTF
CVU UIF UZQF UIBU JU JOTUBOUJBUFT DPVME CF BOZ OVNFSJD UZQF TP
JUT VOEFSMZJOH SFQSFTFOUBUJPO JT QPMZNPSQIJD *U XJMM IBWF UP
SFTPMWF JOUP B DPODSFUF UZQF BU TPNF QPJOU JO PSEFS UP FWBMVBUF

8F DBO GPSDF UIF DPNQJMFS UP CF NPSF TQFDJƶD BCPVU UIF


UZQFT PG OVNCFST CZ EFDMBSJOH UIF UZQF

Prelude> let x = 5 + 5
Prelude> :t x
x :: Num a => a
Prelude> let x = 5 + 5 :: Int
Prelude> :t x
x :: Int

*O UIF ƶSTU FYBNQMF XF EJE OPU TQFDJGZ B UZQF GPS UIF OVN
CFST TP UIF UZQF TJHOBUVSF EFGBVMUFE UP UIF CSPBEFTU JOUFSQSF
UBUJPO CVU JO UIF TFDPOE WFSTJPO XF UPME UIF DPNQJMFS UP VTF
UIF Int UZQF

8PSLJOH BSPVOE DPOTUSBJOUT


1SFWJPVTMZ XFƊWF MPPLFE BU B GVODUJPO DBMMFE length UIBU UBLFT
B MJTU BOE DPVOUT UIF OVNCFS PG NFNCFST BOE SFUVSOT UIBU
OVNCFS BT BO Int WBMVF 8F TBX JO UIF MBTU DIBQUFS UIBU CFDBVTF
Int JT OPU B Fractional OVNCFS UIJT GVODUJPO XPOƊU XPSL
$)"15&3  5:1&4 

Prelude> 6 / length [1, 2, 3]

No instance for (Fractional Int) arising


from a use of ‘/’

In the expression: 6 / length [1, 2, 3]


In an equation for ‘it’: it = 6 / length [1, 2, 3]

)FSF UIF QSPCMFN JT length JTOƊU QPMZNPSQIJD FOPVHI Fractional


JODMVEFT TFWFSBM UZQFT PG OVNCFST CVU Int JTOƊU POF PG UIFN
BOE UIBUƊT BMM length DBO SFUVSO )BTLFMM EPFT PƵFS XBZT UP
XPSL BSPVOE UIJT UZQF PG DPOƷJDU UIPVHI *O UIJT DBTF XF XJMM
VTF B GVODUJPO DBMMFE fromIntegral UIBU UBLFT BO JOUFHSBM WBMVF
BOE GPSDFT JU UP JNQMFNFOU UIF /VN UZQFDMBTT SFOEFSJOH JU
QPMZNPSQIJD )FSFƊT XIBU UIF UZQF TJHOBUVSF MPPLT MJLF

Prelude> :type fromIntegral


fromIntegral :: (Num b, Integral a) => a -> b

4P JU UBLFT B WBMVF Ԑ PG BO Integral UZQF BOE SFUVSOT JU BT


B WBMVF ԑ PG BOZ Num UZQF -FUƊT TFF IPX UIBU XPSLT XJUI PVS
GSBDUJPOBM EJWJTJPO QSPCMFN

Prelude> 6 / fromIntegral (length [1, 2, 3])


2.0

"OE OPX BMM JT SJHIU XJUI UIF XPSME PODF BHBJO


$)"15&3  5:1&4 

 5ZQF JOGFSFODF


)BTLFMM EPFT OPU PCMJHBUF VT UP BTTFSU B UZQF GPS FWFSZ FYQSFT
TJPO PS WBMVF JO PVS QSPHSBNT CFDBVTF JU IBT UZQF JOGFSFODF
5ZQF JOGFSFODF JT BO BMHPSJUIN GPS EFUFSNJOJOH UIF UZQFT PG
FYQSFTTJPOT )BTLFMMƊT UZQF JOGFSFODF JT CVJMU PO BO FYUFOEFE
WFSTJPO PG UIF %BNBT)JOEMFZ.JMOFS UZQF TZTUFN
)BTLFMM XJMM JOGFS UIF NPTU HFOFSBMMZ BQQMJDBCMF QPMZNPS
QIJD
UZQF UIBU JT TUJMM DPSSFDU &TTFOUJBMMZ UIF DPNQJMFS TUBSUT
GSPN UIF WBMVFT XIPTF UZQFT JU LOPXT BOE UIFO XPSLT PVU UIF
UZQFT PG UIF PUIFS WBMVFT "T ZPV NBUVSF BT B )BTLFMM QSP
HSBNNFS ZPVƊMM ƶOE UIJT JT QSJODJQBMMZ VTFGVM GPS XIFO ZPVƊSF
TUJMM ƶHVSJOH PVU OFX DPEF SBUIFS UIBO GPS DPEF UIBU JT ƌEPOFƍ
0ODF ZPVS QSPHSBN JT ƌEPOF ƍ ZPV XJMM DFSUBJOMZ LOPX UIF
UZQFT PG BMM UIF GVODUJPOT BOE JUƊT DPOTJEFSFE HPPE QSBDUJDF
UP FYQMJDJUMZ EFDMBSF UIFN 3FNFNCFS XIFO XF TVHHFTUFE
UIBU B HPPE UZQF TZTUFN XBT MJLF B QMFBTBOU DPOWFSTBUJPO XJUI
B DPMMFBHVF 5IJOL PG UZQF JOGFSFODF BT B IFMQGVM DPMMFBHVF
XPSLJOH UISPVHI B QSPCMFN XJUI ZPV
'PS FYBNQMF XF DBO XSJUF id PVSTFMWFT

Prelude> let ourId x = x


Prelude> :t ourId
ourId :: t -> t
Prelude> ourId 1
1
$)"15&3  5:1&4 

Prelude> ourId "blah"


"blah"

)FSF XF MFU ()$J JOGFS UIF UZQF PG ourId JUTFMG %VF UP BMQIB
FRVJWBMFODF UIF EJƵFSFODF JO MFUUFST ԣ IFSF WFSTVT Ԑ BCPWF

NBLFT OP EJƵFSFODF 5ZQF WBSJBCMFT IBWF OP NFBOJOH PVUTJEF


PG UIF UZQF TJHOBUVSFT XIFSF UIFZ BSF CPVOE
'PS UIJT GVODUJPO XF BHBJO BTL UIF DPNQJMFS UP JOGFS UIF
UZQF

Prelude> let myGreet x = x ++ " Julie"


Prelude> myGreet "hello"
"hello Julie"
Prelude> :type myGreet
myGreet :: [Char] -> [Char]

5IF DPNQJMFS LOPXT UIF GVODUJPO (++) BOE IBT POF WBMVF UP
XPSL XJUI BMSFBEZ UIBU JU LOPXT JT B String *U EPFTOƊU IBWF UP
XPSL WFSZ IBSE UP JOGFS B UZQF TJHOBUVSF GSPN UIBU JOGPSNBUJPO
*G IPXFWFS XF UBLF PVU UIF TUSJOH WBMVF BOE SFQMBDF JU XJUI
BOPUIFS WBSJBCMF TFF XIBU IBQQFOT

Prelude> let myGreet x y = x ++ y


Prelude> :type myGreet
myGreet :: [a] -> [a] -> [a]

8FƊSF CBDL UP B QPMZNPSQIJD UZQF TJHOBUVSF UIF TBNF TJH


OBUVSF GPS (++) JUTFMG CFDBVTF UIF DPNQJMFS IBT OP JOGPSNBUJPO
$)"15&3  5:1&4 

CZ XIJDI UP JOGFS UIF UZQFT GPS BOZ PG UIPTF WBSJBCMFT PUIFS


UIBO UIBU UIFZ BSF MJTUT PG TPNF TPSU

-FUƊT TFF UZQF JOGFSFODF BU XPSL 0QFO ZPVS FEJUPS PG DIPJDF
BOE FOUFS UIF GPMMPXJOH TOJQQFU

-- typeInference1.hs
module TypeInference1 where

f :: Num a => a -> a -> a


f x y = x + y + 3

5IFO MPBE UIF DPEF JOUP ()$J UP FYQFSJNFOU

Prelude> :l typeInference1.hs
[1 of 1] Compiling TypeInference1
Ok, modules loaded: TypeInference1.
Prelude> f 1 2
6
Prelude> :t f
f :: Num a => a -> a -> a
Prelude> :t f 1
f 1 :: Num a => a -> a

#FDBVTF UIF OVNFSJD MJUFSBMT JO )BTLFMM IBWF UIF UZQFDMBTT


DPOTUSBJOFE
QPMZNPSQIJD UZQF Num a => a XF EPOƊU HFU B NPSF
TQFDJƶD UZQF XIFO BQQMZJOH ԕ UP 
$)"15&3  5:1&4 

-PPL BU XIBU IBQQFOT XIFO XF FMJEF UIF FYQMJDJU UZQF TJH


OBUVSF GPS ԕ

-- typeInference2.hs
module TypeInference2 where

f x y = x + y + 3

/P UZQF TJHOBUVSF GPS ԕ TP EPFT JU DPNQJMF %PFT JU XPSL

Prelude> :l typeInference2.hs
[1 of 1] Compiling TypeInference2
Ok, modules loaded: TypeInference2.
Prelude> :t f
f :: Num a => a -> a -> a
Prelude> f 1 2
6

/PUIJOH DIBOHFT *O DFSUBJO DBTFT UIFSF NJHIU CF B DIBOHF


VTVBMMZ XIFO ZPV BSF VTJOH UZQFDMBTTFT JO B XBZ UIBU EPFTOƊU
NBLF JU DMFBS XIJDI UZQF ZPV NFBO VOMFTT ZPV BTTFSU POF

&YFSDJTFT "QQMZ :PVSTFMG


-PPL BU UIFTF QBJST PG GVODUJPOT 0OF GVODUJPO JT VOBQQMJFE
TP UIF DPNQJMFS XJMM JOGFS NBYJNBMMZ QPMZNPSQIJD UZQF 5IF
TFDPOE GVODUJPO IBT CFFO BQQMJFE UP B WBMVF TP UIF JOGFSSFE
$)"15&3  5:1&4 

UZQF TJHOBUVSF NBZ IBWF CFDPNF DPODSFUF PS BU MFBTU MFTT


QPMZNPSQIJD 'JHVSF PVU IPX UIF UZQF XPVME DIBOHF BOE XIZ
NBLF B OPUF PG XIBU ZPV UIJOL UIF OFX JOGFSSFE UZQF XPVME
CF BOE UIFO DIFDL ZPVS XPSL JO ()$J

 -- Type signature of general function


(++) :: [a] -> [a] -> [a]

-- How might that change when we apply


-- it to the following value?
myConcat x = x ++ " yo"

 -- General function
(*) :: Num a => a -> a -> a

-- Applied to a value
myMult x = (x / 3) * 5

 take :: Int -> [a] -> [a]

myTake x = take x "hey you"

 (>) :: Ord a => a -> a -> Bool

myCom x = x > (length [1..10])


$)"15&3  5:1&4 

 (<) :: Ord a => a -> a -> Bool

myAlph x = x < 'z'

 "TTFSUJOH UZQFT GPS EFDMBSBUJPOT


.PTU PG UIF UJNF XF XBOU UP EFDMBSF PVS UZQFT SBUIFS UIBO
SFMZJOH PO UZQF JOGFSFODF "EEJOH UZQF TJHOBUVSFT UP ZPVS DPEF
DBO QSPWJEF HVJEBODF UP ZPV BT ZPV XSJUF ZPVS GVODUJPOT *U
DBO BMTP IFMQ UIF DPNQJMFS HJWF ZPV JOGPSNBUJPO BCPVU XIFSF
ZPVS DPEF JT HPJOH XSPOH "T QSPHSBNT CFDPNF MPOHFS BOE
NPSF DPNQMFY UZQF TJHOBUVSFT CFDPNF FWFO NPSF JNQPSUBOU
BT UIFZ IFMQ ZPV PS PUIFS QSPHSBNNFST USZJOH UP VTF ZPVS
DPEF SFBE JU BOE ƶHVSF PVU XIBU JUƊT TVQQPTFE UP EP 5IJT
TFDUJPO XJMM MPPL BU IPX UP EFDMBSF UZQFT 8F XJMM TUBSU XJUI
TPNF USJWJBM FYBNQMFT
:PV NBZ SFNFNCFS UIF triple GVODUJPO XFƊWF TFFO CFGPSF
*G XF BMMPX UIF DPNQJMFS UP JOGFS UIF UZQF XF FOE VQ XJUI UIJT

Prelude> let triple x = x * 3


Prelude> :type triple
triple :: Num a => a -> a

)FSF UIF USJQMF GVODUJPO XBT NBEF GSPN UIF (*) GVODUJPO
XIJDI IBT UZQF (*) :: Num a => a -> a -> a CVU XF IBWF BM
SFBEZ BQQMJFE POF PG UIF BSHVNFOUT XIJDI JT UIF  TP UIFSF JT
$)"15&3  5:1&4 

POF MFTT QBSBNFUFS JO UIJT UZQF TJHOBUVSF *U JT TUJMM QPMZNPS


QIJD CFDBVTF JU DBOƊU UFMM XIBU UZQF  JT ZFU *G IPXFWFS XF
XBOU UP FOTVSF UIBU PVS JOQVUT BOE SFTVMU NBZ POMZ CF JOUFHFST
UIJT JT IPX XF EFDMBSF UIBU

Prelude> let triple x = x * 3 :: Integer


Prelude> :t triple
triple :: Integer -> Integer

-- Note the typeclass constraint is gone


-- because Integer implements Num
-- so that constraint is redundant.

)FSFƊT BOPUIFS FYBNQMF PG B UZQF EFDMBSBUJPO GPS PVS triple


GVODUJPO UIJT POF NPSF MJLF XIBU ZPV XPVME TFF JO B TPVSDF
ƶMF

-- declaration of triple's type


triple :: Integer -> Integer

-- declaration of the function


triple x = x * 3

5IJT JT IPX NPTU )BTLFMM DPEF ZPV MPPL BU XJMM CF MBJE PVU
XJUI TFQBSBUF UPQMFWFM EFDMBSBUJPOT GPS UZQFT BOE GVODUJPOT
4VDI UPQMFWFM EFDMBSBUJPOT BSF JO TDPQF UISPVHIPVU UIF NPE
VMF
$)"15&3  5:1&4 

*U JT QPTTJCMF UIPVHI VODPNNPO UP EFDMBSF UZQFT MPDBMMZ


XJUI let BOE where DMBVTFT )FSFƊT BO FYBNQMF PG BTTJHOJOH B
UZQF XJUIJO B where DMBVTF

triple x = tripleItYo x
where tripleItYo :: Integer -> Integer
tripleItYo y = y * 3

8F EPOƊU IBWF UP BTTFSU UIF UZQF PG triple

Prelude> :t triple
triple :: Integer -> Integer

5IF BTTFSUJPO JO UIF where DMBVTF OBSSPXFE PVS UZQF EPXO


GSPN Num a => a -> a UP Integer -> Integer ()$ XJMM QJDL VQ
BOE QSPQBHBUF UZQF JOGPSNBUJPO GPS JOGFSFODF GSPN BQQMJ
DBUJPOT PG GVODUJPOT TVCFYQSFTTJPOT EFƶOJUJPOT ƈ BMNPTU
BOZXIFSF 5IF UZQF JOGFSFODF JT TUSPOH XJUI UIJT POF
5IFSF BSF DPOTUSBJOUT PO PVS BCJMJUZ UP EFDMBSF UZQFT 'PS
FYBNQMF JG XF USZ UP NBLF UIF (+) GVODUJPO SFUVSO B String XF
HFU BO FSSPS NFTTBHF

Prelude> let x = 5 + 5 :: String

No instance for (Num String) arising from a use of ‘+’


In the expression: 5 + 5 :: String
In an equation for ‘x’: x = 5 + 5 :: String
$)"15&3  5:1&4 

5IJT GVODUJPO DBOOPU BDDFQU BSHVNFOUT PG UZQF String *O


UIJT DBTF JUƊT PWFSEFUFSNJOFE CPUI CFDBVTF UIF (+) GVODUJPO
JT MJNJUFE UP UZQFT JNQMFNFOUJOH UIF Num UZQFDMBTT BOE BMTP
CFDBVTF XFƊWF BMSFBEZ QBTTFE JU UXP OVNFSJD MJUFSBMT BT WBMVFT
5IF OVNFSJD MJUFSBMT DPVME CF BOZ PG TFWFSBM OVNFSJD UZQFT
VOEFS UIF IPPE CVU UIFZ DBOƊU CF String CFDBVTF String EPFT
OPU JNQMFNFOU UIF Num UZQFDMBTT

 $IBQUFS &YFSDJTFT


8FMDPNF UP BOPUIFS SPVOE PG ƌ,OPXJOH JT OPU FOPVHI XF
NVTU BQQMZƍ

.VMUJQMF DIPJDF
 " WBMVF PG UZQF [a] JT

B
B MJTU PG BMQIBCFUJD DIBSBDUFST
C
B MJTU PG MJTUT
D
B MJTU XIPTF FMFNFOUT BSF BMM PG TPNF UZQF Ԑ
E
B MJTU XIPTF FMFNFOUT BSF BMM PG EJƵFSFOU UZQFT

 " GVODUJPO PG UZQF [[a]] -> [a] DPVME

B
UBLF B MJTU PG TUSJOHT BT BO BSHVNFOU
C
USBOTGPSN B DIBSBDUFS JOUP B TUSJOH
$)"15&3  5:1&4 

D
USBOTGPSN B TUSJOH JO UP B MJTU PG TUSJOHT
E
UBLF UXP BSHVNFOUT

 " GVODUJPO PG UZQF [a] -> Int -> a

B
UBLFT POF BSHVNFOU
C
SFUVSOT POF FMFNFOU PG UZQF Ԑ GSPN B MJTU
D
NVTU SFUVSO BO Int WBMVF
E
JT DPNQMFUFMZ ƶDUJPOBM

 " GVODUJPO PG UZQF (a, b) -> a

B
UBLFT B MJTU BSHVNFOU BOE SFUVSOT B Char WBMVF
C
IBT [FSP BSHVNFOUT
D
UBLFT B UVQMF BSHVNFOU BOE SFUVSOT UIF ƶSTU WBMVF
E
SFRVJSFT UIBU Ԑ BOE ԑ CF PG EJƵFSFOU UZQFT

%FUFSNJOF UIF UZQF


'PS UIF GPMMPXJOH GVODUJPOT EFUFSNJOF UIF UZQF PG UIF TQFDJ
ƶFE WBMVF 8F TVHHFTU ZPV UZQF UIFN JOUP B ƶMF BOE MPBE UIF
DPOUFOUT PG UIF ƶMF JO ()$J *O BMM MJLFMJIPPE JU JOJUJBMMZ XJMM
OPU IBWF UIF QPMZNPSQIJD UZQFT ZPV NJHIU FYQFDU EVF UP UIF
NPOPNPSQIJTN SFTUSJDUJPO 8FƊMM FYQMBJO NPSF NVDI MBUFS CVU
GPS OPX JU NFBOT UIBU UPQMFWFM EFDMBSBUJPOT CZ EFGBVMU XJMM
IBWF B DPODSFUF UZQF JG BOZ DBO CF EFUFSNJOFE :PV DBO ƶY
UIJT CZ TFUUJOH VQ ZPVS ƶMF MJLF TP
$)"15&3  5:1&4 

{-# LANGUAGE NoMonomorphismRestriction #-}

module DetermineTheType where

-- simple example
example = 1

*G ZPV IBE OPU JODMVEFE UIF NoMonomorphismRestriction QSBHNB


example XPVME IBWF IBE UIF UZQF Integer JOTUFBE PG Num a => a
%P ZPVS CFTU UP EFUFSNJOF UIF NPTU QPMZNPSQIJD UZQF BO FY
QSFTTJPO DPVME IBWF JO UIF GPMMPXJOH FYFSDJTFT

 "MM GVODUJPO BQQMJDBUJPOT SFUVSO B WBMVF %FUFSNJOF UIF


WBMVF SFUVSOFE CZ UIFTF GVODUJPO BQQMJDBUJPOT BOE UIF UZQF
PG UIBU WBMVF

B
(* 9) 6

C
head [(0,"doge"),(1,"kitteh")]

D
head [(0 :: Integer ,"doge"),(1,"kitteh")]

E
if False then True else False

F
length [1, 2, 3, 4, 5]

G
(length [1, 2, 3, 4]) > (length "TACOCAT")

 (JWFO
$)"15&3  5:1&4 

x = 5
y = x + 5
w = y * 10

8IBU JT UIF UZQF PG X

 (JWFO

x = 5
y = x + 5
z y = y * 10

8IBU JT UIF UZQF PG [

 (JWFO

x = 5
y = x + 5
f = 4 / y

8IBU JT UIF UZQF PG G

 (JWFO

x = "Julie"
y = " <3 "
z = "Haskell"
f = x ++ y ++ z

8IBU JT UIF UZQF PG G


$)"15&3  5:1&4 

%PFT JU DPNQJMF
'PS FBDI TFU PG FYQSFTTJPOT ƶHVSF PVU XIJDI FYQSFTTJPO JG BOZ
DBVTFT UIF DPNQJMFS UP TRVBXL BU ZPV OC XF EP OPU NFBO
MJUFSBM TRVBXLJOH
BOE XIZ 'JY JU JG ZPV DBO

 bigNum = (^) 5 $ 10
wahoo = bigNum $ 10

 x = print
y = print "woohoo!"
z = x "hello world"

 a = (+)
b = 5
c = b 10
d = c 200

 a = 12 + b
b = 10000 * c

5ZQF WBSJBCMF PS TQFDJƶD UZQF DPOTUSVDUPS


 :PV XJMM CF TIPXO B UZQF EFDMBSBUJPO BOE ZPV TIPVME
DBUFHPSJ[F FBDI UZQF 5IF DIPJDFT BSF B GVMMZ QPMZNPSQIJD
UZQF WBSJBCMF DPOTUSBJOFE QPMZNPSQIJD UZQF WBSJBCMF PS
DPODSFUF UZQF DPOTUSVDUPS
$)"15&3  5:1&4 

f :: Num a => a -> b -> Int -> Int


-- [0] [1] [2] [3]

)FSF UIF BOTXFS XPVME CF DPOTUSBJOFE QPMZNPSQIJD


Num
<>
GVMMZ QPMZNPSQIJD <>
BOE DPODSFUF <> BOE
<>


 $BUFHPSJ[F FBDI DPNQPOFOU PG UIF UZQF TJHOBUVSF BT EF


TDSJCFE JO UIF QSFWJPVT FYBNQMF

f :: zed -> Zed -> Blah

 $BUFHPSJ[F FBDI DPNQPOFOU PG UIF UZQF TJHOBUVSF

f :: Enum b => a -> b -> C

 $BUFHPSJ[F FBDI DPNQPOFOU PG UIF UZQF TJHOBUVSF

f :: f -> g -> C

8SJUF B UZQF TJHOBUVSF


'PS UIF GPMMPXJOH FYQSFTTJPOT QMFBTF BEE B UZQF TJHOBUVSF :PV
TIPVME CF BCMF UP SFMZ PO ()$J UZQF JOGFSFODF UP DIFDL ZPVS
XPSL BMUIPVHI ZPV NJHIU OPU IBWF QSFDJTFMZ UIF TBNF BOTXFS
BT ()$J HJWFT EVF UP QPMZNPSQIJTN FUD


 8IJMF XF IBWFOƊU GVMMZ FYQMBJOFE UIJT TZOUBY ZFU ZPVƊWF


TFFO JU JO $IBQUFS  BOE BT B TPMVUJPO UP BO FYFSDJTF JO
$)"15&3  5:1&4 

$IBQUFS  5IJT TZOUBY JT B XBZ PG EFTUSVDUVSJOH B TJOHMF


FMFNFOU PG B MJTU

functionH ::
functionH (x:_) = x

 functionC ::
functionC x y = if (x > y) then True else False

 functionS ::
functionS (x, y) = y

(JWFO B UZQF XSJUF UIF GVODUJPO


:PV XJMM CF TIPXO B UZQF BOE B GVODUJPO UIBU OFFET UP CF XSJU
UFO 6TF UIF JOGPSNBUJPO UIF UZQF QSPWJEFT UP EFUFSNJOF XIBU
UIF GVODUJPO TIPVME EP 8FƊMM BMTP UFMM ZPV IPX NBOZ XBZT
UIFSF BSF UP XSJUF UIF GVODUJPO 4ZOUBDUJDBMMZ EJƵFSFOU CVU
TFNBOUJDBMMZ FRVJWBMFOU JNQMFNFOUBUJPOT BSF OPU DPVOUFE BT
CFJOH EJƵFSFOU 'PS FYBNQMF XSJUJOH B GVODUJPO POF XBZ UIFO
SFXSJUJOH UIF TFNBOUJDBMMZ JEFOUJDBM GVODUJPO CVU VTJOH BOPOZ
NPVT MBNCEB TZOUBY EPFT OPU DPVOU BT UXP JNQMFNFOUBUJPOT
5P NBLF UIJOHT B MJUUMF FBTJFS XFƊMM EFNPOTUSBUF IPX UP TPMWF
UIJT LJOE PG FYFSDJTF (JWFO
$)"15&3  5:1&4 

myFunc :: (x -> y)
-> (y -> z)
-> c
-> (a, x)
-> (a, z)
myFunc xToY yToZ _ (a, x) = undefined

5BMLJOH UISPVHI UIF BCPWF XF IBWF B GVODUJPO UIBU UBLFT


GPVS BSHVNFOUT 5IF ƶOBM SFTVMU JT B UVQMF XJUI UIF UZQF (a,
z) *U UVSOT PVU UIF Ԓ BSHVNFOU JT OPXIFSF JO PVS SFTVMUT BOE
UIFSFƊT OPUIJOH SFBMMZ UP EP XJUI JU TP XF VTF UIF VOEFSTDPSF
UP JHOPSF UIBU 8F OBNFE UIF UXP GVODUJPO BSHVNFOUT CZ UIFJS
UZQFT BOE QBUUFSO NBUDIFE PO UIF UVQMF BSHVNFOU 5IF POMZ
XBZ UP HFU UIF TFDPOE WBMVF PG UIF UVQMF GSPN UIF UZQF ԧ UP
UIF UZQF ԩ JT UP VTF CPUI PG UIF GVODUJPOT GVSOJTIFE UP VT *G XF
USJFE UIF GPMMPXJOH

myFunc xToY yToZ _ (a, x) =


(a, (xToY x))

8F XPVME HFU B UZQF FSSPS UIBU JU FYQFDUFE UIF UZQF ԩ CVU


UIF BDUVBM UZQF XBT Ԩ 5IBUƊT CFDBVTF XFƊSF PO UIF SJHIU QBUI
CVU OPU RVJUF EPOF ZFU "DDPSEJOHMZ UIF GPMMPXJOH TIPVME
UZQFDIFDL
$)"15&3  5:1&4 

myFunc :: (x -> y)
-> (y -> z)
-> c
-> (a, x)
-> (a, z)
myFunc xToY yToZ _ (a, x) =
(a, (yToZ (xToY x)))

 5IFSF JT POMZ POF GVODUJPO EFƶOJUJPO UIBU UZQFDIFDLT BOE


EPFTOƊU HP JOUP BO JOƶOJUF MPPQ XIFO ZPV SVO JU

i :: a -> a
i = undefined

 5IFSF JT POMZ POF WFSTJPO UIBU XPSLT

c :: a -> b -> a
c = undefined

 (JWFO BMQIB FRVJWBMFODF BSF c'' BOE c TFF BCPWF


UIF TBNF
UIJOH

c'' :: b -> a -> b


c'' = ?

 0OMZ POF WFSTJPO UIBU XPSLT

c' :: a -> b -> b


c' = undefined
$)"15&3  5:1&4 

 5IFSF BSF NVMUJQMF QPTTJCJMJUJFT BU MFBTU UXP PG XIJDI


ZPVƊWF TFFO JO QSFWJPVT DIBQUFST

r :: [a] -> [a]


r = undefined

 0OMZ POF WFSTJPO UIBU XJMM UZQFDIFDL

co :: (b -> c) -> (a -> b) -> a -> c


co = undefined

 0OF WFSTJPO XJMM UZQFDIFDL

a :: (a -> c) -> a -> a


a = undefined

 0OF WFSTJPO XJMM UZQFDIFDL

a' :: (a -> b) -> a -> b


a' = undefined

'JY JU
8POƊU TPNFPOF UBLF QJUZ PO UIJT QPPS CSPLFO DPEF BOE ƶY JU
VQ #F TVSF UP DIFDL DBSFGVMMZ GPS UIJOHT MJLF DBQJUBMJ[BUJPO
QBSFOUIFTFT BOE JOEFOUBUJPO

 module sing where


$)"15&3  5:1&4 

fstString :: [Char] ++ [Char]


fstString x = x ++ " in the rain"

sndString :: [Char] -> Char


sndString x = x ++ " over the rainbow"

sing = if (x > y) then fstString x or sndString y


where x = "Singin"
x = "Somewhere"

 /PX UIBU JUƊT ƶYFE NBLF B NJOPS DIBOHF BOE NBLF JU TJOH
UIF PUIFS TPOH *G ZPVƊSF MVDLZ ZPVƊMM FOE VQ XJUI CPUI
TPOHT TUVDL JO ZPVS IFBE

 -- arith3broken.hs
module Arith3Broken where

main :: IO ()
Main = do
print 1 + 2
putStrLn 10
print (negate -1)
print ((+) 0 blah)
where blah = negate 1
$)"15&3  5:1&4 

5ZQF,XPO%P
5IF OBNF JT DPVSUFTZ PG 1IJMMJQ 8SJHIU 5IBOL ZPV GPS UIF
JEFB
5IF GPDVT IFSF JT PO NBOJQVMBUJOH UFSNT JO PSEFS UP HFU UIF
UZQFT UP ƶU 5IJT TPSU PG FYFSDJTF JT TPNFUIJOH ZPVƊMM FODPVOUFS
JO XSJUJOH SFBM )BTLFMM DPEF TP UIF QSBDUJDF XJMM NBLF JU FBTJFS
UP EFBM XJUI XIFO ZPV HFU UIFSF 1SBDUJDJOH UIJT XJMM NBLF ZPV
CFUUFS BU XSJUJOH PSEJOBSZ DPEF BT XFMM
8F QSPWJEF UIF UZQFT BOE CPUUPNFE PVU EFDMBSFE BT undefined

UFSNT #PUUPN BOE VOEFƶOFE XJMM CF FYQMBJOFE JO NPSF EFUBJM


MBUFS 5IF DPOUFOUT PG UIF UFSNT BSF JSSFMFWBOU IFSF :PVƊMM VTF
POMZ UIF EFDMBSBUJPOT QSPWJEFE BOE XIBU UIF 1SFMVEF QSPWJEFT
CZ EFGBVMU VOMFTT PUIFSXJTF TQFDJƶFE :PVS HPBM JT UP NBLF UIF
???ƊE EFDMBSBUJPO QBTT UIF UZQFDIFDLFS CZ NPEJGZJOH JU BMPOF
)FSFƊT B XPSLFE FYBNQMF GPS IPX XF QSFTFOU UIFTF FYFSDJTFT
BOE IPX ZPV BSF FYQFDUFE UP TPMWF UIFN (JWFO UIF GPMMPXJOH

https://twitter.com/SixBitProxyWax
$)"15&3  5:1&4 

data Woot

data Blah

f :: Woot -> Blah


f = undefined

g :: (Blah, Woot) -> (Blah, Blah)


g = ???

)FSF JUƊT Ԗ UIBU ZPVƊSF TVQQPTFE UP JNQMFNFOU IPXFWFS


ZPV DBOƊU FWBMVBUF BOZUIJOH :PVƊSF UP POMZ VTF UZQFDIFDLJOH
BOE UZQFJOGFSFODF UP WBMJEBUF ZPVS BOTXFST "MTP OPUF UIBU
XFƊSF VTJOH B USJDL GPS EFƶOJOH EBUBUZQFT XIJDI DBO CF OBNFE
JO B UZQF TJHOBUVSF CVU IBWF OP WBMVFT )FSFƊT BO FYBNQMF PG
B WBMJE TPMVUJPO

g :: (Blah, Woot) -> (Blah, Blah)


g (b, w) = (b, f w)

5IF JEFB JT UP POMZ ƶMM JO XIBU XFƊWF NBSLFE XJUI ???


/PU BMM UFSNT XJMM BMXBZT CF VTFE JO UIF JOUFOEFE TPMVUJPO GPS B
QSPCMFN
$)"15&3  5:1&4 

 f :: Int -> String


f = undefined

g :: String -> Char


g = undefined

h :: Int -> Char


h = ???

 data A
data B
data C

q :: A -> B
q = undefined

w :: B -> C
w = undefined

e :: A -> C
e = ???
$)"15&3  5:1&4 

 data X
data Y
data Z

xz :: X -> Z
xz = undefined

yz :: Y -> Z
yz = undefined

xform :: (X, Y) -> (Z, Z)


xform = ???

 munge :: (x -> y) -> (y -> (w, z)) -> x -> w


munge = ???

 %FƶOJUJPOT
 1PMZNPSQIJTN SFGFST UP UZQF WBSJBCMFT XIJDI NBZ SFGFS UP
NPSF UIBO POF DPODSFUF UZQF *O )BTLFMM UIJT XJMM VTVBMMZ
NBOJGFTU BT QBSBNFUSJD PS BEIPD QPMZNPSQIJTN #Z IBW
JOH B MBSHFS TFU PG UZQFT XF JOUFSTFDU UIF DPNNPOBMJUJFT
PG UIFN BMM UP QSPEVDF B TNBMMFS TFU PG DPSSFDU UFSNT 5IJT
NBLFT JU MFTT MJLFMZ XFƊMM XSJUF BO JODPSSFDU QSPHSBN BOE
MFUT VT SFVTF UIF DPEF XJUI PUIFS UZQFT
$)"15&3  5:1&4 

 5ZQF JOGFSFODF JT B GBDVMUZ TPNF QSPHSBNNJOH MBOHVBHFT


NPTU OPUBCMZ )BTLFMM BOE .- IBWF UP JOGFS QSJODJQBM UZQFT
GSPN UFSNT XJUIPVU OFFEJOH FYQMJDJU UZQF BOOPUBUJPOT
5IFSF BSF JO TPNF DBTFT UFSNT JO )BTLFMM XIJDI DBO CF
XFMMUZQFE CVU XIJDI IBWF OP QSJODJQBM UZQF *O UIPTF
DBTFT BO FYQMJDJU UZQF BOOPUBUJPO NVTU CF BEEFE
8JUI SFTQFDU UP )BTLFMM UIF QSJODJQBM UZQF JT UIF NPTU
HFOFSJD UZQF XIJDI TUJMM UZQFDIFDLT .PSF HFOFSBMMZ 1SJO
DJQBM UZQF JT B QSPQFSUZ PG UIF UZQF TZTUFN ZPVƊSF JOUFSBDU
JOH XJUI 1SJODJQBM UZQJOH IPMET GPS UIBU UZQF TZTUFN JG B
UZQF DBO CF GPVOE GPS B UFSN JO BO FOWJSPONFOU GPS XIJDI
BMM PUIFS UZQFT GPS UIBU UFSN BSF JOTUBODFT PG UIF QSJODJQBM
UZQF )FSF BSF TPNF FYBNQMFT
$)"15&3  5:1&4 

-- Given the inferred types


a
Num a => a
Int

-- The principal type here is the


-- parametrically polymorphic 'a'.

-- Given these types


(Ord a, Num a) => a
Integer

-- The principal type is


-- (Ord a, Num a) => a

 5ZQF WBSJBCMF JT B XBZ UP SFGFS UP BO VOTQFDJƶFE UZQF PS


TFU PG UZQFT JO )BTLFMM UZQF TJHOBUVSFT 5ZQF WBSJBCMFT
PSEJOBSJMZ XJMM CF FRVBM UP UIFNTFMWFT UISPVHIPVU B UZQF
TJHOBUVSF -FU VT DPOTJEFS TPNF FYBNQMFT
$)"15&3  5:1&4 

id :: a -> a

-- One type variable 'a' that occurs twice,


-- once as an argument, once as a result.
-- Parametrically polymorphic, could be
-- strictly anything

(+) :: Num a => a -> a -> a

-- One type variable 'a', constrained to needing


-- an instance of Num. Two arguments, one result.
-- All the same type.

 " UZQFDMBTT JT B NFBOT PG FYQSFTTJOH GBDVMUJFT PS JOUFSGBDFT


UIBU NVMUJQMF EBUBUZQFT NBZ IBWF JO DPNNPO 5IJT FO
BCMFT VT UP XSJUF DPEF FYDMVTJWFMZ JO UFSNT PG UIPTF DPN
NPOBMJUJFT XJUIPVU SFQFBUJOH ZPVSTFMG GPS FBDI JOTUBODF
+VTU BT POF NBZ TVN WBMVFT PG UZQF Int Integer Float
Double BOE Rational XF DBO BWPJE IBWJOH EJƵFSFOU (+) (*)
(-) negate FUD GVODUJPOT GPS FBDI CZ VOJGZJOH UIFN JOUP
B TJOHMF UZQFDMBTT *NQPSUBOUMZ UIFTF DBO UIFO CF VTFE
XJUI BMM UZQFT UIBU IBWF B Num JOTUBODF 5IVT B UZQFDMBTT
QSPWJEFT VT B NFBOT UP XSJUF DPEF JO UFSNT PG UIPTF PQFS
BUPST BOE IBWF PVS GVODUJPOT CF DPNQBUJCMF XJUI BMM UZQFT
UIBU IBWF JOTUBODFT PG UIBU UZQFDMBTT XIFUIFS UIFZ BMSFBEZ
$)"15&3  5:1&4 

FYJTU PS BSF ZFU UP CF JOWFOUFE CZ ZPV QFSIBQT




 1BSBNFUSJDJUZ JT UIF QSPQFSUZ UIBU IPMET JO UIF QSFTFODF PG


QBSBNFUSJD QPMZNPSQIJTN 1BSBNFUSJDJUZ TUBUFT UIBU UIF
CFIBWJPS PG B GVODUJPO XJMM CF VOJGPSN BDSPTT BMM DPODSFUF
BQQMJDBUJPOT PG UIF GVODUJPO 1BSBNFUSJDJUZ UFMMT VT UIBU
UIF GVODUJPO

id :: a -> a

$BO CF VOEFSTUPPE UP IBWF UIF TBNF FYBDU CFIBWJPS GPS


FWFSZ UZQF JO )BTLFMM XJUIPVU VT OFFEJOH UP TFF IPX JU
XBT XSJUUFO *U JT UIF TBNF QSPQFSUZ UIBU UFMMT VT

const :: a -> b -> a

const NVTU SFUVSO UIF ƶSTU WBMVF ƈ QBSBNFUSJDJUZ BOE UIF


EFƶOJUJPO PG UIF UZQF SFRVJSFT JU

f :: a -> a -> a

)FSF ԕ DBO POMZ SFUVSO UIF ƶSTU PS TFDPOE WBMVF OPUIJOH


FMTF BOE JU XJMM BMXBZT SFUVSO POF PS UIF PUIFS DPOTJTUFOUMZ
XJUIPVU DIBOHJOH *G UIF GVODUJPO ԕ NBEF VTF PG (+) PS
(*) JUT UZQF XPVME OFDFTTBSJMZ CF DPOTUSBJOFE CZ UIF UZQF
DMBTT /VN BOE UIVT CF BO FYBNQMF PG BEIPD SBUIFS UIBO
QBSBNFUSJD QPMZNPSQIJTN

&YBNQMFT BSF DPVSUFTZ PG UIF @parametricity UXJUUFS BDDPVOU
https://twitter.com/parametricity
$)"15&3  5:1&4 

blahFunc :: b -> String

blahFunc UPUBMMZ JHOPSFT JUT BSHVNFOU BOE JT FƵFDUJWFMZ B


DPOTUBOU WBMVF PG UZQF 4USJOH XIJDI SFRVJSFT B UISPXBXBZ
BSHVNFOU GPS OP SFBTPO

convList :: a -> [a]

6OMFTT UIF SFTVMU JT [] UIF SFTVMUJOH MJTU IBT WBMVFT UIBU BSF
BMM UIF TBNF WBMVF 5IF MJTU XJMM BMXBZT CF UIF TBNF MFOHUI

 "EIPD QPMZNPSQIJTN TPNFUJNFT DBMMFE ƌDPOTUSBJOFE QPMZ


NPSQIJTNƍ
JT QPMZNPSQIJTN UIBU BQQMJFT POF PS NPSF
UZQFDMBTT DPOTUSBJOUT UP XIBU XPVMEƊWF PUIFSXJTF CFFO B
QBSBNFUSJDBMMZ QPMZNPSQIJD UZQF WBSJBCMF )FSF SBUIFS
UIBO SFQSFTFOUJOH B VOJGPSNJUZ PG CFIBWJPS BDSPTT BMM DPO
DSFUF BQQMJDBUJPOT UIF QVSQPTF PG BEIPD QPMZNPSQIJTN
JT UP BMMPX UIF GVODUJPOT UP IBWF EJƵFSFOU CFIBWJPS GPS FBDI
JOTUBODF 5IJT BEIPDOFTT JT DPOTUSBJOFE CZ UIF UZQFT
JO UIF UZQFDMBTT UIBU EFƶOFT UIF NFUIPET BOE )BTLFMMƊT
SFRVJSFNFOU UIBU UZQFDMBTT JOTUBODFT CF VOJRVF GPS B HJWFO
UZQF 'PS BOZ HJWFO DPNCJOBUJPO PG UZQFDMBTT BOE B UZQF
TVDI BT Ord BOE Bool UIFSF NVTU POMZ FYJTU POF VOJRVF
JOTUBODF JO TDPQF 5IJT NBLFT JU DPOTJEFSBCMZ FBTJFS UP
SFBTPO BCPVU UZQFDMBTTFT 4FF UIF FYBNQMF GPS B EJTBN
CJHVBUJPO
$)"15&3  5:1&4 

(+) :: Num a => a -> a -> a

-- the above function is leveraging


-- ad-hoc polymorphism via the Num typeclass

c' :: a -> a -> a

-- This function is not,


-- it's parametrically polymorphic in 'a'.

 " NPEVMF JT UIF VOJU PG PSHBOJ[BUJPO UIBU UIF )BTLFMM QSP


HSBNNJOH MBOHVBHF VTFT UP DPMMFDU UPHFUIFS EFDMBSBUJPOT
PG WBMVFT GVODUJPOT EBUB UZQFT UZQFDMBTTFT BOE UZQFDMBTT
JOTUBODFT "OZ UJNF ZPV VTF ƌJNQPSUƍ JO )BTLFMM ZPV BSF
JNQPSUJOH EFDMBSBUJPOT GSPN B NPEVMF -FU VT MPPL BU BO
FYBNQMF GSPN UIF DIBQUFS FYFSDJTFT

{-# LANGUAGE NoMonomorphismRestriction #-}

module DetermineTheType where


-- ^ name of our module

)FSF XF NBEF PVS )BTLFMM TPVSDF ƶMF IBWF B NPEVMF BOE


XF OBNFE JU DetermineTheType 8F JODMVEFE B EJSFDUJWF UP
UIF DPNQJMFS UP EJTBCMF UIF NPOPNPSQIJTN SFTUSJDUJPO
$)"15&3  5:1&4 

CFGPSF XF EFDMBSFE UIF NPEVMF "MTP DPOTJEFS UIF GPMMPX


JOH FYBNQMF VTJOH import

import Data.Aeson (encode)


-- ^ the module Data.Aeson
import Database.Persist
-- ^ the module Database.Persist

*O UIF BCPWF FYBNQMF XF BSF JNQPSUJOH UIF GVODUJPO


encode EFDMBSFE JO UIF NPEVMF Data.Aeson BMPOH XJUI BOZ
UZQFDMBTT JOTUBODFT 8JUI UIF NPEVMF Database.Persist XF
BSF JNQPSUJOH FWFSZUIJOH JU NBLFT BWBJMBCMF

 'PMMPXVQ SFTPVSDFT


 -VJT %BNBT 3PCJO .JMOFS 1SJODJQBM UZQFTDIFNFT GPS
GVODUJPOBM QSPHSBNT

 $ISJTUPQIFS 4USBDIFZ 'VOEBNFOUBM $PODFQUT JO 1SP


HSBNNJOH -BOHVBHFT
1PQVMBS PSJHJO PG UIF QBSBNFUSJDBEIPD QPMZNPSQIJTN
EJTUJODUJPO
$IBQUFS 

5ZQFDMBTTFT

" CMBOL DIFRVF LJMMT


DSFBUJWJUZ

.PLPLPNB .PLIPOPBOB


$)"15&3  -&44 "%)0$ 10-:.031)*4. 

 5ZQFDMBTTFT
:PV NBZ IBWF SFBMJ[FE UIBU JU JT WFSZ EJƸDVMU UP UBML BCPVU PS
VOEFSTUBOE )BTLFMMƊT UZQF TZTUFN XJUIPVU BMTP UBMLJOH BCPVU
UZQFDMBTTFT 4P GBS XFƊWF CFFO GPDVTFE PO UIF XBZ UIFZ JOUFSBDU
XJUI UZQF WBSJBCMFT BOE OVNFSJD UZQFT FTQFDJBMMZ 5IJT DIBQUFS
FYQMBJOT TPNF JNQPSUBOU QSFEFƶOFE UZQFDMBTTFT POMZ TPNF
PG XIJDI IBWF UP EP XJUI OVNCFST BOE QSPWJEFT NPSF EFUBJM
BCPVU IPX UZQFDMBTTFT XPSL NPSF HFOFSBMMZ *O UIJT DIBQUFS
XF XJMM

Ƒ FYBNJOF UIF UZQFDMBTTFT Eq Num Ord Enum BOE Show

Ƒ MFBSO BCPVU UZQFEFGBVMUJOH UZQFDMBTTFT BOE UZQFDMBTT JO


IFSJUBODF

Ƒ MPPL BU TPNF DPNNPO CVU PǒFO JNQMJDJU GVODUJPOT UIBU


DSFBUF TJEF FƵFDUT

 8IBU BSF UZQFDMBTTFT


5ZQFDMBTTFT BOE UZQFT JO )BTLFMM BSF JO B TFOTF PQQPTJUFT
8IFSF B EFDMBSBUJPO PG B UZQF EFƶOFT IPX UIBU UZQF JO QBSUJD
VMBS JT DSFBUFE B EFDMBSBUJPO PG B UZQFDMBTT EFƶOFT IPX B TFU
PG UZQFT BSF DPOTVNFE PS VTFE JO DPNQVUBUJPOT 5IJT UFOTJPO
JT SFMBUFE UP UIF FYQSFTTJPO QSPCMFN XIJDI JT BCPVU EFƶOJOH
DPEF JO UFSNT PG IPX EBUB JT DSFBUFE PS QSPDFTTFE "T 1IJMJQ
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

8BEMFS QVU JU ƌ5IF HPBM JT UP EFƶOF B EBUBUZQF CZ DBTFT XIFSF


POF DBO BEE OFX DBTFT UP UIF EBUBUZQF BOE OFX GVODUJPOT PWFS
UIF EBUBUZQF XJUIPVU SFDPNQJMJOH FYJTUJOH DPEF BOE XIJMF
SFUBJOJOH TUBUJD UZQF TBGFUZ FH OP DBTUT
ƍ *G ZPV LOPX PUIFS
QSPHSBNNJOH MBOHVBHFT XJUI B TJNJMBS DPODFQU JU NBZ IFMQ UP
UIJOL PG UZQFDMBTTFT BT CFJOH MJLF JOUFSGBDFT UP EBUB UIBU DBO XPSL
BDSPTT NVMUJQMF EBUBUZQFT 5IF MBUUFS GBDJMJUZ JT XIZ UZQFDMBTTFT
BSF B NFBOT PG BE IPD QPMZNPSQIJTN ƈ ƌBE IPDƍ CFDBVTF UZQF
DMBTT DPEF JT EJTQBUDIFE CZ UZQF TPNFUIJOH XF XJMM FYQMBJO
MBUFS JO UIJT DIBQUFS 8F XJMM DPOUJOVF DBMMJOH JU DPOTUSBJOFE
QPMZNPSQIJTN UIPVHI BT XF UIJOL UIBU UFSN JT HFOFSBMMZ
NPSF DMFBS
5ZQFDMBTTFT BMMPX VT UP HFOFSBMJ[F PWFS B TFU PG UZQFT JO
PSEFS UP EFƶOF BOE FYFDVUF B TUBOEBSE TFU PG GFBUVSFT GPS UIPTF
UZQFT 'PS FYBNQMF UIF BCJMJUZ UP UFTU WBMVFT GPS FRVBMJUZ JT
VTFGVM BOE XFƊE XBOU UP CF BCMF UP VTF UIBU GVODUJPO GPS EBUB
PG WBSJPVT UZQFT *O GBDU XF DBO UFTU BOZ EBUB PG B UZQF UIBU
JNQMFNFOUT UIF UZQFDMBTT LOPXO BT Eq GPS FRVBMJUZ 8F EP
OPU OFFE TFQBSBUF FRVBMJUZ GVODUJPOT GPS FBDI EJƵFSFOU UZQF
PG EBUB BT MPOH BT PVS EBUBUZQF JNQMFNFOUT PS JOTUBOUJBUFT
UIF Eq UZQFDMBTT XF DBO VTF UIF TUBOEBSE GVODUJPOT 4JNJMBSMZ
BMM UIF OVNFSJD MJUFSBMT BOE UIFJS WBSJPVT UZQFT JNQMFNFOU B
UZQFDMBTT DBMMFE Num XIJDI EFƶOFT B TUBOEBSE TFU PG PQFSBUPST
UIBU DBO CF VTFE XJUI BOZ UZQF PG OVNCFST

1IJMJQ 8BEMFS ƌ5IF &YQSFTTJPO 1SPCMFNƍ http://homepages.inf.ed.ac.uk/wadler/
papers/expression/expression.txt
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

8FƊMM HFU JOUP NPSF EFUBJM BCPVU XIBU JU NFBOT GPS B UZQF
UP IBWF BO ƌJOTUBODFƍ PG B UZQFDMBTT JO UIJT DIBQUFS CVU CSJFƷZ
TUBUFE JU NFBOT UIBU UIFSF JT DPEF UIBU EFƶOFT IPX UIF WBMVFT
BOE GVODUJPOT GSPN UIBU UZQFDMBTT XPSL GPS UIBU UZQF 8IFO
ZPV VTF B UZQFDMBTT NFUIPE XJUI POF PG UIF UZQFT UIBU IBT TVDI
BO JOTUBODF UIF DPNQJMFS MPPLT VQ UIF DPEF UIBU EJDUBUFT IPX
UIF GVODUJPO XPSLT GPS UIBU UZQF 8FƊMM TFF UIJT NPSF BT XF
XSJUF PVS PXO JOTUBODFT

 #BDL UP #PPM


-FUƊT SFUVSO CSJFƷZ UP UIF Bool UZQF UP HFU B GFFM GPS XIBU UZQF
DMBTT JOGPSNBUJPO SFBMMZ MPPLT MJLF "T ZPV NBZ SFDBMM XF DBO
VTF UIF ()$J DPNNBOE :info UP RVFSZ JOGPSNBUJPO JODMVEJOH
UZQFDMBTT JOGPSNBUJPO BCPVU BOZ GVODUJPO PS UZQF BOE TPNF
WBMVFT


Prelude> :info Bool


data Bool = False | True
instance Bounded Bool
instance Enum Bool
instance Eq Bool
instance Ord Bool
instance Read Bool
instance Show Bool
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

5IF JOGPSNBUJPO JODMVEFT UIF EBUB EFDMBSBUJPO GPS Bool BOE


XIJDI UZQFDMBTTFT JU BMSFBEZ IBT JOTUBODFT PG *U BMTP UFMMT ZPV
XIFSF UIF EBUBUZQF BOE JUT JOTUBODFT BSF EFƶOFE GPS UIF DPN
QJMFS JG ZPV XBOU UP MPPL BU UIF TPVSDF DPEF CVU XFƊWF MFǒ UIBU
JOGPSNBUJPO PVU
-FUƊT MPPL BU UIBU MJTU PG JOTUBODFT &BDI PG UIFTF JOTUBODFT
JT B UZQFDMBTT UIBU Bool JNQMFNFOUT BOE UIF JOTUBODFT BSF UIF
VOJRVF TQFDJƶDBUJPOT PG IPX Bool NBLFT VTF PG UIF NFUIPET
GSPN UIBU UZQFDMBTT *O UIJT DIBQUFS XFƊSF POMZ HPJOH UP FYBN
JOF B GFX PG UIFTF OBNFMZ Eq Ord BOE Show #SJFƷZ IPXFWFS
UIFZ NFBO UIF GPMMPXJOH

 instance Bounded Bool Ƈ Bounded GPS UZQFT UIBU IBWF BO VQ


QFS BOE MPXFS CPVOE

 instance Enum Bool Ƈ Enum GPS UIJOHT UIBU DBO CF FOVNFS


BUFE

 instance Eq Bool Ƈ Eq GPS UIJOHT UIBU DBO CF UFTUFE GPS FRVBM


JUZ

 instance Ord Bool Ƈ Ord GPS UIJOHT UIBU DBO CF QVU JOUP B
TFRVFOUJBM PSEFS

 instance Read Bool Ƈ Read QBSTFT TUSJOHT JOUP UIJOHT %POƊU


VTF JU /P TFSJPVTMZ EPOƊU

 instance Show Bool Ƈ Show SFOEFST UIJOHT JOUP TUSJOHT


$)"15&3  -&44 "%)0$ 10-:.031)*4. 

5ZQFDMBTTFT IBWF B IJFSBSDIZ PG TPSUT  BT ZPV NJHIU SFDBMM


GSPN PVS EJTDVTTJPO PG OVNFSJD UZQFT "MM Fractional OVNCFST
JNQMFNFOU UIF Num UZQFDMBTT CVU OPU BMM Num BSF Fractional "MM
NFNCFST PG Ord NVTU CF NFNCFST PG Eq BOE BMM NFNCFST PG
Enum NVTU CF NFNCFST PG Ord 5P CF BCMF UP QVU TPNFUIJOH
JO BO FOVNFSBUFE MJTU UIFZ NVTU CF BCMF UP CF PSEFSFE UP CF
BCMF UP PSEFS TPNFUIJOH UIFZ NVTU CF BCMF UP CF DPNQBSFE
GPS FRVBMJUZ

 &R
*O )BTLFMM FRVBMJUZ JT JNQMFNFOUFE XJUI B UZQFDMBTT DBMMFE Eq
4PNF QSPHSBNNJOH MBOHVBHFT CBLF FRVBMJUZ JOUP FWFSZ PCKFDU
JO UIF MBOHVBHF CVU TPNF EBUBUZQFT EP OPU IBWF B TFOTJCMF
OPUJPO PG FRVBMJUZ TP )BTLFMM EPFT OPU FODPEF FRVBMJUZ JOUP
FWFSZ UZQF Eq BMMPXT VT UP VTF TUBOEBSE NFBTVSFT PG FRVBMJUZ
GPS RVJUF B GFX EBUBUZQFT UIPVHI
Eq JT EFƶOFE UIJT XBZ

Prelude> :info Eq
class Eq a where
(==) :: a -> a -> Bool

:PV DBO VTF B TFBSDI FOHJOF MJLF )PPHMF BU http://haskell.org/hoogle UP ƶOE JOGPSNB
UJPO PO )BTLFMM EBUBUZQFT BOE UZQFDMBTTFT )PPHMF JT B )BTLFMM "1* TFBSDI FOHJOF XIJDI
BMMPXT ZPV UP TFBSDI NBOZ TUBOEBSE )BTLFMM MJCSBSJFT CZ GVODUJPO OBNF PS UZQF TJHOBUVSF
"T ZPV CFDPNF ƷVFOU JO )BTLFMM UZQFT ZPV XJMM CF BCMF UP JOQVU UIF UZQF PG UIF GVODUJPO
ZPV XBOU BOE ƶOE UIF GVODUJPOT UIBU NBUDI

.PTU JNQPSUBOUMZ UIF GVODUJPO UZQF EPFT OPU IBWF BO Eq JOTUBODF GPS SFBTPOT XF XJMM
OPU HFU JOUP IFSF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

(/=) :: a -> a -> Bool

'JSTU JU UFMMT VT XF IBWF B UZQFDMBTT DBMMFE Eq XIFSF UIFSF BSF


UXP CBTJD GVODUJPOT FRVBMJUZ BOE OPOFRVBMJUZ BOE HJWFT UIFJS
UZQF TJHOBUVSFT /FYU JU MJTUT UIF JOTUBODFT PG Eq

-- partial list
instance Eq a => Eq [a]
instance Eq Ordering
instance Eq Int
instance Eq Float
instance Eq Double
instance Eq Char
instance Eq Bool
instance (Eq a, Eq b) => Eq (a, b)
instance Eq ()
instance Eq a => Eq (Maybe a)
instance Eq Integer

8F TFF TFWFSBM OVNFSJD UZQFT PVS PME GSJFOE Bool Char VO
TVSQSJTJOH BT XFƊWF TFFO UIBU XF DBO DPNQBSF DIBSBDUFST GPS
FRVBMJUZ
BOE UVQMFT 8F LOPX GSPN UIJT UIBU BOZ UJNF XF BSF
VTJOH EBUB PG UIFTF UZQFT XF BSF JNQMFNFOUJOH UIF Eq UZQFDMBTT
BOE UIFSFGPSF IBWF HFOFSJD GVODUJPOT XF DBO VTF UP DPNQBSF
UIFJS FRVBMJUZ "OZ UZQF UIBU IBT BO JOTUBODF PG UIJT UZQFDMBTT
JNQMFNFOUT UIF NFUIPET PG UIF UZQFDMBTT
)FSF BSF TPNF FYBNQMFT VTJOH UIJT UZQFDMBTT
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

Prelude> 132 == 132


True
Prelude> 132 /= 132
False
Prelude> (1, 2) == (1, 1)
False
Prelude> (1, 1) == (1, 2)
False
Prelude> "doge" == "doge"
True
Prelude> "doge" == "doggie"
False

5IF UZQFT PG (==) BOE (/=) JO Eq UFMM VT TPNFUIJOH JNQPSUBOU


BCPVU UIFTF GVODUJPOT

(==) :: Eq a => a -> a -> Bool


(/=) :: Eq a => a -> a -> Bool

(JWFO UIFTF UZQFT XF LOPX UIBU UIFZ DBO CF VTFE GPS BOZ
UZQF Ԑ XIJDI JNQMFNFOUT UIF Eq UZQFDMBTT 8F BMTP LOPX UIBU
CPUI GVODUJPOT XJMM UBLF UXP BSHVNFOUT PG UIF TBNF UZQF Ԑ BOE
SFUVSO Bool 8F LOPX UIFZ IBWF UP CF UIF TBNF CFDBVTF Ԑ NVTU
FRVBM Ԑ JO UIF TBNF UZQF TJHOBUVSF
8IFO XF BQQMZ (==) UP B TJOHMF BSHVNFOU XF DBO TFF IPX
JU TQFDJBMJ[FT UIF BSHVNFOUT
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

(==) :: Eq a => a -> a -> Bool


-- if we specialized (==) for [Char] aka String
(==) :: [Char] -> [Char] -> Bool
(==) "cat" :: [Char] -> Bool
(==) "cat" "cat" :: Bool

:PV DBO FYQFSJNFOU XJUI UIJT GVSUIFS JO UIF 3&1- UP TFF


IPX BQQMZJOH UZQFT UP BSHVNFOUT NBLFT UIF UZQF WBSJBCMFT
NPSF TQFDJƶD
8IBU IBQQFOT JG UIF ƶSTU UXP BSHVNFOUT Ԑ BOE Ԑ BSFOƊU UIF
TBNF UZQF

Prelude F M> (1, 2) == "puppies!"

Couldn't match expected type ‘(t0, t1)’


with actual type ‘[Char]’
In the second argument of ‘(==)’, namely ‘"puppies!"’
In the expression: (1, 2) == "puppies!"
In an equation for ‘it’: it = (1, 2) == "puppies!"

-FUƊT CSFBL EPXO UIJT UZQF FSSPS

Couldn't match expected type ‘(t0, t1)’


with actual type ‘[Char]’

5IJT FSSPS NFBOT PVS [Char] XBTOƊU UIF UVQMF PG UZQFT ԣ BOE
ԣ UIBU XBT FYQFDUFE (t0, t1) XBT FYQFDUFE GPS UIF TFDPOE
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

BSHVNFOU XIFSF XF TVQQMJFE "puppies!"


CFDBVTF UIBUƊT UIF
UZQF PG UIF ƶSTU BSHVNFOU 3FNFNCFS UIF UZQF PG Ԑ JT VTVBMMZ
TFU CZ UIF MFǒNPTU PDDVSSFODF BOE DBOƊU DIBOHF JO UIF TJHOBUVSF
Eq a => a -> a -> Bool
"QQMZJOH (==) UP Integer XJMM CJOE UIF Ԑ UZQF WBSJBCMF UP
Integer 5IJT JT BT JG UIF TJHOBUVSF DIBOHFE UP

Eq Integer => Integer -> Integer -> Bool

5IF UZQFDMBTT DPOTUSBJOU Eq Integer => HFUT ESPQQFE CFDBVTF


JUƊT SFEVOEBOU 8F DBO TFF UIF JTTVF NPSF DMFBSMZ JG XF MPPL BU
UIF UZQFDMBTT JOTUBODFT PO UIF UVQMF (,)

data (,) a b = (,) a b


instance (Eq a, Eq b) => Eq (a, b)
instance (Ord a, Ord b) => Ord (a, b)
instance (Read a, Read b) => Read (a, b)
instance (Show a, Show b) => Show (a, b)

8F TBX UIF Eq JOTUBODF PG (,) HFUUJOH VTFE FBSMJFS XIFO XF


UFTUFE DPEF MJLF (1, 2) == (1, 2) $SJUJDBMMZ UIF Eq JOTUBODF PG
(a, b) SFMJFT PO UIF Eq JOTUBODFT PG Ԑ BOE ԑ 5IJT UFMMT VT UIF
FRVBMJUZ PG UXP UVQMFT (a, b) EFQFOET PO UIF FRVBMJUZ PG UIFJS
DPOTUJUVFOU WBMVFT Ԑ BOE ԑ 5IJT JT XIZ UIJT XPSLT

Prelude> (1, 'a') == (2, 'b')


False
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

#VU OFJUIFS PG UIFTF XJMM XPSL

Prelude> (1, 2) == ('a', 'b')

Prelude> (1, 'a') == ('a', 1)

5ZQFDMBTT EFSJWJOH 5ZQFDMBTT JOTUBODFT XF DBO NBHJDBMMZ EF


SJWF BSF Eq Ord Enum Bounded Read BOE Show UIPVHI UIFSF BSF
TPNF DPOTUSBJOUT PO EFSJWJOH TPNF PG UIFTF %FSJWJOH NFBOT
ZPV EPOƊU IBWF UP NBOVBMMZ XSJUF JOTUBODFT PG UIFTF UZQFDMBTTFT
GPS FBDI OFX EBUBUZQF ZPV DSFBUF 8FƊMM BEESFTT UIJT B CJU NPSF
JO UIF DIBQUFS PO "MHFCSBJD %BUBUZQFT

 8SJUJOH UZQFDMBTT JOTUBODFT


8F IBWFOƊU UBMLFE NVDI BCPVU XSJUJOH ZPVS PXO EBUBUZQFT ZFU
CVU XFƊMM MPPL BU JU JO HSFBU EFUBJM JO B MBUFS DIBQUFS :PV DBO
BMTP XSJUF ZPVS PXO UZQFDMBTT XIJDI XF XJMM MPPL BU MBUFS JO
UIJT DIBQUFS *O FJUIFS DBTF ZPV XJMM TPNFUJNFT ƶOE ZPVSTFMG
OFFEJOH UP XSJUF ZPVS PXO UZQFDMBTT JOTUBODFT 8IJMF Eq JT POF
PG UIF UZQFDMBTTFT ZPV DBO TJNQMZ EFSJWF JUƊT BMTP POF PG UIF
MFBTU DPNQMJDBUFE UZQFDMBTTFT UP XSJUF JOTUBODFT GPS TP XFƊSF
HPJOH UP VTF JU IFSF UP EFNPOTUSBUF IPX UP XSJUF ZPVS PXO
JOTUBODFT
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

&R JOTUBODFT
"T XFƊWF TFFO Eq QSPWJEFT JOTUBODFT GPS EFUFSNJOJOH FRVBMJUZ
PG WBMVFT TP NBLJOH BO JOTUBODF PG JU GPS B HJWFO EBUBUZQF JT
VTVBMMZ TUSBJHIUGPSXBSE
:PV DBO JOWFTUJHBUF B UZQFDMBTT CZ SFGFSSJOH UP UIF )BDL
BHF EPDVNFOUBUJPO GPS UIBU UZQFDMBTT 5ZQFDMBTTFT MJLF Eq
DPNF XJUI UIF DPSF base MJCSBSZ UIBU JT MPDBUFE BU http://hackage.
haskell.org/package/base  Eq TQFDJƶDBMMZ JT MPDBUFE BU http://
hackage.haskell.org/package/base/docs/Data-Eq.html
*O UIBU EPDVNFOUBUJPO ZPVƊMM XBOU UP OPUF B QBSUJDVMBS CJU
PG XPSEJOH

Minimal complete definition: either == or /=.

5IJT UFMMT ZPV XIBU NFUIPET ZPV OFFE UP EFƶOF UP IBWF


B WBMJE Eq JOTUBODF *O UIJT DBTF FJUIFS (==) FRVBM
PS (/=)
VOFRVBM
XJMM TVƸDF BT POF DBO CF EFƶOFE BT UIF OFHBUJPO PG
UIF PUIFS 8IZ OPU POMZ (==) "MUIPVHI JUƊT SBSF ZPV NBZ IBWF
TPNFUIJOH DMFWFS UP EP GPS FBDI DBTF UIBU DPVME NBLF FRVBMJUZ
DIFDLJOH GBTUFS GPS B QBSUJDVMBS EBUBUZQF TP ZPVƊSF BMMPXFE UP
TQFDJGZ CPUI JG ZPV XBOU UP 8F XPOƊU EP UIBU IFSF CFDBVTF
(/=) JT KVTU UIF OFHBUJPO PG (==) BOE XF XPOƊU CF XPSLJOH XJUI
BOZ DMFWFS EBUBUZQFT
'JSTU XFƊMM XPSL XJUI B UJOZ USJWJBM EBUBUZQF DBMMFETrivial
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

data Trivial =
Trivial

8JUI OP deriving DMBVTF IBOHJOH PƵ UIF CVUU PG UIJT EBUBUZQF


EFDMBSBUJPO XFƊMM IBWF OP UZQFDMBTT JOTUBODFT PG BOZ LJOE *G XF
USZ UP MPBE UIJT VQ BOE UFTU FRVBMJUZ XJUIPVU BEEJOH BOZUIJOH
GVSUIFS ()$ XJMM UISPX B UZQF FSSPS

Prelude> Trivial == Trivial

No instance for (Eq Trivial) arising


from a use of ‘==’
In the expression: Trivial == Trivial
In an equation for ‘it’: it = Trivial == Trivial

()$ DBOƊU ƶOE BO JOTUBODF PG Eq GPS PVS EBUBUZQF Trivial


8F DPVMEƊWF IBE ()$ HFOFSBUF POF GPS VT VTJOH deriving Eq
PS XF DPVMEƊWF XSJUUFO POF CVU XF EJE OFJUIFS TP OPOF FYJTUT
BOE JU GBJMT BU DPNQJMF UJNF *O TPNF MBOHVBHFT UIJT TPSU PG
NJTUBLF EPFTOƊU CFDPNF LOPXO VOUJM ZPVS DPEF JT BMSFBEZ JO
UIF NJEEMF PG FYFDVUJOH
6OMJLF PUIFS MBOHVBHFT )BTLFMM EPFT OPU QSPWJEF VOJWFSTBM
TUSJOHJƶDBUJPO Show  QSJOU
PS FRVBMJUZ Eq WBMVF FRVBMJUZ
PS
QPJOUFS FRVBMJUZ
BT UIJT JT OPU BMXBZT TPVOE PS TBGF SFHBSEMFTT
PG XIBU QSPHSBNNJOH MBOHVBHF ZPVƊSF VTJOH
4P XF NVTU XSJUF PVS PXO 'PSUVOBUFMZ XJUI Trivial UIJT
JTUSJWJBM
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

-- keep your typeclass instances for a type


-- in the same file as that type
-- we'll explain why later

data Trivial =
Trivial'

instance Eq Trivial where


Trivial' == Trivial' = True

"OE UIBUƊT JU 8F XSPUF BO JOTUBODF UIBU UFMMT UIF DPNQJMFS


IPX UP UFTU UIJT EBUBUZQF GPS FRVBMJUZ %BUB DPOTUSVDUPST BOE
UZQF DPOTUSVDUPST PǒFO IBWF UIF TBNF OBNF JO )BTLFMM BOE
UIBU DBO HFU DPOGVTJOH 8F VTFE UIF TJOHMF RVPUF BU UIF FOE PG
UIF EBUB DPOTUSVDUPS IFSF CFDBVTF UIFZ EPOƊU IBWF UP IBWF UIF
TBNF OBNF BOE JU NJHIU NBLF JU FBTJFS UP GPMMPX UIF FYBNQMFT

*G ZPV MPBE UIJT VQ ZPV IBWF POMZ POF QPTTJCMF FYQSFTTJPO


ZPV DBO DPOTUSVDU IFSF

Prelude> Trivial' == Trivial'


True

-FUƊT ESJMM EPXO B CJU JOUP IPX UIJT JOTUBODF TUVƵ XPSLT
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

instance Eq Trivial where


-- [1] [2] [3] [4]
Trivial' == Trivial' = True
-- [5] [6] [7] [8]

instance Eq Trivial where


(==) Trivial' Trivial' = True
-- [ 9 ]

 5IF LFZXPSE instance IFSF CFHJOT B EFDMBSBUJPO PG B UZQF


DMBTT JOTUBODF 5ZQFDMBTT JOTUBODFT BSF IPX ZPV UFMM )BTLFMM
IPX FRVBMJUZ TUSJOHJƶDBUJPO 4IPX
PSEFSBCJMJUZ 0SE

FOVNFSBUJPO &OVN
PS PUIFS UZQFDMBTTFT TIPVME XPSL
GPS B QBSUJDVMBS EBUBUZQF 8JUIPVU UIJT JOTUBODF XF DBOƊU
UFTU UIF WBMVFT GPS FRVBMJUZ FWFO UIPVHI UIF BOTXFS XJMM
OFWFS WBSZ JO UIF DBTF PG UIJT QBSUJDVMBS EBUBUZQF

 5IF ƶSTU OBNF UP GPMMPX UIF instance JT UIF UZQFDMBTT UIF


JOTUBODF JT QSPWJEJOH )FSF UIBU JT Eq

 5IF UZQF UIF JOTUBODF JT CFJOH QSPWJEFE GPS *O UIJT DBTF


XFƊSF JNQMFNFOUJOH UIF Eq UZQFDMBTT GPS UIF Trivial EBUBUZQF

 5IF LFZXPSE where UFSNJOBUFT UIF JOJUJBM EFDMBSBUJPO BOE


CFHJOOJOH PG UIF JOTUBODF 8IBU GPMMPXT BSF UIF BDUVBM
NFUIPET GVODUJPOT
CFJOH JNQMFNFOUFE
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

 5IF EBUB DPOTUSVDUPS WBMVF


Trivial' JT UIF ƶSTU BSHVNFOU
UP UIF == GVODUJPO XFƊSF QSPWJEJOH )FSF XFƊSF EFƶOJOH ==
VTJOH JOƶY OPUBUJPO TP UIF ƶSTU BSHVNFOU JT UP UIF MFǒ

 5IF JOƶY GVODUJPO == UIJT JT XIBU XFƊSF EFƶOJOH JO UIJT


EFDMBSBUJPO

 5IF TFDPOE BSHVNFOU XIJDI JT UIF WBMVF Trivial' 4JODF


== JT JOƶY IFSF UIF TFDPOE BSHVNFOU JT UP UIF SJHIU PG ==

 5IF SFTVMU PG Trivial' == Trivial' UIBU JT True

 8F DPVMEƊWF XSJUUFO UIF EFƶOJUJPO PG (==) VTJOH QSFƶY OP


UBUJPO JOTUFBE PG JOƶY CZ XSBQQJOH UIF PQFSBUPS JO QBSFO
UIFTFT /PUF UIJT JT KVTU CFJOH TIPXO BT BO BMUFSBUJWF ZPV
DBOƊU IBWF UXP UZQFDMBTT JOTUBODFT GPS UIF TBNF UZQF 8FƊMM
FYQMBJO NPSF BCPVU UIJT MBUFS CVU UZQFDMBTT JOTUBODFT BSF
VOJRVF UP B HJWFO UZQF :PV DBO USZ IBWJOH CPUI JO UIF
TBNF ƶMF CVU ZPVƊMM HFU BO FSSPS

0LBZ MFUƊT TUSFUDI PVS MFHT B CJU BOE USZ TPNFUIJOH B CJU
MFTTTrivial 8FƊMM NBLF PVS PXO EBUBUZQFT ƈ POF GPS UIF
EBZT PG UIF XFFL BOE POF GPS UIF EBUF UIBU NBLFT VTF PG UIF
DayOfWeek UZQF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

data DayOfWeek =
Mon | Tue | Weds | Thu | Fri | Sat | Sun

-- day of week and numerical day of month


data Date =
Date DayOfWeek Int

4JODF UIFTF BSF OPU QSFCBLFE EBUBUZQFT JO )BTLFMM UIFZ IBWF


OP UZQFDMBTT JOTUBODFT BU BMM "T UIFZ TUBOE UIFSF JT OPUIJOH
ZPV DBO EP XJUI UIFN CFDBVTF OP PQFSBUJPOT BSF EFƶOFE GPS
UIFN -FUƊT ƶY UIBU 5IF ƶSTU Eq JOTUBODF XFƊMM XSJUF JT GPS
DayOfWeek BOE JT B CJU UFEJPVT UP XSJUF PVU CVU TIPVMEOƊU DPOUBJO
BOZ TVSQSJTFT

instance Eq DayOfWeek where


(==) Mon Mon = True
(==) Tue Tue = True
(==) Weds Weds = True
(==) Thu Thu = True
(==) Fri Fri = True
(==) Sat Sat = True
(==) Sun Sun = True
(==) _ _ = False

/PX XFƊMM XSJUF BO Eq JOTUBODF GPS PVS Date UZQF 5IJT POF JT
NPSF JOUFSFTUJOH
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

instance Eq Date where


(==) (Date weekday dayOfMonth)
(Date weekday' dayOfMonth') =
weekday == weekday' && dayOfMonth == dayOfMonth'

*O UIF Eq JOTUBODF GPS Date XF EJEOƊU SFDBQJUVMBUF IPX FRVBM


JUZ GPS DayOfWeek BOE Int WBMVFT XPSLFE XF TJNQMZ TBJE UIBU UIF
EBUFT XFSF FRVBM JG BMM PG UIFJS DPOTUJUVFOU WBMVFT XFSF FRVBM
/PUF BMTP UIBU UIF DPNQJMFS BMSFBEZ FYQFDUT UIF BSHVNFOUT
PG Date UP CF B DayOfWeek WBMVF BOE BO Int TP XF EP OPU OFFE
UP TQFDJGZ UIBU #BTFE PO XIBU JU LOPXT BCPVU UIPTF UISFF
UZQFT UIJT JT FOPVHI JOGPSNBUJPO GPS VT UP UFTU Date WBMVFT GPS
FRVBMJUZ
%PFT JU XPSL

Prelude> Date Thu 10 == Date Thu 10


True
Prelude> Date Thu 10 == Date Thu 11
False
Prelude> Date Thu 10 == Date Weds 10
False

*U DPNQJMFT BOE JU SFUVSOT XIBU XF XBOU BǒFS UISFF DVSTPSZ


DIFDLT ƈ TIJQ JU
8FƊMM QPJOU PVU POF PUIFS UIJOH BCPVU UIFTF UZQFT

*Main> Date Thu 10


$)"15&3  -&44 "%)0$ 10-:.031)*4. 

<interactive>:26:1:
No instance for (Show Date) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it

8F XSPUF BO Eq JOTUBODF TP XF DBO UFTU UIF WBMVFT GPS FRVBM


JUZ CVU XF DBOƊU QSJOU UIFN JO UIF 3&1- CFDBVTF XF QSPWJEFE
OP Show JOTUBODF *G ZPVƊE MJLF UP ƶY UIBU ZPV DBO TUJDL B deriving
Show DMBVTF PO UIF FOE PG FBDI PG UIF EBUBUZQFT BCPWF

1BSUJBM GVODUJPOT  OPU TP TUSBOHF EBOHFS

8FƊWF NFOUJPOFE QBSUJBM BQQMJDBUJPO PG GVODUJPOT QSFWJPVTMZ


CVU UIF UFSN QBSUJBM GVODUJPO SFGFST UP TPNFUIJOH EJƵFSFOU "
QBSUJBM GVODUJPO JT POF UIBU EPFTOƊU IBOEMF BMM UIF QPTTJCMF DBTFT
TP UIFSF BSF QPTTJCMF TDFOBSJPT JO XIJDI XF IBWFOƊU EFƶOFE
BOZ XBZ GPS UIF DPEF UP FWBMVBUF
8F OFFE UP UBLF DBSF UP BWPJE QBSUJBM GVODUJPOT JO HFOFSBM
JO )BTLFMM CVU UIJT NVTU CF FTQFDJBMMZ LFQU JO NJOE XIFO XF
IBWF B UZQF XJUI NVMUJQMF DBTFT TVDI BT DayOfWeek 8IBU JG XF
IBE NBEF B NJTUBLF JO UIF Eq JOTUBODF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

data DayOfWeek =
Mon | Tue | Weds | Thu | Fri | Sat | Sun

instance Eq DayOfWeek where


(==) Mon Mon = True
(==) Tue Tue = True
(==) Weds Weds = True
(==) Thu Thu = True
(==) Fri Fri = True
(==) Sat Sat = True
(==) Sun Sun = True

8IBU JG UIF BSHVNFOUT BSF EJƵFSFOU 8F GPSHPU PVS VODPO


EJUJPOBM DBTF 5IJT XJMM BQQFBS UP CF ƶOF XIFOFWFS UIF BSHV
NFOUT BSF UIF TBNF CVU CMPX VQ JO PVS GBDFT XIFO UIFZƊSF
OPU

Prelude> Mon == Mon


True

Prelude> Mon == Tue


*** Exception: code/derivingInstances.hs:
(19,3)-(25,23):
Non-exhaustive patterns in function ==

8FMM UIBU TUJOLT 8F EFƶOJUFMZ EJEOƊU TUBSU MFBSOJOH )BTLFMM


CFDBVTF XF XBOUFE TUVƵ UP CMPX VQ BU SVOUJNF 4P XIBU HJWFT
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

5IF HPPE OFXT JT UIFSF JT TPNFUIJOH ZPV DBO EP UP HFU NPSF


IFMQ GSPN ()$ PO UIJT *G XF UVSO BMM XBSOJOHT PO XJUI UIF
Wall ƷBH JO PVS 3&1- PS JO PVS CVJME DPOƶHVSBUJPO ƈ NPSF PO
UIBU MBUFS
UIFO ()$ XJMM MFU VT LOPX XIFO XFƊSF OPU IBOEMJOH
BMM DBTFT

Prelude> :set -Wall


Prelude> :l code/derivingInstances.hs
[1 of 1] Compiling DerivingInstances

code/derivingInstances.hs:19:3: Warning:
Pattern match(es) are non-exhaustive
In an equation for ‘==’:
Patterns not matched:
Mon Tue
Mon Weds
Mon Thu
Mon Fri
...
Ok, modules loaded: DerivingInstances.

:PVƊMM ƶOE UIBU JG ZPV ƶY ZPVS JOTUBODF BOE QSPWJEF UIF


GBMMCBDL DBTF UIBU SFUVSOT False JUƊMM TUPQ TRVBXLJOH BCPVU UIF
OPOFYIBVTUJWF QBUUFSOT
1BSUJBM GVODUJPOT BSF OPU POMZ B DPODFSO XJUI UZQFDMBTT JO
TUBODFT UIPVHI 8F XJMM EJTDVTT UIJT NPSF JO UIF OFYU DIBQUFS
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

CVU JUƊT BMTP B DPODFSO XJUI BOZ GVODUJPO UIBU EPFTOƊU IBOEMF
BMM QPTTJCMF JOQVUT TVDI BT

-- this'll blow up for any input not ``1''

f :: Int -> Bool


f 1 = True

*G ZPV DPNQJMF PS MPBE UIJT ZPVƊMM HFU BOPUIFS XBSOJOH BT


TVNJOH ZPV TUJMM IBWF -Wall UVSOFE PO
 *O UIJT DBTF CFDBVTF
Int JT B IVHF UZQF XJUI NBOZ WBMVFT JUƊT VTJOH OPUBUJPO UIBU TBZT
ZPVƊSF OPU IBOEMJOH BMM JOQVUT UIBU BSFOƊU UIF OVNCFS 

Pattern match(es) are non-exhaustive


In an equation for ‘f’:
Patterns not matched:
GHC.Types.I# #x with #x `notElem` [1#]

*G ZPV BEE BOPUIFS DBTF TVDI UIBU ZPVƊSF IBOEMJOH POF NPSF
JOQVU JU XJMM BEE UIBU UP UIF TFU PG WBMVFT ZPV BSF IBOEMJOH

f :: Int -> Bool


f 1 = True
f 2 = True

Pattern match(es) are non-exhaustive


In an equation for ‘f’:
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

Patterns not matched:


GHC.Types.I# #x with #x `notElem` [1#, 2#]

f :: Int -> Bool


f 1 = True
f 2 = True
f 3 = True

Pattern match(es) are non-exhaustive


In an equation for ‘f’:
Patterns not matched:
GHC.Types.I# #x with #x `notElem` [1#, 2#, 3#]

4P PO BOE TP GPSUI 5IF SFBM BOTXFS IFSF JT UP IBWF BO


VODPOEJUJPOBM DBTF UIBU NBUDIFT FWFSZUIJOH

-- This will compile without complaint


-- and is not partial.

f :: Int -> Bool


f 1 = True
f 2 = True
f 3 = True
f _ = False

"OPUIFS TPMVUJPO JT UP VTF B EBUBUZQF UIBU JTOƊU IVHF MJLF Int


JG ZPV POMZ IBWF B GFX DBTFT ZPV XBOU UP DPOTJEFS
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

-- Seriously. It's huge.

Prelude> minBound :: Int


-9223372036854775808
Prelude> maxBound :: Int
9223372036854775807

*G ZPV XBOU ZPVS EBUB UP EFTDSJCF POMZ B IBOEGVM PG DBTFT


XSJUF UIFN EPXO JO B TVN UZQF MJLF UIF DayOfWeek EBUBUZQF XF
TIPXFE ZPV FBSMJFS %POƊU VTF Int BT BO JNQMJDJU TVN UZQF BT $
QSPHSBNNFST DPNNPOMZ EP

4PNFUJNFT XF OFFE UP BTL GPS NPSF

8IFO XFƊSF XSJUJOH BO JOTUBODF PG B UZQFDMBTT TVDI BT Eq GPS


TPNFUIJOH XJUI QPMZNPSQIJD QBSBNFUFST TVDI BT Identity
CFMPX XFƊMM TPNFUJNFT OFFE UP SFRVJSF PVS BSHVNFOU PS BSHV
NFOUT UP QSPWJEF TPNF UZQFDMBTT JOTUBODFT GPS VT JO PSEFS UP
XSJUF BO JOTUBODF GPS UIF EBUBUZQF DPOUBJOJOH UIFN

data Identity a =
Identity a

instance Eq (Identity a) where


(==) (Identity v) (Identity v') = v == v'

8IBU XF XBOU UP EP IFSF JT SFMZ PO XIBUFWFS Eq JOTUBODFT UIF


BSHVNFOU UP Identity XSJUUFO BT Ԑ JO UIF EBUBUZQF EFDMBSBUJPO
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

BOE ԥ JO UIF JOTUBODF EFƶOJUJPO


IBT BMSFBEZ 5IFSF JT POF
QSPCMFN XJUI UIJT BT JU TUBOET UIPVHI

No instance for (Eq a) arising from a use of ‘==’


Possible fix: add (Eq a) to the
context of the instance declaration

In the expression: v == v'


In an equation for ‘==’:
(==) (Identity v) (Identity v') = v == v'
In the instance declaration for ‘Eq (Identity a)’

5IF QSPCMFN IFSF JT UIBU ԥ BOE ԥ஥ BSF CPUI PG UZQF Ԑ CVU


XF EPOƊU SFBMMZ LOPX BOZUIJOH BCPVU Ԑ *O UIJT DBTF XF DBOƊU
BTTVNF JU IBT BO Eq JOTUBODF )PXFWFS XF DBO VTF UIF TBNF
UZQFDMBTT DPOTUSBJOU TZOUBY XF TBX XJUI GVODUJPOT JO PVS JO
TUBODF EFDMBSBUJPO

instance Eq a => Eq (Identity a) where


(==) (Identity v) (Identity v') = v == v'

/PX JUƊMM XPSL CFDBVTF XF LOPX Ԑ IBT UP IBWF BO JOTUBODF PG


Eq "EEJUJPOBMMZ )BTLFMM XJMM FOTVSF XF EPOƊU BUUFNQU UP DIFDL
FRVBMJUZ XJUI WBMVFT UIBU EPOƊU IBWF BO Eq JOTUBODF BU DPNQJMF
UJNF

Prelude> Identity NoEqInst == Identity NoEqInst


$)"15&3  -&44 "%)0$ 10-:.031)*4. 

No instance for (Eq NoEqInst)


arising from a use of ‘==’

In the expression:
Identity NoEqInst == Identity NoEqInst

In an equation for ‘it’:


it = Identity NoEqInst == Identity NoEqInst

8F DPVME BTL GPS NPSF UIBO XF OFFE JO PSEFS UP PCUBJO BO


BOTXFS TVDI BT CFMPX XIFSF XF BTL GPS BO Ord JOTUBODF GPS Ԑ
CVU UIFSFƊT OP SFBTPO UP EP TP TJODF Eq SFRVJSFT MFTT UIBO Ord
BOE EPFT FOPVHI GPS XIBU XF OFFE IFSF

instance Ord a => Eq (Identity a) where


(==) (Identity v) (Identity v') =
compare v v' == EQ

5IBU XJMM DPNQJMF CVU JUƊT OPU DMFBS XIZ ZPVƊE EP JU .BZCF
ZPV IBWF ZPVS PXO TFDSFU SFBTPOT

&YFSDJTFT &R *OTUBODFT

8SJUF UIF Eq JOTUBODF GPS UIF EBUBUZQF QSPWJEFE

 *UƊT OPU B UZQP XFƊSF KVTU CFJOH DVUF XJUI UIF OBNF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

data TisAnInteger =
TisAn Integer

 data TwoIntegers =
Two Integer Integer

 data StringOrInt =
TisAnInt Int
| TisAString String

 data Pair a =
Pair a a

 data Tuple a b =
Tuple a b

 data Which a =
ThisOne a
| ThatOne a

 data EitherOr a b =
Hello a
| Goodbye b

 /VN
8F IBWF TFFO B MPU PG Num BU UIJT QPJOU TP XFƊMM USZ OPU UP HP
PO UPP MPOH BCPVU JU *U JT B UZQFDMBTT JNQMFNFOUFE CZ NPTU
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

OVNFSJD UZQFT "T XF EJE XJUI Eq XF XJMM RVFSZ UIF JOGPSNBUJPO


BOE FYBNJOF JUT TFU PG QSFEFƶOFE GVODUJPOT

class Num a where


(+) :: a -> a -> a
(*) :: a -> a -> a
(-) :: a -> a -> a
negate :: a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a

"OE JUT MJTU PG JOTUBODFT OPU RVJUF DPNQMFUF




instance Num Integer


instance Num Int
instance Num Float
instance Num Double

8FƊWF TFFO NPTU PG UIJT JOGPSNBUJPO CFGPSF JO POF GPSN


PS BOPUIFS DPNNPO BSJUINFUJD GVODUJPOT XJUI UIFJS UZQF
TJHOBUVSFT BU UIF UPQ fromInteger JT TJNJMBS UP fromIntegral CVU
SFTUSJDUFE UP Integer SBUIFS UIBO BMM JOUFHSBM OVNCFST
QMVT B MJTU
PG UZQFT UIBU JNQMFNFOU UIJT UZQFDMBTT OVNFSJD UZQFT XFƊWF
MPPLFE BU QSFWJPVTMZ /P TVSQSJTFT IFSF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

*OUFHSBM
5IF UZQFDMBTT DBMMFE Integral IBT UIF GPMMPXJOH EFƶOJUJPO

class (Real a, Enum a) => Integral a where


quot :: a -> a -> a
rem :: a -> a -> a
div :: a -> a -> a
mod :: a -> a -> a
quotRem :: a -> a -> (a, a)
divMod :: a -> a -> (a, a)
toInteger :: a -> Integer

5IF UZQFDMBTT DPOTUSBJOU (Real a, Enum a) => NFBOT UIBU BOZ


UZQF UIBU JNQMFNFOUT Integral NVTU BMSFBEZ IBWF JOTUBODFT GPS
Real BOE Enum UZQFDMBTTFT *O B WFSZ SFBM TFOTF UIF UVQMF TZOUBY
IFSF EFOPUFT UIF DPOKVODUJPO PG UZQFDMBTT DPOTUSBJOUT PO ZPVS
UZQF WBSJBCMFT "O JOUFHSBM UZQF NVTU CF CPUI B SFBM OVNCFS
BOE FOVNFSBCMF NPSF PO Enum MBUFS
BOE UIFSFGPSF NBZ FN
QMPZ UIF NFUIPET FBDI PG UIPTF UZQFDMBTTFT *O UVSO UIF Real
UZQFDMBTT JUTFMG SFRVJSFT BO JOTUBODF PG Num 4P UIF Integral
UZQFDMBTT NBZ QVU UIF NFUIPET PG Real BOE Num JOUP FƵFDU JO
BEEJUJPO UP UIPTF PG Enum
 4JODF Real DBOOPU PWFSSJEF UIF NFUI
PET PG Num UIJT UZQFDMBTT JOIFSJUBODF JT POMZ BEEJUJWF BOE UIF
BNCJHVJUZ QSPCMFNT DBVTFE CZ NVMUJQMF JOIFSJUBODF JO TPNF
QSPHSBNNJOH MBOHVBHFT ƈ UIF TPDBMMFE ƌEFBEMZ EJBNPOE PG
EFBUIƍ ƈ BSF BWPJEFE
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

&YFSDJTFT 5VQMF &YQFSJNFOU -PPL BU UIF UZQFT HJWFO GPS


quotRem BOE divMod 8IBU EP ZPV UIJOL UIPTF GVODUJPOT EP 5FTU
ZPVS IZQPUIFTFT CZ QMBZJOH XJUI UIFN JO UIF 3&1- 8FƊWF
HJWFO ZPV B TBNQMF UP TUBSU XJUI CFMPX

Prelude> let ones x = snd (divMod x 10)

'SBDUJPOBM
Num JT B TVQFSDMBTT PG Fractional 5IF Fractional UZQFDMBTT JT
EFƶOFE BT GPMMPXT

class (Num a) => Fractional a where


(/) :: a -> a -> a
recip :: a -> a
fromRational :: Rational -> a

5IJT UZQFDMBTT EFDMBSBUJPO DSFBUFT B DMBTT OBNFE Fractional


XIJDI SFRVJSFT JUT UZQF BSHVNFOU Ԑ UP IBWF BO JOTUBODF PG Num
JO PSEFS UP DSFBUF BO JOTUBODF PG Fractional 5IJT JT BOPUIFS
FYBNQMF PG UZQFDMBTT JOIFSJUBODF Fractional BQQMJFT UP GFXFS
OVNCFST UIBO Num EPFT BOE JOTUBODFT PG UIF Fractional DMBTT
DBO VTF UIF GVODUJPOT EFƶOFE JO Num CVU OPU BMM Num DBO VTF
UIF GVODUJPOT EFƶOFE JO Fractional CFDBVTF OPUIJOH JO NumƊT
EFƶOJUJPO SFRVJSFT BO JOTUBODF PG Fractional 5IFSF JT B DIBSU
BU UIF FOE PG UIF DIBQUFS UP IFMQ ZPV WJTVBMJ[F UIJT JOGPSNBUJPO
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

8F DBO TFF UIJT XJUI PSEJOBSZ GVODUJPOT


'JSTU MFU VT DPOTJEFS UIJT GVODUJPO JOUFOUJPOBMMZ XJUIPVU B
UZQF QSPWJEFE

divideThenAdd x y = (x / y) + 1

8FƊMM MPBE UIJT XJUI B UZQF UIBU BTLT POMZ GPS B Num JOTUBODF

divideThenAdd :: Num a => a -> a -> a


divideThenAdd x y = (x / y) + 1

"OE ZPVƊMM HFU UIF UZQF FSSPS

Could not deduce (Fractional a)


arising from a use of ‘/’
from the context (Num a)
bound by the type signature for
divideThenAdd :: Num a => a -> a -> a

/PX JG XF POMZ DBSFE BCPVU IBWJOH UIF Num DPOTUSBJOU XF


DPVME NPEJGZ PVS GVODUJPO UP OPU VTF (/) XIJDI SFRVJSFT Fractional

-- This works fine.


-- (+) and (-) are both provided by Num

subtractThenAdd :: Num a => a -> a -> a


subtractThenAdd x y = (x - y) + 1
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

0S XF DBO DIBOHF UIF UZQF SBUIFS UIBO NPEJGZJOH UIF GVOD


UJPO JUTFMG

-- This works fine.

divideThenAdd :: Fractional a => a -> a -> a


divideThenAdd x y = (x / y) + 1

1VU PO ZPVS UIJOLJOH DBQ 8IZ EJEOƊU XF OFFE UP NBLF UIF


UZQF PG UIF GVODUJPO XF XSPUF SFRVJSF CPUI UZQFDMBTTFT 8IZ
EJEOƊU XF IBWF UP EP UIJT

f :: (Num a, Fractional a) => a -> a -> a

$POTJEFS XIBU JU NFBOT GPS TPNFUIJOH UP CF B TVCTFU PG B


MBSHFS TFU PG PCKFDUT

 5ZQFEFGBVMUJOH UZQFDMBTTFT


8IFO ZPV IBWF B UZQFDMBTTDPOTUSBJOFE BE IPD
QPMZNPSQIJD
WBMVF BOE OFFE UP FWBMVBUF JU UIF QPMZNPSQIJTN NVTU CF SF
TPMWFE UP B TQFDJƶD DPODSFUF UZQF 5IF DPODSFUF UZQF NVTU
IBWF BO JOTUBODF GPS BMM UIF SFRVJSFE UZQFDMBTT JOTUBODFT UIBU
JT JG JU JT SFRVJSFE UP JNQMFNFOU Num BOE Fractional UIFO UIF
DPODSFUF UZQF DBOƊU CF BO Int
 0SEJOBSJMZ UIF DPODSFUF UZQF
XPVME DPNF GSPN UIF UZQF TJHOBUVSF ZPVƊWF TQFDJƶFE PS GSPN
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

UZQF JOGFSFODF TVDI BT XIFO B Num a => a JT VTFE JO BO FYQSFT


TJPO UIBU FYQFDUT BO Integer XIJDI GPSDFT UIF QPMZNPSQIJD
OVNCFS WBMVF UP DPODSFUJ[F BT BO Integer #VU JO TPNF DBTFT
QBSUJDVMBSMZ XIFO ZPVƊSF XPSLJOH JO UIF ()$J 3&1- ZPV XJMM
OPU IBWF TQFDJƶFE B DPODSFUF UZQF GPS B QPMZNPSQIJD WBMVF *O
UIPTF TJUVBUJPOT UIF UZQFDMBTT XJMM EFGBVMU UP B DPODSFUF UZQF
BOE UIF EFGBVMU UZQFT BSF BMSFBEZ TFU JO UIF MJCSBSJFT
8IFO XF EP UIJT JO UIF 3&1-

Prelude> 1 / 2
0.5

0VS SFTVMU 0.5 BQQFBST UIF XBZ JU EPFT CFDBVTF JU EFGBVMUT UP


Double 6TJOH UIF UZQF BTTJHONFOU PQFSBUPS :: XF DBO BTTJHO B
NPSF TQFDJƶD UZQF BOE DJSDVNWFOU UIF EFGBVMU UP Double

Prelude> 1 / 2 :: Float
0.5
Prelude> 1 / 2 :: Double
0.5
Prelude> 1 / 2 :: Rational
1 % 2

5IF )BTLFMM 3FQPSU TQFDJƶFT UIF GPMMPXJOH EFGBVMUT SFMFWBOU


UP OVNFSJDBM DPNQVUBUJPOT

5IF )BTLFMM 3FQPSU JT UIF TUBOEBSE UIBU TQFDJƶFT UIF MBOHVBHF BOE TUBOEBSE MJCSBSJFT
GPS )BTLFMM 5IF NPTU SFDFOU WFSTJPO JT )BTLFMM 3FQPSU  XIJDI DBO CF GPVOE BU
https://www.haskell.org/onlinereport/haskell2010/
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

default Num Integer


default Real Integer
default Enum Integer
default Integral Integer
default Fractional Double
default RealFrac Double
default Floating Double
default RealFloat Double

Num Real FUD BSF UZQFDMBTTFT BOE Integer BOE Double BSF
UIF UZQFT UIFZ EFGBVMU UP 5IJT UZQF EFGBVMUJOH GPS Fractional
NFBOT UIBU

(/) :: Fractional a => a -> a -> a

DIBOHFT UP

(/) :: Double -> Double -> Double

JG ZPV EPOƊU TQFDJGZ UIF DPODSFUF UZQF EFTJSFE GPS (/) "
TJNJMBS FYBNQMF CVU GPS Integral XPVME CF

div :: Integral a => a -> a -> a

EFGBVMUJOH UP

div :: Integer -> Integer -> Integer


$)"15&3  -&44 "%)0$ 10-:.031)*4. 

5IF UZQFDMBTT DPOTUSBJOU JT TVQFSƷVPVT XIFO UIF UZQFT BSF


DPODSFUF 0O UIF PUIFS IBOE ZPV NVTU TQFDJGZ XIJDI UZQF
DMBTTFT ZPV XBOU UZQF WBSJBCMFT UP IBWF JNQMFNFOUFE 5IF VTF
PG QPMZNPSQIJD WBMVFT XJUIPVU UIF BCJMJUZ UP JOGFS B TQFDJƶD
UZQF BOE OP EFGBVMU SVMF XJMM DBVTF ()$ UP DPNQMBJO BCPVU BO
BNCJHVPVT UZQF
5IF GPMMPXJOH XJMM XPSL CFDBVTF BMM UIF UZQFT CFMPX JNQMF
NFOU UIF Num UZQFDMBTT

Prelude> let x = 5 + 5 :: Int


Prelude> x
10

Prelude> let x = 5 + 5 :: Integer


Prelude> x
10

Prelude> let x = 5 + 5 :: Float


Prelude> x
10.0

Prelude> let x = 5 + 5 :: Double


Prelude> x
10.0

/PX XF DBO NBLF UIJT UZQF NPSF TQFDJƶD BOE UIF QSPDFTT
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

XJMM CF TJNJMBS *O UIJT DBTF MFUƊT VTF Integer XIJDI JNQMFNFOUT


Num

let x = 10 :: Integer

let y = 5 :: Integer

-- These are the declared types for these


-- functions, because they're from Num.
(+) :: Num a => a -> a -> a
(*) :: Num a => a -> a -> a
(-) :: Num a => a -> a -> a

/PX BOZ GVODUJPOT GSPN Num BSF HPJOH UP BVUPNBUJDBMMZ HFU


TQFDJBMJ[FE UP Integer XIFO XF BQQMZ UIFN UP UIF ԧ PS Ԩ WBMVFT

Prelude> :t (x+)
(x+) :: Integer -> Integer

-- For
(+) :: Num a => a -> a -> a
-- When 'a' is Integer
(+) :: Integer -> Integer -> Integer
-- Apply the first argument
(x+) :: Integer -> Integer
-- Applying the second and last argument
(x+y) :: Integer
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

-- Final result was Integer.

8F DBO EFDMBSF NPSF TQFDJƶD NPOPNPSQIJD


GVODUJPOT
GSPN NPSF HFOFSBM QPMZNPSQIJD
GVODUJPOT

let add = (+) :: Integer -> Integer -> Integer

8F DBOOPU HP JO UIF PUIFS EJSFDUJPO CFDBVTF XF MPTU UIF


HFOFSBMJUZ PG Num XIFO XF TQFDJBMJ[FE UP Integer

Prelude> :t id
id :: a -> a
Prelude> let numId = id :: Num a => a -> a
Prelude> let intId = numId :: Integer -> Integer
Prelude> let altNumId = intId :: Num a => a -> a

Could not deduce (a1 ~ Integer)


from the context (Num a)
bound by the inferred type of
altNumId :: Num a => a -> a

or from (Num a1)


bound by an expression type signature:
Num a1 => a1 -> a1

‘a1’ is a rigid type variable bound by


an expression type signature:
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

Num a1 => a1 -> a1

Expected type: a1 -> a1


Actual type: Integer -> Integer
In the expression: intId :: Num a => a -> a

In an equation for ‘altNumId’:


altNumId = intId :: Num a => a -> a

5IF FYQFDUFE UZQF BOE UIF BDUVBM UZQF EPOƊU NBUDI 3FNFNCFS
UIF BDUVBM UZQF JT UIF UZQF XF QSPWJEFE UIF FYQFDUFE UZQF
JT XIBU UIF DPNQJMFS FYQFDUT )FSF UIF BDUVBM UZQF JT NPSF
DPODSFUF UIBO UIF FYQFDUFE UZQF 5ZQFT DBO CF NBEF NPSF
TQFDJƶD CVU OPU NPSF HFOFSBM PS QPMZNPSQIJD

 0SE
/FYU XFƊMM UBLF B MPPL BU B UZQFDMBTT DBMMFE Ord 8FƊWF QSFWJPVTMZ
OPUFE UIBU UIJT UZQFDMBTT DPWFST UIF UZQFT PG UIJOHT UIBU DBO CF
QVU JO PSEFS *G ZPV VTF :info GPS Ord JO ZPVS 3&1- ZPV XJMM
ƶOE B WFSZ MBSHF OVNCFS PG JOTUBODFT GPS UIJT UZQFDMBTT 8FƊSF
HPJOH UP QBSF JU EPXO B CJU BOE GPDVT PO UIF FTTFOUJBMT CVU BT
BMXBZT XF FODPVSBHF ZPV UP FYQMPSF UIJT GVSUIFS PO ZPVS PXO

Prelude> :info Ord


$)"15&3  -&44 "%)0$ 10-:.031)*4. 

class Eq a => Ord a where


compare :: a -> a -> Ordering
(<) :: a -> a -> Bool
(>=) :: a -> a -> Bool
(>) :: a -> a -> Bool
(<=) :: a -> a -> Bool
max :: a -> a -> a
min :: a -> a -> a

instance Ord a => Ord (Maybe a)


instance (Ord a, Ord b) => Ord (Either a b)
instance Ord Integer
instance Ord a => Ord [a]
instance Ord Ordering
instance Ord Int
instance Ord Float
instance Ord Double
instance Ord Char
instance Ord Bool

/PUBCMZ BU UIF UPQ XF IBWF BOPUIFS UZQFDMBTT DPOTUSBJOU


Ord JT DPOTUSBJOFE CZ Eq CFDBVTF JG ZPVƊSF HPJOH UP DPNQBSF
JUFNT JO B MJTU BOE QVU UIFN JO PSEFS ZPV OFFE B XBZ UP EF
UFSNJOF JG UIFZ BSF FRVBM 4P Ord SFRVJSFT Eq BOE JUT NFUIPET
5IF GVODUJPOT UIBU DPNF TUBOEBSE JO UIJT DMBTT IBWF UP EP XJUI
PSEFSJOH 4PNF PG UIFN XJMM HJWF ZPV B SFTVMU PG Bool BOE
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

XFƊWF QMBZFE B CJU XJUI UIPTF GVODUJPOT -FUƊT TFF XIBU B GFX
PUIFST EP

Prelude> compare 7 8
LT
Prelude> compare 4 (-4)
GT
Prelude> compare 4 4
EQ
Prelude> compare "Julie" "Chris"
GT
Prelude> compare True False
GT
Prelude> compare True True
EQ

5IF compare GVODUJPO XPSLT GPS BOZ PG UIF UZQFT MJTUFE BCPWF
UIBU JNQMFNFOU UIF Ord UZQFDMBTT JODMVEJOH Bool CVU VOMJLF
UIF <, >, >=, and <= PQFSBUPST UIJT SFUVSOT BO Ordering WBMVF
JOTUFBE PG B Bool WBMVF
:PV NBZ OPUJDF UIBU True JT HSFBUFS UIBO False 1SPYJNBMMZ
UIJT JT EVF UP IPX UIF Bool EBUBUZQF JT EFƶOFE False | True
5IFSF NBZ CF B NPSF JOUFSFTUJOH VOEFSMZJOH SFBTPO JG ZPV
QSFGFS UP QPOEFS UIF QIJMPTPQIJDBM JNQMJDBUJPOT
5IF max BOE min GVODUJPOT XPSL JO B TJNJMBSMZ TUSBJHIUGPS
XBSE GBTIJPO GPS BOZ UZQF UIBU JNQMFNFOUT UIJT UZQFDMBTT
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

Prelude> max 7 8
8
Prelude> min 10 (-10)
-10
Prelude> max (3, 4) (2, 3)
(3,4)
Prelude> min [2, 3, 4, 5] [3, 4, 5, 6]
[2,3,4,5]
Prelude> max "Julie" "Chris"
"Julie"

#Z MPPLJOH BU UIF UZQF TJHOBUVSF XF DBO TFF UIBU UIFTF GVOD


UJPOT IBWF UXP QBSBNFUFST *G ZPV XBOU UP VTF UIFTF UP EFUFS
NJOF UIF NBYJNVN PS NJOJNVN PG UISFF WBMVFT ZPV DBO OFTU
UIFN

Prelude> max 7 (max 8 9)


9

*G ZPV USZ UP HJWF JU UPP GFX BSHVNFOUT ZPV XJMM HFU UIJT
TUSBOHFTFFFNJOH NFTTBHF

Prelude> max "Julie"

No instance for (Show ([Char] -> [Char]))


-- [1] [2] [ 3 ]
arising from a use of ‘print’
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

-- [4]
In a stmt of an interactive GHCi command: print it
-- [ 5 ]

 )BTLFMM DPVMEOƊU ƶOE BO JOTUBODF PG B UZQFDMBTT GPS B WBMVF


PG B HJWFO UZQF

 5IF UZQFDMBTT JU DPVMEOƊU ƶOE BO JOTUBODF GPS XBT Show UIF


UZQFDMBTT UIBU BMMPXT ()$J UP QSJOU WBMVFT JO ZPVS UFSNJOBM
.PSF PO UIJT JO UIF GPMMPXJOH TFDUJPOT

 *U DPVMEOƊU ƶOE BO JOTUBODF PG Show GPS UIF UZQF String ->


String /PUIJOH XJUI UZQF (->) TIPVME IBWF B Show JOTUBODF
BT B HFOFSBM SVMF CFDBVTF (->) EFOPUFT B GVODUJPO SBUIFS
UIBO B DPOTUBOU WBMVF

 8F XBOUFE BO JOTUBODF PG Show CFDBVTF XF JOEJSFDUMZ

JOWPLFE print XIJDI IBT UZQF print :: Show a => a -> IO


() ƈ OPUF UIF DPOTUSBJOU GPS Show

 5IF JOUFSBDUJWF ()$J DPNNBOE print it JOWPLFE print


PO PVS CFIBMG

"OZ UJNF XF BTL ()$J UP QSJOU B SFUVSO WBMVF JO PVS UFS


NJOBM XF BSF JOEJSFDUMZ JOWPLJOH print XIJDI IBT UIF UZQF
Show a => a -> IO () 5IF ƶSTU BSHVNFOU UP print NVTU IBWF BO
JOTUBODF PG Show 5IF FSSPS NFTTBHF JT CFDBVTF max BQQMJFE UP
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

B TJOHMF String BSHVNFOU OFFET BOPUIFS BSHVNFOU CFGPSF JUƊMM


SFUVSO B String BLB [Char]
WBMVF UIBU JT ShowBCMF PS QSJOUBCMF
6OUJM XF BQQMZ JU UP B TFDPOE BSHVNFOU JUƊT TUJMM B GVODUJPO
BOE B GVODUJPO IBT OP JOTUBODF PG Show 5IF SFRVFTU UP print
B GVODUJPO SBUIFS UIBO B DPOTUBOU WBMVF SFTVMUT JO UIJT FSSPS
NFTTBHF

0SE JOTUBODFT
8FƊMM TFF NPSF FYBNQMFT PG XSJUJOH JOTUBODFT BT XF QSPDFFE
JO UIF CPPL BOE FYQMBJO NPSF UIPSPVHIMZ IPX UP XSJUF ZPVS
PXO EBUBUZQFT 8F XSPUF TPNF Eq JOTUBODFT FBSMJFS /PX XFƊMM
QSBDUJDF PVS JOTUBODFXSJUJOH TLJMMT UIJT JT POF PG UIF NPTU
OFDFTTBSZ TLJMMT JO )BTLFMM
CZ XSJUJOH Ord JOTUBODFT
8IFO ZPV EFSJWF Ord JOTUBODFT GPS B EBUBUZQF UIFZ SFMZ PO
UIF XBZ UIF EBUBUZQF JT EFƶOFE CVU JG ZPV XSJUF ZPVS PXO
JOTUBODF ZPV DBO EFƶOF UIF CFIBWJPS ZPV XBOU 8FƊMM VTF UIF
EBZT PG UIF XFFL BHBJO UP EFNPOTUSBUF

data DayOfWeek =
Mon | Tue | Weds | Thu | Fri | Sat | Sun
deriving (Ord, Show)

8F POMZ EFSJWFE Ord BOE Show UIFSF CFDBVTF ZPV TIPVME TUJMM
IBWF UIF Eq JOTUBODF XF XSPUF GPS UIJT EBUBUZQF JO TDPQF *G ZPV
EPOƊU ZPV IBWF UXP PQUJPOT CSJOH JU CBDL JOUP TDPQF CZ QVUUJOH
JU JOUP UIF ƶMF ZPVƊSF DVSSFOUMZ VTJOH PS EFSJWF BO Eq JOTUBODF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

GPS UIF EBUBUZQF OPX CZ BEEJOH JU JOTJEF UIF QBSFOUIFTFT :PV


DBOƊU IBWF BO Ord JOTUBODF VOMFTT ZPV BMTP IBWF BO Eq JOTUBODF
TP UIF DPNQJMFS XJMM DPNQMBJO JG ZPV EPOƊU EP POF OPU CPUI

PG UIPTF UXP UIJOHT


7BMVFT UP UIF MFǒ BSF ƌMFTT UIBOƍ WBMVFT UP UIF SJHIU BT JG UIFZ
XFSF QMBDFE PO B OVNCFS MJOF

*Main> Mon > Tue


False
*Main> Sun > Mon
True
*Main> compare Tue Weds
LT

#VU JG XF XBOUFE UP FYQSFTT UIBU 'SJEBZ JT BMXBZT UIF CFTU


EBZ XF DBO XSJUF PVS PXO Ord JOTUBODF UP FYQSFTT UIBU

data DayOfWeek =
Mon | Tue | Weds | Thu | Fri | Sat | Sun
deriving (Eq, Show)

instance Ord DayOfWeek where


compare Fri Fri = EQ
compare Fri _ = GT
compare _ Fri = LT
compare _ _ = EQ
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

/PX JG XF DPNQBSF 'SJEBZ UP BOZ PUIFS EBZ 'SJEBZ JT BMXBZT


HSFBUFS "MM PUIFS EBZT ZPV OPUJDF BSF FRVBM JO WBMVF

*Main> compare Fri Sat


GT
*Main> compare Sat Mon
EQ
*Main> compare Fri Mon
GT
*Main> compare Sat Fri
LT
*Main> Mon > Fri
False
*Main> Fri > Sat
True

#VU XF EJE EFSJWF BO Eq JOTUBODF BCPWF TP XF EP HFU UIF


FYQFDUFE FRVBMJUZ CFIBWJPS

*Main> Sat == Mon


False
*Main> Fri == Fri
True

" GFX UIJOHT UP LFFQ JO NJOE BCPVU XSJUJOH Ord JOTUBODFT


'JSTU JU JT XJTF UP FOTVSF UIBU ZPVS Ord JOTUBODFT BHSFF XJUI ZPVS
Eq JOTUBODFT XIFUIFS UIF Eq JOTUBODFT BSF EFSJWFE PS NBOVBMMZ
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

XSJUUFO *G x == y UIFO compare x y TIPVME SFUVSO EQ "MTP ZPV


XBOU ZPVS Ord JOTUBODFT UP EFƶOF B TFOTJCMF UPUBM PSEFS :PV
FOTVSF UIJT JO QBSU CZ DPWFSJOH BMM DBTFT BOE OPU XSJUJOH QBSUJBM
JOTUBODFT BT XF OPUFE BCPWF XJUI Eq *O HFOFSBM ZPVS Ord
JOTUBODF TIPVME CF XSJUUFO TVDI UIBU XIFO compare x y SFUVSOT
LT UIFO compare y x SFUVSOT GT
8FƊMM MPPL JOUP XSJUJOH PVS PXO UZQFDMBTTFT BOE UZQFDMBTT
JOTUBODFT NPSF MBUFS JO UIF CPPL

0SE JNQMJFT &R


5IF GPMMPXJOH JTOƊU HPJOH UP UZQFDIFDL GPS SFBTPOT XF BMSFBEZ
DPWFSFE

check' :: a -> a -> Bool


check' a a' = a == a'

5IF FSSPS XF HFU NFOUJPOT UIBU XF OFFE Eq XIJDI NBLFT


TFOTF

No instance for (Eq a) arising from a use of ‘==’


Possible fix:
add (Eq a) to the context of
the type signature for check' :: a -> a -> Bool
In the expression: a == a'
In an equation for ‘check'’: check' a a' = a == a'

#VU XIBU JG XF BEE Ord JOTUFBE PG Eq BT JU BTLT


$)"15&3  -&44 "%)0$ 10-:.031)*4. 

check' :: Ord a => a -> a -> Bool


check' a a' = a == a'

*U TIPVME DPNQJMF KVTU ƶOF /PX Ord JTOƊU XIBU ()$ BTLFE
GPS TP XIZ EJE JU XPSL *U XPSLFE CFDBVTF BOZUIJOH UIBU QSP
WJEFT BO JOTUBODF PG Ord NVTU CZ EFƶOJUJPO BMTP BMSFBEZ IBWF BO
JOTUBODF PG Eq )PX EP XF LOPX "T XF TBJE BCPWF MPHJDBMMZ JU
NBLFT TFOTF UIBU ZPV DBOƊU PSEFS UIJOHT XJUIPVU UIF BCJMJUZ UP
DIFDL GPS FRVBMJUZ CVU XF DBO BMTP DIFDL :info Ord JO ()$J

Prelude> :info Ord


class Eq a => Ord a where

... buncha noise we don't care about...

5IF DMBTT EFƶOJUJPO PG Ord TBZT UIBU BOZ Ԑ XIJDI XBOUT UP


EFƶOF BO Ord JOTUBODF NVTU BMSFBEZ QSPWJEF BO Eq JOTUBODF 8F
DBO TBZ UIBU Eq JT B TVQFSDMBTT PG Ord
6TVBMMZ ZPV XBOU UIF NJOJNBMMZ TVƸDJFOU TFU PG DPOTUSBJOUT
PO BMM ZPVS GVODUJPOT ƈ TP XF XPVME VTF Eq JOTUFBE PG Ord JG UIF
BCPWF FYBNQMF XBT ƌSFBMƍ DPEF ƈ CVU XF EJE UIJT TP ZPV DPVME
HFU BO JEFB PG IPX DPOTUSBJOUT BOE TVQFSDMBTTJOH JO )BTLFMM
XPSL

&YFSDJTFT 8JMM 5IFZ 8PSL


/FYU UBLF B MPPL BU UIF GPMMPXJOH DPEF FYBNQMFT BOE USZ UP
EFDJEF JG UIFZ XJMM XPSL XIBU SFTVMU UIFZ XJMM SFUVSO JG UIFZ EP
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

BOE XIZ PS XIZ OPU CF TVSF BT BMXBZT UP UFTU UIFN JO ZPVS


3&1- PODF ZPV IBWF EFDJEFE PO ZPVS BOTXFS


 max (length [1, 2, 3]) (length [8, 9, 10, 11, 12])

 compare (3 * 4) (3 * 5)

 compare "Julie" True

 (5 + 3) > (3 + 6)

 &OVN
" UZQFDMBTT LOPXO BT Enum UIBU XF IBWF NFOUJPOFE QSFWJPVTMZ
TFFNT TJNJMBS UP Ord CVU JT TMJHIUMZ EJƵFSFOU 5IJT UZQFDMBTT
DPWFST UZQFT UIBU BSF FOVNFSBCMF UIFSFGPSF IBWF LOPXO QSF
EFDFTTPST BOE TVDDFTTPST 8F TIBMM USZ OPU UP CFMBCPS UIF QPJOU
CFDBVTF ZPV BSF QSPCBCMZ EFWFMPQJOH B HPPE JEFB PG IPX UP
RVFSZ BOE NBLF VTF PG UZQFDMBTT JOGPSNBUJPO

Prelude> :info Enum


class Enum a where
succ :: a -> a
pred :: a -> a
toEnum :: Int -> a
fromEnum :: a -> Int
enumFrom :: a -> [a]
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

enumFromThen :: a -> a -> [a]


enumFromTo :: a -> a -> [a]
enumFromThenTo :: a -> a -> a -> [a]

instance Enum Ordering


instance Enum Integer
instance Enum Int
instance Enum Char
instance Enum Bool
instance Enum ()
instance Enum Float
instance Enum Double

/VNCFST BOE DIBSBDUFST BSF LOPXO UP IBWF QSFEJDUBCMF


TVDDFTTPST BOE QSFEFDFTTPST TP UIFTF BSF QBSBEJHNBUJD DBTFT
PG FOVNFSBCJMJUZ

Prelude> succ 4
5
Prelude> pred 'd'
'c'
Prelude> succ 4.5
5.5

:PV DBO BMTP TFF UIBU TPNF PG UIFTF GVODUJPOT SFUVSO B SFTVMU
PG B MJTU UZQF 5IFZ UBLF B TUBSUJOH WBMVF BOE CVJME B MJTU XJUI
UIF TVDDFFEJOH JUFNT PG UIF TBNF UZQF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

Prelude> enumFromTo 3 8
[3,4,5,6,7,8]
Prelude> enumFromTo 'a' 'f'
"abcdef"

'JOBMMZ MFUƊT UBLF B TIPSU MPPL BU enumFromThenTo

Prelude> enumFromThenTo 1 10 100


[1,10,19,28,37,46,55,64,73,82,91,100]

5BLF B MPPL BU UIF SFTVMUJOH MJTU BOE TFF JG ZPV DBO ƶOE UIF
QBUUFSO XIBU EPFT UIJT GVODUJPO EP 8IBU IBQQFOT JG XF HJWF
JU UIF WBMVFT 0 10 100 JOTUFBE )PX BCPVU 'a' 'c' 'z'

 4IPX
Show JT B UZQFDMBTT UIBU QSPWJEFT GPS UIF DSFBUJOH PG IVNBO
SFBEBCMF TUSJOH SFQSFTFOUBUJPOT PG TUSVDUVSFE EBUB ()$J VTFT
Show UP DSFBUF String WBMVFT JU DBO QSJOU JO UIF UFSNJOBM
Show JT OPU B TFSJBMJ[BUJPO GPSNBU 4FSJBMJ[BUJPO JT IPX EBUB
JT SFOEFSFE UP B UFYUVBM PS CJOBSZ GPSNBU GPS QFSTJTUFODF PS
DPNNVOJDBUJOH XJUI PUIFS DPNQVUFST PWFS B OFUXPSL "O
FYBNQMF PG QFSTJTUFODF XPVME CF TBWJOH EBUB UP B ƶMF PO EJTL
Show JT OPU TVJUBCMF GPS BOZ PG UIFTF QVSQPTFT JUƊT FYQSFTTMZ GPS
IVNBO SFBEBCJMJUZ
5IF UZQFDMBTT JOGPSNBUJPO MPPLT MJLF UIJT USVODBUFE

$)"15&3  -&44 "%)0$ 10-:.031)*4. 

class Show a where


showsPrec :: Int -> a -> ShowS
show :: a -> String
showList :: [a] -> ShowS

instance Show a => Show [a]


instance Show Ordering
instance Show a => Show (Maybe a)
instance Show Integer
instance Show Int
instance Show Char
instance Show Bool
instance Show ()
instance Show Float
instance Show Double

*NQPSUBOUMZ XF TFF UIBU WBSJPVT OVNCFS UZQFT Bool WBMVFT


UVQMFT BOE DIBSBDUFST BSF BMM BMSFBEZ JOTUBODFT PG Show 5IBU JT
UIFZ IBWF B EFƶOFE BCJMJUZ UP CF QSJOUFE UP UIF TDSFFO 5IFSF JT
BMTP B GVODUJPO show XIJDI UBLFT B QPMZNPSQIJD Ԑ BOE SFUVSOT
JU BT B String BMMPXJOH JU UP CF QSJOUFE

1SJOUJOH BOE TJEF FƵFDUT


8IFO ZPV BTL ()$J UP SFUVSO UIF SFTVMU PG BO FYQSFTTJPO BOE
QSJOU JU UP UIF TDSFFO ZPV BSF JOEJSFDUMZ JOWPLJOH B GVODUJPO
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

DBMMFE print UIBU XF FODPVOUFSFE CSJFƷZ JO UIF DIBQUFS BCPVU


QSJOUJOH BOE BHBJO JO UIF TFDUJPO BCPVU Ord BOE UIF FSSPS NFT
TBHF UIBU SFTVMUT GSPN QBTTJOH UIF max GVODUJPO UPP GFX BSHV
NFOUT "T VOEFSTUBOEJOH print JT JNQPSUBOU UP VOEFSTUBOEJOH
UIJT UZQFDMBTT XFƊSF HPJOH UP EJHSFTT B CJU BOE UBML BCPVU JU JO
NPSF EFUBJM
)BTLFMM JT B QVSF GVODUJPOBM QSPHSBNNJOH MBOHVBHF 5IF
ƌGVODUJPOBMƍ QBSU PG UIBU DPNFT GSPN UIF GBDU UIBU QSPHSBNT
BSF XSJUUFO BT GVODUJPOT TJNJMBS UP NBUIFNBUJDBM FRVBUJPOT JO
XIJDI BO PQFSBUJPO JT BQQMJFE UP TPNF BSHVNFOUT UP QSPEVDF
B SFTVMU 5IF ƌQVSFƍ QBSU PG PVS EFTDSJQUJPO PG )BTLFMM NFBOT
FYQSFTTJPOT JO )BTLFMM DBO CF FYQSFTTFE FYDMVTJWFMZ JO UFSNT
PG B MBNCEB DBMDVMVT
*U NBZ OPU TFFN PCWJPVT UIBU QSJOUJOH SFTVMUT UP UIF TDSFFO
DPVME CF B TPVSDF PG XPSSZ 5IF GVODUJPO JT OPU KVTU BQQMJFE
UP UIF BSHVNFOUT UIBU BSF JO JUT TDPQF CVU BMTP BTLFE UP BƵFDU
UIF XPSME PVUTJEF JUT TDPQF JO TPNF XBZ OBNFMZ CZ TIPXJOH
ZPV JUT SFTVMU PO B TDSFFO 5IJT JT LOPXO BT B TJEF FƵFDU B QP
UFOUJBMMZ PCTFSWBCMF SFTVMU BQBSU GSPN UIF WBMVF UIF FYQSFTTJPO
FWBMVBUFT UP )BTLFMM NBOBHFT FƵFDUT CZ TFQBSBUJOH FƵFDUGVM
DPNQVUBUJPOT GSPN QVSF DPNQVUBUJPOT JO XBZT UIBU QSFTFSWF
UIF QSFEJDUBCJMJUZ BOE TBGFUZ PG GVODUJPO FWBMVBUJPO *NQPS
UBOUMZ FƵFDUCFBSJOH DPNQVUBUJPOT UIFNTFMWFT CFDPNF NPSF
DPNQPTBCMF BOE FBTJFS UP SFBTPO BCPVU 5IF CFOFƶUT PG FY
QMJDJU FƵFDUT JODMVEF UIF GBDU UIBU JU NBLFT JU SFMBUJWFMZ FBTZ UP
SFBTPO BCPVU BOE QSFEJDU UIF SFTVMUT PG PVS GVODUJPOT
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

8IBU TFUT )BTLFMM BQBSU GSPN NPTU PUIFS GVODUJPOBM QSP


HSBNNJOH MBOHVBHFT JT UIBU JU JOUSPEVDFE BOE SFƶOFE B NFBOT
PG XSJUJOH PSEJOBSZ QSPHSBNT UIBU UBML UP UIF PVUTJEF XPSME
XJUIPVU BEEJOH BOZUIJOH UP UIF QVSF MBNCEB DBMDVMVT JU JT
GPVOEFE PO 5IJT QSPQFSUZ ƈ CFJOH MBNCEB DBMDVMVT BOE
OPUIJOH NPSF ƈ JT XIBU NBLFT )BTLFMM B QVSFMZ GVODUJPOBM
QSPHSBNNJOH MBOHVBHF
5IF print GVODUJPO JT TPNFUJNFT JOWPLFE JOEJSFDUMZ CZ ()$J
CVU JUT UZQF FYQMJDJUMZ SFWFBMT UIBU JU JT FƵFDUGVM 6Q UP OPX
XFƊWF CFFO DPWFSJOH PWFS IPX UIJT XPSLT CVU JUƊT UJNF UP EJWF
B CJU EFFQFS
print JT EFƶOFE JO UIF Prelude TUBOEBSE BT B GVODUJPO UP PVU
QVU ƌB WBMVF PG BOZ QSJOUBCMF UZQF UP UIF TUBOEBSE PVUQVU EFWJDF
1SJOUBCMF UZQFT BSF UIPTF UIBU BSF JOTUBODFT PG DMBTT Show QSJOU
DPOWFSUT WBMVFT UP TUSJOHT GPS PVUQVU VTJOH UIF TIPX PQFSBUJPO
BOE BEET B OFXMJOFƍ -FUƊT MPPL BU UIF UZQF PG print

Prelude> :t print
print :: Show a => a -> IO ()

"T XF TFF print UBLFT BO BSHVNFOU Ԑ UIBU JT BO JOTUBODF PG


UIF Show UZQFDMBTT BOE SFUVSOT BO IO () SFTVMU 5IJT SFTVMU JT BO
IO BDUJPO UIBU SFUVSOT B WBMVF PG UIF UZQF ()
8F TBX UIJT IO () SFTVMU QSFWJPVTMZ XIFO XF UBMLFE BCPVU
QSJOUJOH TUSJOHT 8F BMTP OPUFE UIBU JU JT UIF PCMJHBUPSZ UZQF
PG main JO B TPVSDF DPEF ƶMF 5IJT JT CFDBVTF SVOOJOH main POMZ
QSPEVDFT TJEF FƵFDUT
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

4UBUFE BT TJNQMZ BT QPTTJCMF BO *0 JOQVUPVUQVU GSFRVFOUMZ


XSJUUFO Ɖ*0Ɗ XJUIPVU B TMBTI XIFO SFGFSSJOH UP UIF )BTLFMM
EBUBUZQF UIFSF JT OP TMBTI
BDUJPO JT BO BDUJPO UIBU XIFO QFS
GPSNFE IBT TJEF FƵFDUT JODMVEJOH SFBEJOH GSPN JOQVU BOE
QSJOUJOH UP UIF TDSFFO BOE XJMM DPOUBJO B SFUVSO WBMVF 5IF
() EFOPUFT BO FNQUZ UVQMF XIJDI XF SFGFS UP BT VOJU 6OJU
JT B WBMVF BOE BMTP B UZQF UIBU IBT POMZ UIJT POF JOIBCJUBOU
UIBU FTTFOUJBMMZ SFQSFTFOUT OPUIJOH 1SJOUJOH B TUSJOH UP UIF
UFSNJOBM EPFTOƊU IBWF B NFBOJOHGVM SFUVSO WBMVF #VU BO IO
BDUJPO MJLF BOZ FYQSFTTJPO JO )BTLFMM DBOƊU SFUVSO OPUIJOH JU
NVTU SFUVSO TPNFUIJOH 4P XF VTF UIJT FNQUZ UVQMF UP SFQSF
TFOU UIF SFUVSO WBMVF BU UIF FOE PG PVS IO BDUJPO 5IBU JT UIF
print GVODUJPO XJMM ƶSTU EP UIF IO BDUJPO PG QSJOUJOH UIF TUSJOH
UP UIF UFSNJOBM BOE UIFO DPNQMFUF UIF IO BDUJPO NBSLJOH BO
FOE UP UIF FYFDVUJPO PG UIF GVODUJPO BOE B EFMJNJUBUJPO PG UIF
TJEF FƵFDUT CZ SFUVSOJOH UIJT FNQUZ OPUIJOH UVQMF *U EPFT
OPU QSJOU UIF FNQUZ UVQMF UP UIF TDSFFO CVU JU JT JNQMJDJUMZ
UIFSF 5IF TJNQMFTU XBZ UP UIJOL BCPVU UIF EJƵFSFODF CFUXFFO
B WBMVF XJUI B UZQJDBM UZQF MJLF String BOE UIF TBNF UZQF CVU
GSPN IO TVDI BT XJUI IO String JT UIBU IO BDUJPOT BSF GPSNVMBT
8IFO ZPV IBWF B WBMVF PG UZQF IO String JUƊT NPSF PG B NFBOT PG
QSPEVDJOH B String XIJDI NBZ SFRVJSF QFSGPSNJOH TJEF FƵFDUT
BMPOH UIF XBZ CFGPSF ZPV HFU ZPVS String WBMVF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

-- this is just a String value


myVal :: String

-- this value is a method or means of obtaining


-- a value of type String which
-- performs side effects aka IO
ioString :: IO String

"O IO BDUJPO JT QFSGPSNFE XIFO XF DBMM main GPS PVS QSPHSBN


BT XF IBWF TFFO #VU XF BMTP QFSGPSN BO IO BDUJPO XIFO XF
JOWPLF print JNQMJDJUMZ PS FYQMJDJUMZ

8PSLJOH XJUI 4IPX


6Q UP OPX XF IBWF POMZ CFFO EFSJWJOH UZQFDMBTT JOTUBODFT
GPS Show CFDBVTF EFSJWJOH VTVBMMZ HJWFT VT UIF SFTVMU XF XBOU
XJUIPVU B MPU PG GVTT )BWJOH B Show JOTUBODF JT DSVDJBM UP CFJOH
BCMF UP QSJOU BOZUIJOH UP UIF UFSNJOBM TP XFƊSF HPJOH UP MPPL BU
TPNF FYBNQMFT PG XIZ Show JT JNQPSUBOU BOE IPX JU JT JNQMF
NFOUFE *OWPLJOH UIF Show UZQFDMBTT BMTP JOWPLFT JUT NFUIPET
TQFDJƶDBMMZ B NFUIPE PG UBLJOH ZPVS WBMVFT BOE UVSOJOH UIFN
JOUP WBMVFT UIBU DBO CF QSJOUFE UP UIF TDSFFO
" NJOJNBM JNQMFNFOUBUJPO PG BO JOTUBODF PG Show POMZ SF
RVJSFT UIBU show PS showsPrec CF JNQMFNFOUFE BT JO UIF GPMMPX
JOH FYBNQMF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

data Mood = Blah

instance Show Mood where


show _ = "Blah"

*Main> Blah
Blah

)FSFƊT XIBU IBQQFOT JO ()$J XIFO ZPV EFƶOF B EBUBUZQF


BOE BTL ()$J UP TIPX JU XJUIPVU UIF JOTUBODF GPS UIF Show
UZQFDMBTT

Prelude> data Mood = Blah


Prelude> Blah

No instance for (Show Mood) arising


from a use of ‘print’
In a stmt of an interactive GHCi command: print it

/FYU MFUƊT MPPL BU IPX ZPV EFƶOF B EBUBUZQF UP IBWF BO JO


TUBODF PG Show 8F DBO EFSJWF UIF Show JOTUBODF GPS Mood CFDBVTF
JUƊT POF PG UIF UZQFDMBTTFT ()$ TVQQPSUT EFSJWJOH JOTUBODFT GPS
CZ EFGBVMU

Prelude> data Mood = Blah deriving Show


Prelude> Blah
Blah
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

"OE JO GBDU NPTU PG UIF UJNF UIBUƊT XIBU ZPVƊMM EP GPS ZPVS
PXO EBUBUZQFT *O UIF DIBQUFS PO CVJMEJOH QSPKFDUT XF XJMM
OFFE UP XSJUF B DVTUPN JOTUBODF GPS Show UIPVHI TP UIBU TIPVME
HJWF ZPV TPNFUIJOH FYDJUJOH UP MPPL GPSXBSE UP

 3FBE
5IF Read UZQFDMBTTXFMM JUƊTUIFSF :PVƊMM OPUJDF UIBU MJLF Show
B MPU PG UZQFT IBWF JOTUBODFT PG Read 5IJT UZQFDMBTT JT FTTFOUJBMMZ
UIF PQQPTJUF PG Show 8IFSF Show UBLFT UIJOHT BOE UVSOT UIFN
JOUP IVNBOSFBEBCMF TUSJOHT Read UBLFT TUSJOHT BOE UVSOT UIFN
JOUP UIJOHT -JLF Show JUƊT OPU B TFSJBMJ[BUJPO GPSNBU 4P XIBUƊT
UIF QSPCMFN 8F HBWF UIBU EJSF XBSOJOH BHBJOTU VTJOH Read
FBSMJFS JO UIF DIBQUFS CVU UIJT EPFTOƊU TFFN MJLF B CJH EFBM
SJHIU
5IF QSPCMFN JT JO UIF String UZQF " String JT B MJTU XIJDI
DPVME CF FNQUZ JO TPNF DBTFT PS TUSFUDI PO UP JOƶOJUZ JO PUIFS
DBTFT
8F DBO CFHJO UP VOEFSTUBOE UIJT CZ FYBNJOJOH UIF UZQFT

Prelude> :t read
read :: Read a => String -> a

5IFSFƊT OP XBZ Read a => String -> a XJMM BMXBZT XPSL -FUƊT
DPOTJEFS B UZQF MJLF Integer XIJDI IBT B Read JOTUBODF 8F BSF JO
OP XBZ HVBSBOUFFE UIBU UIF String XJMM CF B WBMJE SFQSFTFOUBUJPO
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

PG BO Integer WBMVF " String WBMVF DBO CF BOZ UFYU 5IBUƊT XBZ
UPP CJH PG B UZQF GPS UIJOHT XF XBOU UP QBSTF JOUP OVNCFST
8F DBO QSPWF UIJT GPS PVSTFMWFT JO UIF 3&1-

Prelude> read "1234567" :: Integer


1234567
Prelude> read "BLAH" :: Integer
*** Exception: Prelude.read: no parse

5IBU FYDFQUJPO JT B SVOUJNF FSSPS BOE NFBOT UIBU read JT B


QBSUJBM GVODUJPO B GVODUJPO UIBU EPFTOƊU SFUVSO B QSPQFS WBMVF
BT B SFTVMU GPS BMM QPTTJCMF JOQVUT 8F IBWF XBZT PG DMFBOJOH
UIJT VQ XFƊMM FYQMBJO BOE EFNPOTUSBUF MBUFS 8F TIPVME TUSJWF
UP BWPJE XSJUJOH PS VTJOH TVDI GVODUJPOT JO )BTLFMM CFDBVTF
)BTLFMM HJWFT VT UIF UPPMT OFDFTTBSZ UP BWPJE TFOTFMFTT TPVSDFT
PG FSSPST JO PVS DPEF

 *OTUBODFT BSF EJTQBUDIFE CZ UZQF


8FƊWF TBJE B GFX UJNFT XJUIPVU FYQMBJOJOH JU UIBU UZQFDMBTTFT
BSF EJTQBUDIFE CZ UZQF CVU JUƊT BO JNQPSUBOU UIJOH UP VOEFS
TUBOE 5ZQFDMBTTFT BSF EFƶOFE CZ UIF TFU PG PQFSBUJPOT BOE
WBMVFT BMM JOTUBODFT XJMM QSPWJEF 5ZQFDMBTT JOTUBODFT BSF VOJRVF
QBJSJOHT PG UIF UZQFDMBTT BOE B UZQF 5IFZ EFƶOF UIF XBZT UP
JNQMFNFOU UIF UZQFDMBTT NFUIPET GPS UIBU UZQF
8FƊSF HPJOH UP XBML UISPVHI TPNF DPEF UP JMMVTUSBUF XIBU
UIJT BMM NFBOT 5IF ƶSTU UIJOH ZPV XJMM TFF JT UIBU XFƊWF XSJUUFO
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

PVS PXO UZQFDMBTT BOE JOTUBODFT GPS EFNPOTUSBUJPO QVSQPTFT


8F XJMM UBML BCPVU IPX UP XSJUF ZPVS PXO UZQFDMBTTFT MBUFS JO
UIF CPPL 5IPTF EFUBJMT BSFOƊU JNQPSUBOU GPS VOEFSTUBOEJOH
UIJT DPEF +VTU SFNFNCFS

Ƒ B UZQFDMBTT EFƶOFT B TFU PG GVODUJPOT BOEPS WBMVFT

Ƒ UZQFT IBWF JOTUBODFT PG UIBU UZQFDMBTT

Ƒ UIF JOTUBODFT TQFDJGZ UIF XBZT UIBU UZQF VTFT UIF GVODUJPOT
PG UIF UZQFDMBTT

5IJT JT WBDVPVT BOE TJMMZ 5IJT JT POMZ UP NBLF B QPJOU 1MFBTF


EP OPU XSJUF UZQFDMBTTFT MJLF UIJT

class Numberish a where


fromNumber :: Integer -> a
toNumber :: a -> Integer

-- pretend newtype is data for now


newtype Age =
Age Integer
deriving (Eq, Show)

instance Numberish Age where


fromNumber n = Age n
toNumber (Age n) = n
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

newtype Year =
Year Integer
deriving (Eq, Show)

instance Numberish Year where


fromNumber n = Year n
toNumber (Year n) = n

5IFO TVQQPTF XF XSJUF B GVODUJPO VTJOH UIJT UZQFDMBTT BOE


UIF UXP UZQFT BOE JOTUBODFT

sumNumberish :: Numberish a => a -> a -> a


sumNumberish a a' = fromNumber summed
where integerOfA = toNumber a
integerOfAPrime = toNumber a'
summed = integerOfA + integerOfAPrime

/PX MFU VT UIJOL BCPVU UIJT GPS B NPNFOU 5IF DMBTT EFG
JOJUJPO PG Numberish EPFTOƊU EFƶOF BOZ UFSNT PS BDUVBM DPEF XF
DBO DPNQJMF BOE FYFDVUF POMZ UZQFT 5IF DPEF BDUVBMMZ MJWFT
JO UIF JOTUBODFT GPS Age BOE Year 4P IPX EPFT )BTLFMM LOPX
XIFSF UP ƶOE DPEF

Prelude> sumNumberish (Age 10) (Age 10)


Age 20
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

*O UIF BCPWF JU LOFX UP VTF UIF JOTUBODF PG Numberish GPS Age


CFDBVTF JU DPVME TFF UIBU PVS BSHVNFOUT UP sumNumberish XFSF
PG UZQF Age 8F DBO TFF UIJT XJUI UIF UZQF JOGFSFODF UPP

Prelude> :t sumNumberish
sumNumberish :: Numberish a => a -> a -> a

Prelude> :t sumNumberish (Age 10)


sumNumberish (Age 10) :: Age -> Age

"ǒFS UIF ƶSTU QBSBNFUFS JT BQQMJFE UP B WBMVF PG UZQF Age JU


LOPXT UIBU BMM PUIFS PDDVSSFODFT PG UZQF Numberish a => a NVTU
BDUVBMMZ CF Age
5P TFF B DBTF XIFSF XFƊSF OPU QSPWJEJOH FOPVHI JOGPSNBUJPO
UP )BTLFMM GPS JU UP JEFOUJGZ B DPODSFUF UZQF XJUI XIJDI UP HFU
UIF BQQSPQSJBUF JOTUBODF XFƊSF HPJOH UP DIBOHF PVS UZQFDMBTT
BOE BTTPDJBUFE JOTUBODFT

-- This is even worse than the last one.


-- Don't use typeclasses to define default values.
-- Seriously. Haskell Ninjas will find you
-- and replace your toothpaste with muddy chalk.

class Numberish a where


fromNumber :: Integer -> a
toNumber :: a -> Integer
defaultNumber :: a
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

instance Numberish Age where


fromNumber n = Age n
toNumber (Age n) = n
defaultNumber = Age 65

instance Numberish Year where


fromNumber n = Year n
toNumber (Year n) = n
defaultNumber = Year 1988

5IFO JO UIF 3&1- XF DBO TFF UIBU JO TPNF DBTFT UIFSFƊT OP


XBZ GPS )BTLFMM UP LOPX XIBU XF XBOU

Prelude> defaultNumber

No instance for (Show a0) arising


from a use of ‘print’
The type variable ‘a0’ is ambiguous
Note: there are several potential instances:
instance Show a => Show (Maybe a)
instance Show Ordering
instance Show Integer
...plus 24 others

5IJT GBJMT CFDBVTF JU IBT OP JEFB XIBU UZQF defaultNumber JT


PUIFS UIBO UIBU JUƊT QSPWJEFE GPS CZ NumberishƊT JOTUBODFT #VU
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

UIF HPPE OFXT JT FWFO JG JUƊT B WBMVF BOE EPFTOƊU UBLF BOZ BSHV
NFOUT XF IBWF B NFBOT PG UFMMJOH )BTLFMM XIBU XF XBOU

Prelude> defaultNumber :: Age


Age 65
Prelude> defaultNumber :: Year
Year 1988

+VTU BTTJHO UIF UZQF ZPV FYQFDU BOE JU XPSLT ƶOF )FSF
)BTLFMM JT VTJOH UIF UZQF BTTFSUJPO UP EJTQBUDI PS TQFDJGZ XIBU
UZQFDMBTT JOTUBODF XF XBOU UP HFU PVS defaultNumber GSPN

8IZ OPU XSJUF B UZQFDMBTT MJLF UIJT 'PS SFBTPOT XFƊMM FYQMBJO
XIFO XF UBML BCPVU Monoid JUƊT JNQPSUBOU UIBU ZPVS UZQFDMBTTFT
IBWF MBXT BOE SVMFT BCPVU IPX UIFZ XPSL Numberish JT B CJU
BSCJUSBSZ 5IFSF BSF CFUUFS XBZT UP FYQSFTT XIBU JU EPFT JO
)BTLFMM UIBO B UZQFDMBTT 'VODUJPOT BOE WBMVFT BMPOF TVƸDF
IFSF

 (JNNF NPSF PQFSBUJPOT


8F UBMLFE BCPVU UIF EJƵFSFOU LJOET PG QPMZNPSQIJTN JO UZQF
TJHOBUVSFT ƈ DPOTUSBJOFE WFSTVT QBSBNFUSJD )BWJOH OP DPO
TUSBJOU PO PVS UFSNMFWFM WBMVFT NFBOT UIFZ DPVME CF BOZ UZQF
CVU UIFSF JTOƊU NVDI XF DBO EP XJUI UIFN 5IF NFUIPET BOE
PQFSBUJPOT BSF JO UIF UZQFDMBTTFT BOE TP XF HFU NPSF VUJMJUZ
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

CZ TQFDJGZJOH UZQFDMBTT DPOTUSBJOUT *G ZPVS UZQFT BSF NPSF


HFOFSBM UIBO ZPVS UFSNT BSF UIFO ZPV OFFE UP DPOTUSBJO ZPVS
UZQFT XJUI UIF UZQFDMBTTFT UIBU QSPWJEF UIF PQFSBUJPOT ZPV
XBOU UP VTF 8F MPPLFE BU TPNF FYBNQMFT PG UIJT JO UIF TFD
UJPOT BCPWF BCPVU Integral BOE Fractional CVU JO UIJT TFDUJPO
XFƊMM CF NPSF TQFDJƶD BCPVU IPX UP NPEJGZ UZQF TJHOBUVSFT UP
ƶU UIF UFSNT
8FƊMM TUBSU CZ MPPLJOH BU TPNF FYBNQMFT PG UJNFT XIFO XF
OFFE UP DIBOHF PVS UZQFT CFDBVTF UIFZƊSF NPSF HFOFSBM UIBO
PVS UFSNT BMMPX

add :: a -> a -> a


add x y = x + y

*G ZPV MPBE JU VQ ZPVƊMM HFU UIF GPMMPXJOH FSSPS

No instance for (Num a) arising from a use of ‘+’


Possible fix:
add (Num a) to the context of
the type signature for add :: a -> a -> a

'PSUVOBUFMZ UIJT JT POF PG UIPTF DBTFT XIFSF ()$ LOPXT


QSFDJTFMZ XIBU UIF QSPCMFN JT BOE IPX UP SFNFEZ JU 8F KVTU
OFFE UP BEE B Num DPOTUSBJOU UP UIF UZQF Ԑ #VU XIZ #FDBVTF
PVS GVODUJPO DBOƊU BDDFQU B WBMVF PG TUSJDUMZ BOZ UZQF 8F OFFE
TPNFUIJOH UIBU IBT BO JOTUBODF PG Num CFDBVTF UIF (+) GVODUJPO
DPNFT GSPN Num
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

add :: Num a => a -> a -> a


add x y = x + y

8JUI UIF DPOTUSBJOU BEEFE UP UIF UZQF JU XPSLT ƶOF 8IBU


JG XF VTF B NFUIPE GSPN BOPUIFS PQFSBUJPO

addWeird :: Num a => a -> a -> a


addWeird x y =
if x > 1
then x + y
else x

8F HFU BOPUIFS FSSPS CVU PODF BHBJO ()$ IFMQT VT PVU TP


MPOH BT XF SFTJTU UIF QVMM PG UVOOFM WJTJPO BOE MPPL BU XIBU JUƊT
UFMMJOH VT

Could not deduce (Ord a) arising from a use of ‘>’


from the context (Num a)
bound by the type signature for
addWeird :: Num a => a -> a -> a

Possible fix:
add (Ord a) to the context of
the type signature for
addWeird :: Num a => a -> a -> a

"MM QSPHSBNNFST FYQFSJFODF UIJT +VTU TMPX EPXO BOE ZPVƊMM CF PLBZ
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

5IF QSPCMFN JT UIBU IBWJOH B Num DPOTUSBJOU PO PVS UZQF Ԑ


JTOƊU FOPVHI Num EPFTOƊU JNQMZ Ord (JWFO UIBU XF IBWF UP BEE
BOPUIFS DPOTUSBJOU XIJDI JT XIBU ()$ UPME VT UP EP

addWeird :: (Ord a, Num a) => a -> a -> a


addWeird x y =
if x > 1
then x + y
else x

/PX UIJT TIPVME UZQFDIFDL CFDBVTF PVS DPOTUSBJOUT BSF BTL


JOH UIBU Ԑ IBWF JOTUBODFT PG Num BOE Ord

$PODSFUF UZQFT JNQMZ BMM UIF UZQFDMBTTFT UIFZ


QSPWJEF
8FƊMM CF SFQVSQPTJOH TPNF FYBNQMFT GSPN FBSMJFS JO UIF DIBQ
UFS NPEJGZJOH UIFN UP BMM IBWF B DPODSFUF UZQF JO UIF QMBDF PG
Ԑ
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

add :: Int -> Int -> Int


add x y = x + y

addWeird :: Int -> Int -> Int


addWeird x y =
if x > 1
then x + y
else x

check' :: Int -> Int -> Bool


check' a a' = a == a'

5IFTF XJMM BMM UZQFDIFDL 5IJT JT CFDBVTF UIF Int UZQF IBT
UIF UZQFDMBTTFT Num Eq BOE Ord BMM JNQMFNFOUFE 8F EPOƊU OFFE
UP TBZ Ord Int => Int -> Int -> Int CFDBVTF JU EPFTOƊU BEE BOZ
JOGPSNBUJPO " DPODSFUF UZQF FJUIFS IBT B UZQFDMBTT JOTUBODF PS
JU EPFTOƊU ƈ BEEJOH UIF DPOTUSBJOU NFBOT OPUIJOH " DPODSFUF
UZQF BMXBZT JNQMJFT UIF UZQFDMBTTFT UIBU BSF QSPWJEFE GPS JU
5IFSF BSF TPNF DBWFBUT UP LFFQ JO NJOE IFSF XIFO JU DPNFT
UP VTJOH DPODSFUF UZQFT 0OF PG UIF OJDF UIJOHT BCPVU QBSB
NFUSJDJUZ BOE UZQFDMBTTFT JT UIBU ZPV BSF CFJOH FYQMJDJU BCPVU
XIBU ZPV NFBO UP EP XJUI ZPVS EBUB XIJDI NFBOT ZPV BSF
MFTT MJLFMZ UP NBLF B NJTUBLF Int JT B CJH EBUBUZQF XJUI NBOZ
JOIBCJUBOUT BOE NBOZ UZQFDMBTTFT BOE PQFSBUJPOT EFƶOFE GPS
JU ƈ JU DPVME CF FBTZ UP NBLF B GVODUJPO UIBU EPFT TPNFUIJOH
VOJOUFOEFE 8IFSFBT JG XF XFSF UP XSJUF B GVODUJPO FWFO JG XF
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

IBE Int WBMVFT JO NJOE GPS JU XIJDI VTFE B QPMZNPSQIJD UZQF


DPOTUSBJOFE CZ UIF UZQFDMBTT JOTUBODFT XF XBOUFE XF DPVME
FOTVSF XF POMZ VTFE UIF PQFSBUJPOT XF JOUFOEFE 5IJT JTOƊU B
QBOBDFB CVU JU DBO CF XPSUI BWPJEJOH DPODSFUF UZQFT GPS UIFTF
BOE PUIFS
SFBTPOT TPNFUJNFT

 $IBQUFS &YFSDJTFT


.VMUJQMF DIPJDF
 5IF &R DMBTT

B
JODMVEFT BMM UZQFT JO )BTLFMM
C
JT UIF TBNF BT UIF 0SE DMBTT
D
NBLFT FRVBMJUZ UFTUT QPTTJCMF
E
POMZ JODMVEFT OVNFSJD UZQFT

 5IF UZQFDMBTT 0SE

B
BMMPXT BOZ UXP WBMVFT UP CF DPNQBSFE
C
JT B TVCDMBTT PG &R
D
JT B TVQFSDMBTT PG &R
E
IBT OP JOTUBODF GPS #PPM

 4VQQPTF UIF UZQFDMBTT 0SE IBT BO PQFSBUPS > 8IBU JT UIF


UZQF PG >
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

B
Ord a => a -> a -> Bool
C
Ord a => Int -> Bool
D
Ord a => a -> Char
E
Ord a => Char -> [Char]

 *O x = divMod 16 12

B
UIF UZQF PG ԧ JT *OUFHFS
C
UIF WBMVF PG ԧ JT VOEFDJEBCMF
D
UIF UZQF PG ԧ JT B UVQMF
E
ԧ JT FRVBM UP 12 / 16

 5IF UZQFDMBTT *OUFHSBM JODMVEFT

B
*OU BOE *OUFHFS OVNCFST
C
JOUFHSBM SFBM BOE GSBDUJPOBM OVNCFST
D
4DISPEJOHFSƊT DBU
E
POMZ QPTJUJWF OVNCFST

%PFT JU UZQFDIFDL
'PS UIJT TFDUJPO PG FYFSDJTFT ZPVƊMM CF QSBDUJDJOH MPPLJOH GPS
UZQF BOE UZQFDMBTT FSSPST
'PS FYBNQMF printIt XJMM OPU XPSL CFDBVTF GVODUJPOT MJLF
ԧ IBWF OP JOTUBODF PG Show UIF UZQFDMBTT UIBU MFUT ZPV DPOWFSU
UIJOHT UP 4USJOHT VTVBMMZ GPS QSJOUJOH

$)"15&3  -&44 "%)0$ 10-:.031)*4. 

x :: Int -> Int


x blah = blah + 20

printIt :: IO ()
printIt = putStrLn (show x)

)FSFƊT UIF UZQF FSSPS ZPV HFU JG ZPV USZ UP MPBE UIF DPEF

No instance for (Show (Int -> Int)) arising


from a use of ‘show’

In the first argument of ‘putStrLn’, namely ‘(show x)’


In the expression: putStrLn (show x)
In an equation for ‘printIt’: printIt = putStrLn (show x)

*UƊT TBZJOH JU DBOƊU ƶOE BO JNQMFNFOUBUJPO PG UIF UZQFDMBTT


Show GPS UIF UZQF Int -> Int XIJDI NBLFT TFOTF /PUIJOH XJUI
UIF GVODUJPO UZQF DPOTUSVDUPS (->) IBT BO JOTUBODF PG Show CZ
EFGBVMU JO )BTLFMM
&YBNJOF UIF GPMMPXJOH DPEF BOE EFDJEF XIFUIFS JU XJMM UZQF
DIFDL 5IFO MPBE JU JO ()$J BOE TFF JG ZPV XFSF DPSSFDU *G
JU EPFTOƊU UZQFDIFDL USZ UP NBUDI UIF UZQF FSSPS BHBJOTU ZPVS
VOEFSTUBOEJOH PG XIZ JU EJEOƊU XPSL *G ZPV DBO ƶY UIF FSSPS
BOE SFSVO UIF DPEF

'PS BO FYQMBOBUJPO BOE KVTUJƶDBUJPO PG XIZ GVODUJPOT JO )BTLFMM DBOOPU IBWF B
Show JOTUBODF TFF UIF XJLJ QBHF PO UIJT UPQJD https://wiki.haskell.org/Show_instance_for_
functions
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

 %PFT UIF GPMMPXJOH DPEF UZQFDIFDL *G OPU XIZ OPU

data Person = Person Bool

printPerson :: Person -> IO ()


printPerson person = putStrLn (show person)

 %PFT UIF GPMMPXJOH UZQFDIFDL *G OPU XIZ OPU

data Mood = Blah


| Woot deriving Show

settleDown x = if x == Woot
then Blah
else x

 *G ZPV XFSF BCMF UP HFU settleDown UP UZQFDIFDL

B
8IBU WBMVFT BSF BDDFQUBCMF JOQVUT UP UIBU GVODUJPO
C
8IBU XJMM IBQQFO JG ZPV USZ UP SVO settleDown 9 8IZ
D
8IBU XJMM IBQQFO JG ZPV USZ UP SVO Blah > Woot 8IZ

 %PFT UIF GPMMPXJOH UZQFDIFDL *G OPU XIZ OPU


$)"15&3  -&44 "%)0$ 10-:.031)*4. 

type Subject = String


type Verb = String
type Object = String

data Sentence =
Sentence Subject Verb Object
deriving (Eq, Show)

s1 = Sentence "dogs" "drool"


s2 = Sentence "Julie" "loves" "dogs"

(JWFO B EBUBUZQF EFDMBSBUJPO XIBU DBO XF EP


(JWFO UIF GPMMPXJOH EBUBUZQF EFƶOJUJPOT

data Rocks =
Rocks String deriving (Eq, Show)

data Yeah =
Yeah Bool deriving (Eq, Show)

data Papu =
Papu Rocks Yeah
deriving (Eq, Show)
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

8IJDI PG UIF GPMMPXJOH XJMM UZQFDIFDL 'PS UIF POFT UIBU


EPOƊU UZQFDIFDL XIZ EPOƊU UIFZ

 phew = Papu "chases" True

 truth = Papu (Rocks "chomskydoz")


(Yeah True)

 equalityForall :: Papu -> Papu -> Bool


equalityForall p p' = p == p'

 comparePapus :: Papu -> Papu -> Bool


comparePapus p p' = p > p'

.BUDI UIF UZQFT


8FƊSF HPJOH UP HJWF ZPV UXP UZQFT BOE UIFJS JNQMFNFOUBUJPOT
5IFO XFƊSF HPJOH UP BTL ZPV JG ZPV DBO TVCTUJUVUF UIF TFDPOE
UZQF GPS UIF ƶSTU :PV DBO UFTU UIJT CZ UZQJOH UIF ƶSTU EFDMBSBUJPO
BOE JUT UZQF JOUP B ƶMF BOE FEJUJOH JO UIF OFX POF MPBEJOH UP
TFF JG JU GBJMT %POƊU KVTU HVFTT UFTU BMM ZPVS BOTXFST

 'PS UIF GPMMPXJOH EFƶOJUJPO

B
i :: Num a => a
i = 1

C
5SZ SFQMBDJOH UIF UZQF TJHOBUVSF XJUI UIF GPMMPXJOH
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

i :: a
"ǒFS ZPVƊWF GPSNVMBUFE ZPVS PXO BOTXFS UIFO UFTUFE
UIBU BOTXFS BOE CFMJFWF ZPV VOEFSTUBOE XIZ ZPV XFSF
SJHIU PS XSPOH NBLF TVSF UP VTF ()$J UP DIFDL XIBU
UZQF ()$ JOGFST GPS UIF EFƶOJUJPOT XF QSPWJEF XJUIPVU
B UZQF BTTJHOFE 'PS FYBNQMF GPS UIJT POF ZPVƊE UZQF
JO

Prelude> let i = 1
Prelude> :t i
-- Result elided intentionally.

 B
f :: Float
f = 1.0

C
f :: Num a => a

 B
f :: Float
f = 1.0

C
f :: Fractional a => a

 )JOU GPS UIF GPMMPXJOH UZQF :info RealFrac JO ZPVS 3&1-

B
f :: Float
f = 1.0

C
f :: RealFrac a => a
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

 B
freud :: a -> a
freud x = x

C
freud :: Ord a => a -> a

 B
freud' :: a -> a
freud' x = x

C
freud' :: Int -> Int

 B
myX = 1 :: Int

sigmund :: Int -> Int


sigmund x = myX

C
sigmund :: a -> a

 B
myX = 1 :: Int
sigmund' :: Int -> Int
sigmund' x = myX

C
sigmund' :: Num a => a -> a

 B
:PVƊMM OFFE UP JNQPSU sort GSPN Data.List
jung :: Ord a => [a] -> a
jung xs = head (sort xs)
C
jung :: [Int] -> Int

 B
young :: [Char] -> Char
young xs = head (sort xs)
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

C
young :: Ord a => [a] -> a

 B
mySort :: [Char] -> [Char]
mySort = sort

signifier :: [Char] -> Char


signifier xs = head (mySort xs)

C
signifier :: Ord a => [a] -> a

5ZQF,XPO%P 5XP &MFDUSJD 5ZQFBMPP


3PVOE 5XP 4BNF SVMFT BQQMZ ƈ ZPVƊSF USZJOH UP ƶMM JO UFSNT
DPEF
XIJDIƊMM ƶU UIF UZQF 5IF JEFB XJUI UIFTF FYFSDJTFT JT UIBU
ZPVƊMM EFSJWF UIF JNQMFNFOUBUJPO GSPN UIF UZQF JOGPSNBUJPO
:PVƊMM QSPCBCMZ OFFE UP VTF TUVƵ GSPN 1SFMVEF

 chk :: Eq b => (a -> b) -> a -> b -> Bool


chk = ???

 -- Hint: use some arithmetic operation to


-- combine values of type 'b'. Pick one.
arith :: Num b => (a -> b) -> Integer -> a -> b
arith = ???
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

 $IBQUFS %FƶOJUJPOT


 5ZQFDMBTT JOIFSJUBODF JT XIFO B UZQFDMBTT IBT B TVQFSDMBTT
5IJT JT B XBZ PG FYQSFTTJOH UIBU B UZQFDMBTT SFRVJSFT BOPUIFS
UZQFDMBTT UP CF BWBJMBCMF GPS B HJWFO UZQF CFGPSF ZPV DBO
XSJUF BO JOTUBODF

class Num a => Fractional a where


(/) :: a -> a -> a
recip :: a -> a
fromRational :: Rational -> a

)FSF UIF UZQFDMBTT Fractional JOIFSJUT GSPN Num 8F DPVME


BMTP TBZ UIBU Num JT B TVQFSDMBTT PG Fractional 5IF MPOH
BOE TIPSU PG JU JT UIBU JG ZPV XBOU UP XSJUF BO JOTUBODF PG
Fractional GPS TPNF Ԑ UIBU UZQF Ԑ NVTU BMSFBEZ IBWF BO
JOTUBODF PG Num CFGPSF ZPV NBZ EP TP
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

-- Even though in principle


-- this could work, it will fail because
-- Nada doesn't have a Num instance

newtype Nada = Nada Double deriving (Eq, Show)

instance Fractional Nada where


(Nada x) / (Nada y) = Nada (x / y)
recip (Nada n) = Nada (recip n)
fromRational r = Nada (fromRational r)

5IFO JG ZPV USZ UP MPBE JU

No instance for (Num Nada)


arising from the superclasses
of an instance declaration
In the instance declaration for
‘Fractional Nada’

:PV OFFE B Num JOTUBODF ƶSTU $BOƊU XSJUF POF UIBU NBLFT
TFOTF 5IFO ZPVƊSF OPU BMMPXFE UP IBWF B Fractional JO
TUBODF FJUIFS 5IFNƊT UIF SVMFT

 4JEF FƵFDUT BSF IPX XF SFGFS UP PCTFSWBCMF BDUJPOT QSPHSBNT


NBZ UBLF PUIFS UIBO DPNQVUF B WBMVF *G B GVODUJPO NPE
JƶFT TPNF TUBUF PS JOUFSBDUT XJUI UIF PVUTJEF XPSME JO B
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

NBOOFS UIBU DBO CF PCTFSWFE UIFO XF TBZ JU IBT BO FƵFDU


PO UIF XPSME

 *0 JT UIF UZQF GPS WBMVFT XIPTF FWBMVBUJPO CFBST UIF QPTTJ


CJMJUZ PG DBVTJOH TJEF FƵFDUT TVDI BT QSJOUJOH UFYU SFBEJOH
UFYU JOQVU GSPN UIF VTFS SFBEJOH PS XSJUJOH ƶMFT PS DPO
OFDUJOH UP SFNPUF DPNQVUFST 5IJT XJMM CF FYQMBJOFE JO
NVDI NPSF EFQUI JO UIF DIBQUFS PO IO

 "O JOTUBODF JT UIF EFƶOJUJPO PG IPX B UZQFDMBTT TIPVME


XPSL GPS B HJWFO UZQF *OTUBODFT BSF VOJRVF GPS B HJWFO
DPNCJOBUJPO PG UZQFDMBTT BOE UZQF

 *O )BTLFMM XF IBWF EFSJWFE JOTUBODFT TP UIBU PCWJPVT PS DPN


NPO UZQFDMBTTFT TVDI BT Eq Enum Ord BOE Show DBO IBWF
UIF JOTUBODFT HFOFSBUFE CBTFE POMZ PO IPX UIF EBUBUZQF
JT EFƶOFE 5IJT JT TP QSPHSBNNFST DBO NBLF VTF PG UIFTF
DPOWFOJFODFT XJUIPVU XSJUJOH UIF DPEF UIFNTFMWFT PWFS
BOE PWFS
$)"15&3  -&44 "%)0$ 10-:.031)*4. 

 5ZQFDMBTT JOIFSJUBODF QBSUJBM


5IJT JT OPU B DPNQMFUF DIBSU PG UZQFDMBTT JOIFSJUBODF *U JMMVT
USBUFT UIF SFMBUJPOTIJQ CFUXFFO B GFX PG UIF UZQFDMBTTFT XFƊWF
UBMLFE BCPVU JO UIJT DIBQUFS :PV DBO TFF GPS FYBNQMF UIBU
UIF TVCDMBTT Fractional JOIFSJUT GSPN UIF TVQFSDMBTT Num CVU OPU
WJDF WFSTB 8IJMF NBOZ UZQFT IBWF JOTUBODFT PG Show BOE Read
UIFZ BSFOƊU TVQFSDMBTTFT TP XFƊWF MFǒ UIFN PVU PG UIF DIBSU GPS
DMBSJUZ

 'PMMPXVQ SFTPVSDFT


 1 8BEMFS BOE 4 #MPUU )PX UP NBLF BEIPD QPMZNPS
QIJTN MFTT BE IPD
http://www.cse.iitk.ac.in/users/karkare/courses/2010/cs653/
Papers/ad-hoc-polymorphism.pdf

 $PSEFMJB 7 )BMM ,FWJO )BNNPOE 4JNPO - 1FZUPO +POFT


$)"15&3  -&44 "%)0$ 10-:.031)*4. 

BOE 1IJMJQ - 8BEMFS 5ZQFDMBTTFT JO )BTLFMM


http://ropas.snu.ac.kr/lib/dock/HaHaJoWa1996.pdf
$IBQUFS 

.PSF GVODUJPOBM QBUUFSOT

* XPVME MJLF UP CF BCMF UP


BMXBZTƒEJWJEF UIF UIJOHT
VQ JOUP BT NBOZ QJFDFT BT
* DBO FBDI PG XIJDI *
VOEFSTUBOE TFQBSBUFMZ *
XPVME MJLF UP VOEFSTUBOE
UIF XBZ PG BEEJOH UIJOHT
VQ JOEFQFOEFOUMZ PG
XIBU JU JT *ƊN BEEJOH VQ

(FSBME 4VTTNBO


$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 .BLF JU GVODZ


:PV NJHIU CF BTLJOH ZPVSTFMG XIBU UIJT DIBQUFS JT BMM BCPVU
IBWFOƊU XF CFFO UBMLJOH BCPVU GVODUJPOT BMM BMPOH 8F IBWF
CVU BT ZPV NJHIU HVFTT GSPN UIF GBDU UIBU )BTLFMM JT B GVODUJPOBM
QSPHSBNNJOH MBOHVBHF UIFSF JT NPSF UP TBZ ƈ TP NVDI NPSF
" GVODUJPO JT BO JOTUSVDUJPO GPS QSPEVDJOH BO PVUQVU GSPN
BO JOQVU PS BSHVNFOU 'VODUJPOT BSF BQQMJFE UP BSHVNFOUT
XIJDI CJOET UIFJS QBSBNFUFST UP WBMVFT 5IF GVMMZ BQQMJFE
GVODUJPO XJUI JUT BSHVNFOUT JT UIFO FWBMVBUFE UP QSPEVDF UIF
PVUQVU PS SFTVMU *O UIJT DIBQUFS XF XJMM EFNPOTUSBUF

Ƒ )BTLFMM GVODUJPOT BSF ƶSTUDMBTT FOUJUJFT UIBU

Ƒ DBO CF WBMVFT JO FYQSFTTJPOT MJTUT PS UVQMFT

Ƒ DBO CF QBTTFE BT BSHVNFOUT UP B GVODUJPO

Ƒ DBO CF SFUVSOFE GSPN B GVODUJPO BT B SFTVMU

Ƒ NBLF VTF PG TZOUBDUJD QBUUFSOT

 "SHVNFOUT BOE QBSBNFUFST


"T ZPV LOPX GSPN PVS EJTDVTTJPO PG DVSSZJOH GVODUJPOT JO
)BTLFMM NBZ BQQFBS UP IBWF NVMUJQMF QBSBNFUFST CVU UIJT JT
POMZ UIF TVSGBDF BQQFBSBODF JO GBDU BMM GVODUJPOT UBLF POF
BSHVNFOU BOE SFUVSO POF SFTVMU 8F DPOTUSVDU GVODUJPOT JO
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

)BTLFMM UISPVHI WBSJPVT TZOUBDUJD NFBOT PG EFOPUJOH UIBU BO


FYQSFTTJPO UBLFT BSHVNFOUT 'VODUJPOT BSF EFƶOFE CZ UIF GBDU
UIBU UIFZ DBO CF BQQMJFE UP BO BSHVNFOU BOE SFUVSO B SFTVMU
"MM )BTLFMM WBMVFT DBO CF BSHVNFOUT UP GVODUJPOT " WBMVF
UIBU DBO CF VTFE BT BO BSHVNFOU UP B GVODUJPO JT B ƶSTUDMBTT
WBMVF *O )BTLFMM UIJT JODMVEFT GVODUJPOT XIJDI DBO CF BSHV
NFOUT UP NPSF GVODUJPOT TUJMM /PU BMM QSPHSBNNJOH MBOHVBHFT
BMMPX UIJT CVU IPQFGVMMZ UIF FBSMJFS EJTDVTTJPO PG UIF GVODUJPO
UZQF BOE DVSSZJOH IBWF HJWFO BO JEFB PG IPX BOE XIZ UIJT
XPSLT

%FDMBSJOH QBSBNFUFST
:PV OBNF QBSBNFUFST UP GVODUJPOT JO )BTLFMM CZ EFDMBSJOH
UIFN CFUXFFO UIF OBNF PG UIF GVODUJPO XIJDI JT BMXBZT BU
UIF MFǒ NBSHJO BOE UIF FRVBMT TJHO TFQBSBUJOH UIF OBNF GSPN
CPUI UIF GVODUJPO OBNF BOE UIF FRVBMT TJHO XJUI XIJUF TQBDF
5IF OBNF JT B WBSJBCMF BOE XIFO XF BQQMZ UIF GVODUJPO UP
BO BSHVNFOU UIF WBMVF PG UIF BSHVNFOU JT CPVOE PS VOJƶFE
XJUI UIF OBNFE QBSBNFUFS JO PVS GVODUJPO EFƶOJUJPO
'JSTU XFƊMM EFƶOF B WBMVF XJUI OP QBSBNFUFST

myNum :: Integer
myNum = 1

myVal = myNum
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

*G XF RVFSZ UIF UZQF PG myVal

Prelude> :t myVal
myVal :: Integer

5IF WBMVF myVal IBT UIF TBNF UZQF BT myNum CFDBVTF JU JT FRVBM
UP JU 8F DBO TFF GSPN UIF UZQF UIBU JUƊT KVTU B WBMVF XJUIPVU
BOZ QBSBNFUFST TP XF DBOƊU BQQMZ JU UP BOZUIJOH
/PX MFUƊT JOUSPEVDF B QBSBNFUFS OBNFE ԕ

myNum :: Integer
myNum = 1

myVal f = myNum

"OE MFUƊT TFF IPX UIBU DIBOHFE UIF UZQF

Prelude> :t myVal
myVal :: t -> Integer

#Z XSJUJOH ԕ BǒFS myVal XF QBSBNFUFSJ[FE myVal XIJDI DIBOHFT


UIF UZQF GSPN Integer UP t -> Integer 5IF UZQF ԣ JT QPMZNPS
QIJD CFDBVTF XF EPOƊU EP BOZUIJOH XJUI JU ƈ JU DPVME CF BOZ
UIJOH 8F EJEOƊU EP BOZUIJOH XJUI ԕ TP UIF NBYJNBMMZ QPMZ
NPSQIJD UZQF XBT JOGFSSFE *G XF EP TPNFUIJOH XJUI ԕ UIF
UZQF XJMM DIBOHF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

Prelude> let myNum = 1 :: Integer


Prelude> let myVal f = f + myNum
Prelude> :t myVal
myVal :: Integer -> Integer

/PX JU LOPXT ԕ IBT UP CF PG UZQF Integer CFDBVTF XF BEEFE


JU UP myNum
8F DBO UFMM B TJNQMF WBMVF GSPN B GVODUJPO JO QBSU CFDBVTF
B WBMVF JT OPU BQQMJFE UP BOZ BSHVNFOUT XIJMF GVODUJPOT OFD
FTTBSJMZ IBWF QBSBNFUFST UIBU DBO CF BQQMJFE UP BSHVNFOUT
"MUIPVHI )BTLFMM GVODUJPOT POMZ UBLF POF BSHVNFOU QFS
GVODUJPO XF DBO EFDMBSF NVMUJQMF QBSBNFUFST JO B UFSNMFWFM
GVODUJPO EFƶOJUJPO

myNum :: Num a => a


myNum = 1
-- [1]

myVal :: Num a => a -> a


myVal f = f + myNum
-- [2]

stillAFunction :: [a] -> [a] -> [a] -> [a]


stillAFunction a b c = a ++ b ++ c
-- [ 3 ]
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 %FDMBSBUJPO PG B WBMVF PG UZQF Num a => a 8F DBO UFMM JUƊT


OPU B GVODUJPO CFDBVTF OP QBSBNFUFST BSF OBNFE CFUXFFO
UIF OBNF PG UIF EFDMBSFE WBMVF BOE UIF = TP JU BDDFQUT OP
BSHVNFOUT BOE UIF WBMVF 1 JT OPU B GVODUJPO

 )FSF ԕ JT B OBNF GPS B QBSBNFUFS UP UIF GVODUJPO myVal *U


SFQSFTFOUT UIF QPTTJCJMJUZ PG CFJOH BQQMJFE UP PS CPVOE
UP BO JOQVU WBMVF 5IF GVODUJPO UZQF JT Num a => a -> a
*G ZPV BTTJHO UIF UZQF *OUFHFS UP myNum myNum BOE myVal
NVTU DIBOHF UP UIF UZQFT Integer BOE Integer -> Integer
SFTQFDUJWFMZ

 )FSF Ԑ ԑ BOE Ԓ SFQSFTFOU QBSBNFUFST GPS UIF GVODUJPO


5IF VOEFSMZJOH MPHJD JT PG OFTUFE GVODUJPOT FBDI BQQMJFE
UP POF BSHVNFOU SBUIFS UIBO POF GVODUJPO UBLJOH TFWFSBM
BSHVNFOUT CVU UIJT JT IPX JU BQQFBST BU UFSN MFWFM

/PUJDF XIBU IBQQFOT UP UIF UZQFT BT XF OBNF NPSF QBSBN


FUFST

Prelude> let myVal f g = myNum


Prelude> :t myVal
myVal :: t -> t1 -> Integer

Prelude> let myVal f g h = myNum


Prelude> :t myVal
myVal :: t -> t1 -> t2 -> Integer
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

)FSF UIF UZQFT BSF t t1 BOE t2 XIJDI DPVME CF EJƵFSFOU


UZQFT 5IFZ BSF BMMPXFE CVU OPU SFRVJSFE UP CF EJƵFSFOU UZQFT
5IFZƊSF BMM QPMZNPSQIJD CFDBVTF XF HBWF UIF UZQF JOGFSFODF
OPUIJOH UP HP PO XJUI SFTQFDU UP XIBU UZQF UIFZ DPVME CF 5IF
UZQF WBSJBCMFT BSF EJƵFSFOU CFDBVTF OPUIJOH JO PVS DPEF JT
QSFWFOUJOH UIFN GSPN WBSZJOH TP UIFZ BSF QPUFOUJBMMZ EJG
GFSFOU UZQFT 5IF JOGFSFODF JOGFST UIF NPTU QPMZNPSQIJD UZQF
UIBU XPSLT

#JOEJOH WBSJBCMFT UP WBMVFT


-FUƊT DPOTJEFS IPX UIF CJOEJOH PG WBSJBCMFT XPSLT "QQMZJOH
B GVODUJPO CJOET JUT QBSBNFUFST UP WBMVFT 5ZQF QBSBNFUFST
CFDPNF CPVOE UP B UZQF BOE GVODUJPO WBSJBCMFT BSF CPVOE
UP B WBMVF 5IF CJOEJOH PG WBSJBCMFT DPODFSOT OPU POMZ UIF
BQQMJDBUJPO PG GVODUJPO BSHVNFOUT CVU BMTP UIJOHT MJLF let
FYQSFTTJPOT BOE where DMBVTFT $POTJEFS UIF GPMMPXJOH GVODUJPO

addOne :: Integer -> Integer


addOne x = x + 1

8F EPOƊU LOPX UIF SFTVMU VOUJM UIF addOne GVODUJPO JT BQQMJFE


UP BO Integer WBMVF BSHVNFOU 8IFO addOne JT BQQMJFE UP B
WBMVF XF TBZ UIBU ԧ JT OPX CPVOE UP UIF WBMVF UIF GVODUJPO XBT
BQQMJFE UP 6OUJM B GVODUJPOƊT BSHVNFOUT IBWF CFFO BQQMJFE
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

UIFSFCZ CJOEJOH UIF QBSBNFUFST UP WBMVFT XF DBOOPU NBLF VTF


PG UIF SFTVMU PG UIF GVODUJPO

addOne 1 -- x is now bound to 1


addOne 1 = 1 + 1
= 2

addOne 10 -- x is bound to 10
addOne 10 = 10 + 1
= 11

*O BEEJUJPO UP CJOEJOH WBSJBCMFT UISPVHI GVODUJPO BQQMJDB


UJPO XF DBO VTF let FYQSFTTJPOT UP EFDMBSF BOE CJOE WBSJBCMFT
BT XFMM

bindExp :: Integer -> String


bindExp x = let y = 5 in
"the integer was: " ++ show x
++ " and y was: " ++ show y

*O show y Ԩ JT JO TDPQF CFDBVTF UIF let FYQSFTTJPO CJOET UIF


WBSJBCMF Ԩ UP  Ԩ JT POMZ JO TDPQF JOTJEF UIF let FYQSFTTJPO -FUƊT
TFF TPNFUIJOH UIBU XPOƊU XPSL
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

bindExp :: Integer -> String


bindExp x = let z = y + x in
let y = 5 in "the integer was: "
++ show x ++ " and y was: "
++ show y ++ " and z was: " ++ show z

:PV TIPVME TFF BO FSSPS ƌ/PU JO TDPQF ƉZƊƍ 8F BSF USZJOH


UP NBLF ԩ FRVBM B WBMVF DPOTUSVDUFE GSPN ԧ BOE Ԩ ԧ JT JO
TDPQF CFDBVTF UIF GVODUJPO BSHVNFOU JT WJTJCMF BOZXIFSF JO
UIF GVODUJPO )PXFWFS Ԩ JT CPVOE JO UIF FYQSFTTJPO UIBU let z
= … XSBQT TP JUƊT OPU JO TDPQF ZFU ƈ UIBU JT JUƊT OPU WJTJCMF UP
UIF NBJO GVODUJPO
*O TPNF DBTFT GVODUJPO BSHVNFOUT BSF OPU WJTJCMF JO UIF
GVODUJPO JG UIFZ IBWF CFFO TIBEPXFE -FUƊT MPPL BU B DBTF PG
TIBEPXJOH

bindExp :: Integer -> String


bindExp x = let x = 10; y = 5 in
"the integer was: " ++ show x
++ " and y was: " ++ show y

*G ZPV BQQMZ UIJT UP BO BSHVNFOU ZPVƊMM OPUJDF UIF SFTVMU


OFWFS DIBOHFT

Prelude> bindExp 9001


"the integer was: 10 and y was: 5"
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

5IJT JT CFDBVTF UIF SFGFSFODF UP ԧ BSJTJOH GSPN UIF BSHVNFOU


ԧ XBT TIBEPXFE CZ UIF ԧ GSPN UIF let CJOEJOH 5IF EFƶOJUJPO
PG ԧ UIBU JT JOOFSNPTU JO UIF DPEF XIFSF UIF GVODUJPO OBNF BU
UIF MFǒ NBSHJO JT UIF PVUTJEF
UBLFT QSFDFEFODF CFDBVTF )BTLFMM
JT MFYJDBMMZ TDPQFE -FYJDBM TDPQJOH NFBOT UIBU SFTPMWJOH UIF
WBMVF GPS B OBNFE FOUJUZ EFQFOET PO UIF MPDBUJPO JO UIF DPEF
BOE UIF MFYJDBM DPOUFYU GPS FYBNQMF JO let BOE where DMBVTFT
"NPOH PUIFS UIJOHT UIJT NBLFT JU FBTJFS UP LOPX XIBU WBMVFT
SFGFSSFE UP CZ OBNF BSF BOE XIFSF UIFZ DPNF GSPN -FUƊT
BOOPUBUF UIF QSFWJPVT FYBNQMF BOE XFƊMM TFF XIBU JT NFBOU
IFSF

bindExp :: Integer -> String


bindExp x = let x = 10; y = 5 in "x: " ++ show x
-- [1] [2] [3]
++ " y: " ++ show y

 5IF QBSBNFUFS ԧ JOUSPEVDFE JO UIF EFƶOJUJPO PG bindExp


5IJT HFUT TIBEPXFE CZ UIF ԧ JO [2]

 5IJT JT B letCJOEJOH PG ԧ BOE TIBEPXT UIF EFƶOJUJPO PG ԧ


JOUSPEVDFE BT BO BSHVNFOU BU [1]

 " VTF PG UIF ԧ CPVOE CZ [2] (JWFO )BTLFMMƊT TUBUJD MFYJDBM

TDPQJOH JU XJMM BMXBZT SFGFS UP UIF ԧ EFƶOFE BT x = 10 JO UIF


let CJOEJOH
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

:PV DBO BMTP TFF UIF FƵFDU PG TIBEPXJOH B OBNF JO TDPQF JO


()$J VTJOH UIF let TUBUFNFOUT ZPVƊWF CFFO LJDLJOH BSPVOE BMM
BMPOH

Prelude> let x = 5
Prelude> let y = x + 5
Prelude> y
10
Prelude> y * 10
100
Prelude> let z y = y * 10
Prelude> x
5
Prelude> y
10
Prelude> z 9
90

-- but
Prelude> z y
100

/PUF UIBU XIJMF Ԩ JT CPVOE JO ()$JƊT TDPQF UP x + 5 UIF


JOUSPEVDUJPO PG z y = y * 10 DSFBUFT B OFX JOOFS TDPQF XIJDI
TIBEPXFE UIF OBNF Ԩ /PX XIFO XF DBMM ԩ ()$J XJMM VTF UIF
WBMVF XF QBTT BT Ԩ UP FWBMVBUF UIF FYQSFTTJPO OPU OFDFTTBSJMZ
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

UIF WBMVF 10 GSPN UIF let TUBUFNFOU y = x + 5 6TJOH Ԩ BT BO


BSHVNFOU UP ԩ BT JO UIF MBTU FYBNQMF NFBOT UIF WBMVF PG Ԩ
GSPN UIF PVUFS TDPQF JT QBTTFE UP ԩ BT BO BSHVNFOU 5IF MFY
JDBMMZ JOOFSNPTU CJOEJOH GPS B WBSJBCMF PG B QBSUJDVMBS OBNF
BMXBZT UBLFT QSFDFEFODF *U EPFT OPU NBUUFS UIBU UIF Ԩ JO ԩƊT
QBSBNFUFST IBT UIF TBNF OBNF BT UIF Ԩ GSPN FBSMJFS JO ()$J
Ԩ XJMM BMXBZT CF CPVOE UP UIF WBMVF UIBU ԩ JT BQQMJFE UP *ODJ
EFOUBMMZ UIF TFFNJOHTFRVFOUJBMJUZ PG EFƶOJOH UIJOHT JO ()$J
JT VOEFS UIF IPPE BDUVBMMZ B OFWFSFOEJOH TFSJFT PG OFTUFE
MBNCEB FYQSFTTJPOT TJNJMBS UP UIF XBZ GVODUJPOT DBO TFFN UP
BDDFQU NVMUJQMF BSHVNFOUT CVU BSF BU SPPU B TFSJFT PG OFTUFE
GVODUJPOT


 "OPOZNPVT GVODUJPOT


8F IBWF BMSFBEZ TFFO IPX UP XSJUF BOPOZNPVT GVODUJPOT VTJOH
UIF MBNCEB TZOUBY SFQSFTFOUFE CZ B CBDLTMBTI "OPOZNPVT
NFBOT ƌXJUIPVU B OBNFƍ BOE UIBU HJWFT VT B DMVF UP XIZ XF IBWF
UIJT TZOUBY ƈ UP DPOTUSVDU GVODUJPOT BOE VTF UIFN XJUIPVU
HJWJOH UIFN B OBNF
'PS FYBNQMF FBSMJFS XF MPPLFE BU UIJT OBNFE JF OPU BOPOZ
NPVT GVODUJPO

triple :: Integer -> Integer


triple x = x * 3
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

"OE IFSF JT UIF TBNF GVODUJPO CVU XJUI BOPOZNPVT GVODUJPO


TZOUBY

(\x -> x * 3) :: Integer -> Integer

:PV OFFE UIF QBSFOUIFTFT GPS UIF UZQF BTTFSUJPO :: Integer


-> Integer UP BQQMZ UP UIF FOUJSF BOPOZNPVT GVODUJPO BOE OPU
KVTU UIF Num a => a WBMVF  :PV DBO HJWF UIJT GVODUJPO B OBNF
NBLJOH JU OPU BOPOZNPVT BOZNPSF JO ()$J MJLF UIJT

Prelude> let trip = (\x -> x*3) :: Integer -> Integer

4JNJMBSMZ UP BQQMZ BO BOPOZNPVT GVODUJPO XFƊMM PǒFO OFFE


UP XSBQ JU JO QBSFOUIFTFT TP UIBU PVS JOUFOU JT DMFBS

Prelude> (\x -> x * 3) 5


15
Prelude> \x -> x * 3 1

Could not deduce (Num (a0 -> a))


arising from the ambiguity check for ‘it’
from the context (Num (a1 -> a), Num a1, Num a)
bound by the inferred type for ‘it’:
(Num (a1 -> a), Num a1, Num a) => a -> a
at <interactive>:9:1-13
The type variable ‘a0’ is ambiguous
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

When checking that ‘it’


has the inferred type ‘forall a a1.
(Num (a1 -> a), Num a1, Num a) =>
a -> a’
Probable cause: the inferred type is ambiguous

5IF UZQF FSSPS Could not deduce (Num (a0 -> a)) JT CFDBVTF
ZPV DBOƊU VTF Num a => a WBMVFT BT JG UIFZ XFSF GVODUJPOT 5P
UIF DPNQVUFS JU MPPLT MJLF ZPVƊSF USZJOH UP VTF  BT B GVODUJPO
BOE BQQMZ  UP  )FSF UIF it SFGFSSFE UP JT 3 1 XIJDI JU UIJOLT
JT 3 BQQMJFE UP 1 BT JG 3 XFSF B GVODUJPO

&YFSDJTFT (SBC #BH


/PUF UIF GPMMPXJOH FYFSDJTFT BSF GSPN TPVSDF DPEF ƶMFT OPU
XSJUUFO GPS VTF EJSFDUMZ JO UIF 3&1- 0G DPVSTF ZPV DBO DIBOHF
UIFN UP UFTU EJSFDUMZ JO UIF 3&1- JG ZPV QSFGFS

 8IJDI UXP PS NPSF


PG UIF GPMMPXJOH BSF FRVJWBMFOU

B
mTh x y z = x * y * z

C
mTh x y = \z -> x * y * z

D
mTh x = \y -> \z -> x * y * z

E
mTh = \x -> \y -> \z -> x * y * z

*O ()$J FSSPS NFTTBHFT it SFGFST UP UIF MBTU FYQSFTTJPO ZPV FOUFSFE
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 5IF UZQF PG mTh BCPWF


JT Num a => a -> a -> a -> a
8IJDI JT UIF UZQF PG mTh 3

B
Integer -> Integer -> Integer
C
Num a => a -> a -> a -> a
D
Num a => a -> a
E
Num a => a -> a -> a

 /FYU XFƊMM QSBDUJDF XSJUJOH BOPOZNPVT MBNCEB TZOUBY


'PS FYBNQMF POF DPVME SFXSJUF

addOne x = x + 1

*OUP

addOne = \x -> x + 1

5SZ UP NBLF JU TP JU DBO TUJMM CF MPBEFE BT B UPQMFWFM EFG


JOJUJPO CZ ()$J 5IJT XJMM NBLF JU FBTJFS UP WBMJEBUF ZPVS
BOTXFST

B
3FXSJUF UIF f GVODUJPO JO UIF XIFSF DMBVTF

addOneIfOdd n = case odd n of


True -> f n
False -> n
where f n = n + 1
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

C
3FXSJUF UIF GPMMPXJOH UP VTF BOPOZNPVT MBNCEB TZO
UBY

addFive x y = (if x > y then y else x) + 5


D
3FXSJUF UIF GPMMPXJOH TP UIBU JU EPFTOƊU VTF BOPOZ
NPVT MBNCEB TZOUBY

mflip f = \x -> \y -> f y x

5IF VUJMJUZ PG MBNCEB TZOUBY


:PVƊSF HPJOH UP TFF UIJT BOPOZNPVT TZOUBY B MPU BT XF QSPDFFE
UISPVHI UIF CPPL CVU SJHIU OPX JU NBZ OPU TFFN UP CF UIBU
VTFGVM ƈ JUƊT KVTU BOPUIFS XBZ UP XSJUF GVODUJPOT BǒFS BMM
:PV NPTU PǒFO VTF UIJT TZOUBY XIFO ZPVƊSF QBTTJOH B GVOD
UJPO JO BT BO BSHVNFOU UP B IJHIFSPSEFS GVODUJPO NPSF PO
UIJT TPPO
BOE UIBUƊT UIF POMZ QMBDF JO ZPVS QSPHSBN XIFSF
UIBU QBSUJDVMBS GVODUJPO XJMM CF VTFE *G ZPVƊSF OFWFS HPJOH UP
DBMM JU CZ OBNF UIFO JU EPFTOƊU OFFE UP CF HJWFO B OBNF
8F XPOƊU HP JOUP B MPU PG EFUBJM BCPVU UIJT ZFU CVU OBNFE
FOUJUJFT BOE BOPOZNPVT FOUJUJFT FWBMVBUF B CJU EJƵFSFOUMZ JO
)BTLFMM BOE UIBU DBO CF POF SFBTPO UP VTF BO BOPOZNPVT
GVODUJPO JO TPNF DBTFT
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 1BUUFSO NBUDIJOH


1BUUFSO NBUDIJOH JT BO JOUFHSBM BOE VCJRVJUPVT GFBUVSF PG
)BTLFMM 4P JOUFHSBM BOE VCJRVJUPVT UIBU XFƊWF CFFO VTJOH
JU UISPVHIPVU UIF CPPL XJUIPVU TBZJOH BOZUIJOH BCPVU JU 0ODF
ZPV TUBSU ZPV DBOƊU TUPQ
1BUUFSO NBUDIJOH JT B XBZ PG NBUDIJOH WBMVFT BHBJOTU QBU
UFSOT BOE XIFSF BQQSPQSJBUF CJOEJOH WBSJBCMFT UP TVDDFTTGVM
NBUDIFT *U JT XPSUI OPUJOH IFSF UIBU QBUUFSOT DBO JODMVEF UIJOHT
BT EJWFSTF BT VOEFƶOFE WBSJBCMFT OVNFSJD MJUFSBMT BOE MJTU TZO
UBY "T XF XJMM TFF QBUUFSO NBUDIJOH NBUDIFT PO BOZ BOE BMM
EBUB DPOTUSVDUPST
1BUUFSO NBUDIJOH BMMPXT ZPV UP FYQPTF EBUB BOE EJTQBUDI
EJƵFSFOU CFIBWJPST CBTFE PO UIBU EBUB JO ZPVS GVODUJPO EFƶOJ
UJPOT CZ EFDPOTUSVDUJOH WBMVFT UP FYQPTF UIFJS JOOFS XPSLJOHT
5IFSF JT B SFBTPO XF EFTDSJCF WBMVFT BT ƌEBUB DPOTUSVDUPSTƍ BM
UIPVHI XF IBWFOƊU FYQMPSFE UIBU NVDI ZFU 1BUUFSO NBUDIJOH
BMTP BMMPXT VT UP XSJUF GVODUJPOT UIBU DBO EFDJEF CFUXFFO UXP
PS NPSF QPTTJCJMJUJFT CBTFE PO XIJDI WBMVF JU NBUDIFT
1BUUFSOT BSF NBUDIFE BHBJOTU WBMVFT PS EBUB DPOTUSVDUPST
OPU UZQFT .BUDIJOH B QBUUFSO NBZ GBJM QSPDFFEJOH UP UIF OFYU
BWBJMBCMF QBUUFSO UP NBUDI PS TVDDFFE 8IFO B NBUDI TVD
DFFET UIF WBSJBCMFT FYQPTFE JO UIF QBUUFSO BSF CPVOE 1BUUFSO
NBUDIJOH QSPDFFET GSPN MFǒ UP SJHIU BOE PVUTJEF UP JOTJEF
8F DBO QBUUFSO NBUDI PO OVNCFST *O UIF GPMMPXJOH FYBN
QMF XIFO UIF Integer BSHVNFOU UP UIF GVODUJPO FRVBMT  UIJT
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

SFUVSOT True PUIFSXJTF False

isItTwo :: Integer -> Bool


isItTwo 2 = True
isItTwo _ = False

:PV DBO FOUFS UIF TBNF GVODUJPO EJSFDUMZ JOUP ()$J VTJOH
UIF :{ BOE :} CMPDL TZOUBY KVTU FOUFS :} BOE ƌSFUVSOƍ UP FOE
UIF CMPDL

Prelude> :{
*Main| let isItTwo :: Integer -> Bool
*Main| isItTwo 2 = True
*Main| isItTwo _ = False
*Main| :}

/PUF UIF VTF PG UIF VOEFSTDPSF _ BǒFS UIF NBUDI BHBJOTU UIF
WBMVF 2 5IJT JT B NFBOT PG EFƶOJOH B VOJWFSTBM QBUUFSO UIBU
OFWFS GBJMT UP NBUDI B TPSU PG ƌBOZUIJOH FMTFƍ DBTF

Prelude> isItTwo 2
True
Prelude> isItTwo 3
False

)BOEMJOH BMM UIF DBTFT


5IF PSEFS PG QBUUFSO NBUDIFT NBUUFST 5IF GPMMPXJOH WFSTJPO
PG UIF GVODUJPO XJMM BMXBZT SFUVSO False CFDBVTF JU XJMM NBUDI
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

UIF ƌBOZUIJOH FMTFƍ DBTF ƶSTU ƈ BOE NBUDI JU UP FWFSZUIJOH ƈ


TP OPUIJOH XJMM HFU UISPVHI UIBU UP NBUDI XJUI UIF QBUUFSO ZPV
EP XBOU UP NBUDI

isItTwo :: Integer -> Bool


isItTwo _ = False
isItTwo 2 = True

<interactive>:9:33: Warning:
Pattern match(es) are overlapped
In an equation for ‘isItTwo’: isItTwo 2 = ...
Prelude> isItTwo 2
False
Prelude> isItTwo 3
False

5SZ UP PSEFS ZPVS QBUUFSOT GSPN NPTU TQFDJƶD UP MFBTU TQF


DJƶD QBSUJDVMBSMZ BT JU DPODFSOT UIF VTF PG _ UP VODPOEJUJPOBMMZ
NBUDI BOZ WBMVF 6OMFTT ZPV HFU GBODZ ZPV TIPVME CF BCMF
UP USVTU ()$ƊT QBUUFSO NBUDI PWFSMBQ XBSOJOH BOE TIPVME
USJQMFDIFDL ZPVS DPEF XIFO JU DPNQMBJOT
8IBU IBQQFOT JG XF GPSHFU UP NBUDI B DBTF JO PVS QBUUFSO

isItTwo :: Integer -> Bool


isItTwo 2 = True

/PUJDF UIBU OPX PVS GVODUJPO DBO POMZ QBUUFSO NBUDI PO UIF
WBMVF  5IJT JT BO JODPNQMFUF QBUUFSO NBUDI CFDBVTF JU DBOƊU
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

NBUDI BOZ PUIFS EBUB *ODPNQMFUF QBUUFSO NBUDIFT BQQMJFE UP


EBUB UIFZ EPOƊU IBOEMF XJMM SFUVSO CPUUPN B OPOWBMVF VTFE UP
EFOPUF UIBU UIF QSPHSBN DBOOPU SFUVSO B WBMVF PS SFTVMU 5IJT
XJMM UISPX BO FYDFQUJPO XIJDI JG VOIBOEMFE XJMM NBLF ZPVS
QSPHSBN GBJM

Prelude> isItTwo 2
True
Prelude> isItTwo 3
*** Exception: :50:33-48:
Non-exhaustive patterns
in function isItTwo

8FƊSF HPJOH UP HFU XFMM BDRVBJOUFE XJUI UIF JEFB PG CPUUPN


JO VQDPNJOH DIBQUFST 'PS OPX JUƊT FOPVHI UP LOPX UIBU UIJT
JT XIBU ZPV HFU XIFO ZPV EPOƊU IBOEMF BMM UIF QPTTJCMF EBUB
'PSUVOBUFMZ UIFSFƊT B XBZ UP LOPX BU DPNQJMF UJNF XIFO
ZPVS QBUUFSO NBUDIFT BSF OPOFYIBVTUJWF BOE EPOƊU IBOEMF
FWFSZ DBTF

Prelude> :set -Wall


Prelude> :{
*Main| let isItTwo :: Integer -> Bool
*Main| isItTwo 2 = True
*Main| :}

<interactive>:28:5: Warning:
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

This binding for ‘isItTwo’ shadows


the existing binding
defined at <interactive>:20:5

<interactive>:28:5: Warning:
Pattern match(es) are non-exhaustive
In an equation for ‘isItTwo’:

Patterns not matched: #x with #x `notElem` [2#]

#Z UVSOJOH PO BMM XBSOJOHT XJUI -Wall XFƊSF OPX UPME BIFBE


PG UJNF UIBU XFƊWF NBEF B NJTUBLF %P OPU JHOPSF UIF XBSOJOHT
()$ QSPWJEFT GPS ZPV

1BUUFSO NBUDIJOH BHBJOTU EBUB DPOTUSVDUPST


1BUUFSO NBUDIJOH TFSWFT B DPVQMF PG QVSQPTFT *U FOBCMFT VT UP
WBSZ XIBU PVS GVODUJPOT EP HJWFO EJƵFSFOU JOQVUT *U BMTP BMMPXT
VT UP VOQBDL BOE FYQPTF UIF DPOUFOUT PG PVS EBUB 5IF WBMVFT
True BOE False EPOƊU IBWF BOZ PUIFS EBUB UP FYQPTF CVU TPNF
EBUB DPOTUSVDUPST IBWF QBSBNFUFST BOE QBUUFSO NBUDIJOH DBO
MFU VT FYQPTF BOE NBLF VTF PG UIF EBUB JO UIFJS BSHVNFOUT
5IF OFYU FYBNQMF VTFT newtype XIJDI JT B TQFDJBM DBTF PG data
EFDMBSBUJPOT newtype JT EJƵFSFOU JO UIBU JU QFSNJUT POMZ POF
DPOTUSVDUPS BOE POMZ POF ƶFME 8F XJMM UBML BCPVU newtype NPSF
MBUFS 'PS OPX XF XBOU UP GPDVT PO IPX QBUUFSO NBUDIJOH DBO
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

CF VTFE UP FYQPTF UIF DPOUFOUT PG EBUB BOE TQFDJGZ CFIBWJPS


CBTFE PO UIBU EBUB

-- registeredUser1.hs
module RegisteredUser where

newtype Username = Username String


newtype AccountNumber = AccountNumber Integer

data User = UnregisteredUser


| RegisteredUser Username AccountNumber

8JUI UIF UZQF User XF DBO VTF QBUUFSO NBUDIJOH UP BD


DPNQMJTI UXP UIJOHT 'JSTU User JT B TVN XJUI UXP DPOTUSVD
UPST UnregisteredUser BOE RegisteredUser 8F DBO VTF QBUUFSO
NBUDIJOH UP EJTQBUDI PVS GVODUJPO EJƵFSFOUMZ EFQFOEJOH PO
XIJDI WBMVF XF HFU 5IFO XJUI UIF RegisteredUser DPOTUSVD
UPS XF TFF UIBU JU JT B QSPEVDU PG UXP newtypeT Username BOE
AccountNumber 8F DBO VTF QBUUFSO NBUDIJOH UP CSFBL EPXO
OPU POMZ RegisteredUserƊT DPOUFOUT CVU BMTP UIBU PG UIF newtypes
JG BMM UIF DPOTUSVDUPST BSF JO TDPQF -FUƊT XSJUF B GVODUJPO UP
QSFUUZQSJOU User WBMVFT
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-- registeredUser2.hs
module RegisteredUser where

newtype Username = Username String


newtype AccountNumber = AccountNumber Integer

data User = UnregisteredUser


| RegisteredUser Username AccountNumber

printUser :: User -> IO ()


printUser UnregisteredUser = putStrLn "UnregisteredUser"
printUser (RegisteredUser (Username name)
(AccountNumber acctNum))
= putStrLn $ name ++ " " ++ show acctNum

/PUF UIBU ZPV DBO DPOUJOVF UIF QBUUFSO PO UIF OFYU MJOF JG JU
HFUT UPP MPOH /FYU MFUƊT MPBE UIJT JOUP UIF 3&1- BOE MPPL BU
UIF UZQFT

Prelude> :l code/registeredUser2.hs
...
Prelude> :t RegisteredUser
RegisteredUser :: Username -> AccountNumber -> User
Prelude> :t Username
Username :: String -> Username
Prelude> :t AccountNumber
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

AccountNumber :: Integer -> AccountNumber

/PUJDF IPX UIF UZQF PG RegisteredUser JT B GVODUJPO UIBU DPO


TUSVDUT B User PVU PG UXP BSHVNFOUT Username BOE AccountNumber
5IJT JT XIBU XF NFBO XIFO XF SFGFS UP B WBMVF BT B ƌEBUB DPO
TUSVDUPSƍ
/PX MFUƊT VTF PVS GVODUJPOT 5IF BSHVNFOU OBNFT BSF UF
EJPVT UP UZQF JO CVU UIFZ XFSF DIPTFO UP FOTVSF DMBSJUZ 1BTTJOH
UIF GVODUJPO BO UnregisteredUser SFUVSOT UIF FYQFDUFE WBMVF

Prelude> printUser UnregisteredUser


UnregisteredUser

5IF GPMMPXJOH UIPVHI BTLT JU UP NBUDI PO EBUB DPOTUSVDUPS


RegisteredUser BOE BMMPXT VT UP DPOTUSVDU B User PVU PG UIF 4USJOH
ƌDBMMFOƍ BOE UIF Integer 

Prelude> let myUser = (Username "callen")


Prelude> let myAcct = (AccountNumber 10456)
Prelude> printUser $ RegisteredUser myUser myAcct
callen 10456

5ISPVHI UIF VTF PG QBUUFSO NBUDIJOH XF XFSF BCMF UP VO


QBDL UIF RegisteredUser WBMVF PG UIF User UZQF BOE WBSZ CFIBW
JPS PWFS UIF EJƵFSFOU DPOTUSVDUPST PG UZQFT
5IJT JEFB PG VOQBDLJOH BOE EJTQBUDIJOH PO EBUB JT JNQPS
UBOU TP MFU VT FYBNJOF BOPUIFS FYBNQMF 'JSTU XFƊSF HPJOH UP
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

XSJUF B DPVQMF PG OFX EBUBUZQFT 8SJUJOH ZPVS PXO EBUBUZQFT


XPOƊU CF GVMMZ FYQMBJOFE VOUJM B MBUFS DIBQUFS CVU NPTU PG UIF
TUSVDUVSF IFSF TIPVME CF GBNJMJBS BMSFBEZ 8F IBWF B TVN UZQF
DBMMFE WherePenguinsLive

data WherePenguinsLive =
Galapagos
| Antarctica
| Australia
| SouthAfrica
| SouthAmerica
deriving (Eq, Show)

"OE B QSPEVDU UZQF DBMMFE Penguin. 8F IBWFOƊU HJWFO QSPE


VDU UZQFT NVDI BUUFOUJPO ZFU CVU GPS OPX ZPV DBO UIJOL PG
Penguin BT B UZQF XJUI POMZ POF WBMVF Peng BOE UIBU WBMVF JT B
TPSU PG CPY UIBU DPOUBJOT B WherePenguinsLive WBMVF

data Penguin =
Peng WherePenguinsLive
deriving (Eq, Show)

(JWFO UIFTF EBUBUZQFT XF XJMM XSJUF B DPVQMF GVODUJPOT GPS


QSPDFTTJOH UIF EBUB
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-- is it South Africa? If so, return True


isSouthAfrica :: WherePenguinsLive -> Bool
isSouthAfrica SouthAfrica = True
isSouthAfrica Galapagos = False
isSouthAfrica Antarctica = False
isSouthAfrica Australia = False
isSouthAfrica SouthAmerica = False

#VU UIBU JT SFEVOEBOU 8F DBO VTF _ UP JOEJDBUF BO VODPOEJ


UJPOBM NBUDI PO B WBMVF XF EPOƊU DBSF BCPVU 5IF GPMMPXJOH JT
CFUUFS NPSF DPODJTF FBTJFS UP SFBE
BOE EPFT UIF TBNF UIJOH

isSouthAfrica' :: WherePenguinsLive -> Bool


isSouthAfrica' SouthAfrica = True
isSouthAfrica' _ = False

8F DBO BMTP VTF QBUUFSO NBUDIJOH UP VOQBDL Penguin WBMVFT


UP HFU BU UIF WherePenguinsLive WBMVF JU DPOUBJOT

gimmeWhereTheyLive :: Penguin -> WherePenguinsLive


gimmeWhereTheyLive (Peng whereitlives) = whereitlives

5SZ VTJOH UIF gimmeWhereTheyLive GVODUJPO PO TPNF UFTU EBUB


8IFO ZPV FOUFS UIF OBNF PG UIF QFOHVJO OPUF UIF MPXFSDBTF

JU XJMM VOQBDL UIF Peng WBMVF UP KVTU SFUVSO UIF WherePenguinsLive
UIBUƊT JOTJEF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

humboldt = Peng SouthAmerica


gentoo = Peng Antarctica
macaroni = Peng Antarctica
little = Peng Australia
galapagos = Peng Galapagos

/PX B NPSF FMBCPSBUF FYBNQMF 8FƊMM FYQPTF UIF DPOUFOUT


PG Peng BOE NBUDI PO XIBU WherePenguinLives WBMVF XF DBSF
BCPVU JO POF QBUUFSO NBUDI

galapagosPenguin :: Penguin -> Bool


galapagosPenguin (Peng Galapagos) = True
galapagosPenguin _ = False

antarcticPenguin :: Penguin -> Bool


antarcticPenguin (Peng Antarctica) = True
antarcticPenguin _ = False

-- in this final function, the || operator


-- is an `or` function, which will return True
-- if either value is True
antarcticOrGalapagos :: Penguin -> Bool
antarcticOrGalapagos p =
(galapagosPenguin p) || (antarcticPenguin p)

/PUF UIBU XFƊSF VTJOH QBUUFSO NBUDIJOH UP BDDPNQMJTI UXP


$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

UIJOHT IFSF 8FƊSF VTJOH JU UP VOQBDL UIF Penguin EBUBUZQF


8FƊSF BMTP TQFDJGZJOH XIJDI WherePenguinsLive WBMVF XF XBOU
UP NBUDI PO

1BUUFSO NBUDIJOH UVQMFT


:PV DBO BMTP VTF QBUUFSO NBUDIJOH SBUIFS UIBO GVODUJPOT GPS
PQFSBUJOH PO UIF DPOUFOUT PG UVQMFT 3FNFNCFS UIJT FYBNQMF
GSPN #BTJD %BUBUZQFT

f :: (a, b) -> (c, d) -> ((b, d), (a, c))


f = undefined

8IFO ZPV EJE UIBU FYFSDJTF ZPV NBZ IBWF XSJUUFO JU MJLF
UIJT

f :: (a, b) -> (c, d) -> ((b, d), (a, c))


f x y = ((snd x, snd y), (fst x, fst y))

#VU XF DBO VTF QBUUFSO NBUDIJOH PO UVQMFT UP NBLF B DMFBSFS


BOE OJDFS UP SFBE WFSTJPO PG JU

f :: (a, b) -> (c, d) -> ((b, d), (a, c))


f (a, b) (c, d) = ((b, d), (a, c))

0OF OJDF UIJOH BCPVU UIJT JT UIBU UIF UVQMF TZOUBY BMMPXT UIF
GVODUJPO UP MPPL B HSFBU EFBM MJLF JUT UZQF -FUƊT MPPL BU NPSF
FYBNQMFT PG QBUUFSO NBUDIJOH PO UVQMFT /PUF UIBU UIF TFDPOE
FYBNQMF CFMPX JT OPU B QBUUFSO NBUDI CVU UIF PUIFST BSF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-- matchingTuples1.hs
module TupleFunctions where

-- These have to be the same type because


-- (+) is a -> a -> a
addEmUp2 :: Num a => (a, a) -> a
addEmUp2 (x, y) = x + y

-- addEmUp2 could also be written like so


addEmUp2Alt :: Num a => (a, a) -> a
addEmUp2Alt tup = (fst tup) + (snd tup)

fst3 :: (a, b, c) -> a


fst3 (x, _, _) = x

third3 :: (a, b, c) -> c


third3 (_, _, x) = x

Prelude> :l code/matchingTuples1.hs
[1 of 1] Compiling TupleFunctions
Ok, modules loaded: TupleFunctions.

/PX XFƊSF HPJOH UP VTF ()$JƊT :browse UP TFF B MJTU PG UIF


UZQF TJHOBUVSFT BOE GVODUJPOT XF MPBEFE GSPN UIF NPEVMF
TupleFunctions
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

Prelude> :browse TupleFunctions


addEmUp2 :: Num a => (a, a) -> a
addEmUp2Alt :: Num a => (a, a) -> a
fst3 :: (a, b, c) -> a
third3 :: (a, b, c) -> c

Prelude> addEmUp2 (10, 20)


30
Prelude> addEmUp2Alt (10, 20)
30
Prelude> fst3 ("blah", 2, [])
"blah"
Prelude> third3 ("blah", 2, [])
[]

4XFFU -FUƊT EP TPNF FYFSDJTFT 1BVTJOH UP FYFSDJTF LFFQT


UIF NVTDMFT ƷFYJCMF FWFO UIF NFOUBM POFT

&YFSDJTFT 7BSJFUZ 1BDL


 (JWFO UIF GPMMPXJOH EFDMBSBUJPOT

k (x, y) = x
k1 = k ((4-1), 10)
k2 = k ("three", (1 + 2))
k3 = k (3, True)
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

B
8IBU JT UIF UZQF PG k
C
8IBU JT UIF UZQF PG k2 *T JU UIF TBNF UZQF BT k1 PS k3
D
0G k1, k2, k3 XIJDI XJMM SFUVSO UIF OVNCFS  BT UIF
SFTVMU

 'JMM JO UIF EFƶOJUJPO PG UIF GPMMPXJOH GVODUJPO

-- Remember: Tuples have the same syntax for their


-- type constructors and their data constructors.

f :: (a, b, c) -> (d, e, f) -> ((a, d), (c, f))


f = undefined

 $BTF FYQSFTTJPOT


$BTF FYQSFTTJPOT BSF B XBZ TJNJMBS JO TPNF SFTQFDUT UP if-then-else
PG NBLJOH B GVODUJPO SFUVSO B EJƵFSFOU SFTVMU CBTFE PO EJƵFS
FOU JOQVUT :PV DBO VTF DBTF FYQSFTTJPOT XJUI BOZ EBUBUZQF UIBU
IBT WJTJCMF EBUB DPOTUSVDUPST 8IFO XF DPOTJEFS UIF EBUBUZQF
Bool

data Bool = False | True


-- [1] [2] [3]

 5ZQF DPOTUSVDUPS XF POMZ VTF UIJT JO UZQF TJHOBUVSFT OPU


JO UFSNMFWFM DPEF MJLF DBTF FYQSFTTJPOT
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 %BUB DPOTUSVDUPS GPS UIF JOIBCJUBOU PG Bool OBNFE False


ƈ XF DBO NBUDI PO UIJT

 %BUB DPOTUSVDUPS GPS UIF JOIBCJUBOU PG Bool OBNFE True ƈ


XF DBO NBUDI PO UIJT BT XFMM

"OZ UJNF XF DBTF NBUDI PS QBUUFSO NBUDI PO B TVN UZQF


MJLF Bool XF TIPVME EFƶOF IPX XF IBOEMF FBDI DPOTUSVDUPS
PS QSPWJEF B EFGBVMU UIBU NBUDIFT BMM PG UIFN *O GBDU XF NVTU
IBOEMF CPUI DBTFT PS VTF B GVODUJPO UIBU IBOEMFT CPUI PS XF
XJMM IBWF XSJUUFO B QBSUJBM GVODUJPO UIBU DBO UISPX BO FSSPS
BU SVOUJNF 5IFSF JT SBSFMZ B HPPE SFBTPO UP EP UIJT XSJUF
GVODUJPOT UIBU IBOEMF BMM JOQVUT QPTTJCMF
-FUƊT TUBSU CZ MPPLJOH BU BO if-then-else FYQSFTTJPO UIBU XF
TBX JO B QSFWJPVT DIBQUFS

if x + 1 == 1 then "AWESOME" else "wut"

8F DBO SFXSJUF UIJT BT B DBTF FYQSFTTJPO NBUDIJOH PO UIF


DPOTUSVDUPST PG Bool

funcZ x =
case x + 1 == 1 of
True -> "AWESOME"
False -> "wut"
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

/PUF UIBU XIJMF UIF TZOUBY JT DPOTJEFSBCMZ EJƵFSFOU IFSF


UIF SFTVMUT XJMM CF UIF TBNF #F TVSF UP MPBE JU JO UIF 3&1- BOE
USZ JU PVU
8F DPVME BMTP XSJUF B DBTF FYQSFTTJPO UP UFMM VT XIFUIFS PS
OPU TPNFUIJOH JT B QBMJOESPNF

pal xs =
case xs == reverse xs of
True -> "yes"
False -> "no"

5IF BCPWF DBO BMTP CF XSJUUFO XJUI B where DMBVTF JO DBTFT


XIFSF ZPV NJHIU OFFE UP SFVTF UIF Ԩ

pal' xs =
case y of
True -> "yes"
False -> "no"
where y = xs == reverse xs

*O FJUIFS DBTF UIF GVODUJPO XJMM ƶSTU DIFDL JG UIF JOQVU TUSJOH
JT FRVBM UP UIF SFWFSTF PG JU *G UIBU SFUVSOT True UIFO UIF TUSJOH
JT B QBMJOESPNF TP ZPVS GVODUJPO TBZT ƌZFTƍ *G OPU UIFO JUƊT
OPU
)FSF JT POF NPSF FYBNQMF BMTP NBUDIJOH PO UIF EBUB DPO
TUSVDUPST GSPN Bool BOE ZPV DBO DPNQBSF JUT TZOUBY UP UIF
if-then-else WFSTJPO XFƊWF TFFO CFGPSF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-- greetIfCool3.hs
module GreetIfCool3 where

greetIfCool :: String -> IO ()


greetIfCool coolness =
case cool of
True -> putStrLn "eyyyyy. What's shakin'?"
False -> putStrLn "pshhhh."
where cool = coolness == "downright frosty yo"

4P GBS UIF DBTF FYQSFTTJPOT XFƊWF MPPLFE BU SFMZ PO B TUSBJHIU


GPSXBSE QBUUFSO NBUDI XJUI True BOE False FYQMJDJUMZ *O BO
VQDPNJOH TFDUJPO XFƊMM MPPL BU BOPUIFS XBZ UP XSJUF B DBTF
FYQSFTTJPO

&YFSDJTFT $BTF 1SBDUJDF


8FƊSF HPJOH UP QSBDUJDF VTJOH DBTF FYQSFTTJPOT CZ SFXSJUJOH
GVODUJPOT 4PNF PG UIFTF GVODUJPOT ZPVƊWF TFFO JO QSFWJPVT
DIBQUFST BOE TPNF ZPVƊMM TFF MBUFS VTJOH EJƵFSFOU TZOUBY ZFU
BHBJO
CVU ZPVƊMM CF XSJUJOH OFX WFSTJPOT OPX 1MFBTF OPUF
UIFTF BSF BMM XSJUUFO BT UIFZ XPVME CF JO TPVSDF DPEF ƶMFT BOE
XF SFDPNNFOE ZPV XSJUF ZPVS BOTXFST JO TPVSDF ƶMFT BOE
UIFO MPBE JOUP ()$J UP DIFDL SBUIFS UIBO USZJOH UP EP UIFN
EJSFDUMZ JOUP UIF 3&1-
'JSTU SFXSJUF if-then-else FYQSFTTJPOT JOUP DBTF FYQSFTTJPOT
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 5IF GPMMPXJOH TIPVME SFUVSO x XIFO x JT HSFBUFS UIBO y

functionC x y = if (x > y) then x else y

 5IF GPMMPXJOH XJMM BEE  UP FWFO OVNCFST BOE PUIFSXJTF


TJNQMZ SFUVSO UIF JOQVU WBMVF

ifEvenAdd2 n = if even n then (n+2) else n

5IF OFYU FYFSDJTF EPFTOƊU IBWF BMM UIF DBTFT DPWFSFE 4FF
JG ZPV DBO ƶY JU

 5IF GPMMPXJOH DPNQBSFT B WBMVF x UP [FSP BOE SFUVSOT BO


JOEJDBUPS GPS XIFUIFS x JT B QPTUJWF OVNCFS PS OFHBUJWF
OVNCFS #VU XIBU JG x JT  :PV NBZ OFFE UP QMBZ XJUI
UIF compare GVODUJPO B CJU UP ƶOE XIBU UP EP

nums x =
case compare x 0 of
LT -> -1
GT -> 1

 )JHIFSPSEFS GVODUJPOT


)JHIFSPSEFS GVODUJPOT )0'T
BSF GVODUJPOT UIBU BDDFQU GVOD
UJPOT BT BSHVNFOUT 'VODUJPOT BSF KVTU WBMVFT ƈ XIZ DPVMEOƊU
UIFZ CF QBTTFE BSPVOE MJLF BOZ PUIFS WBMVFT 5IJT JT BO JN
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

QPSUBOU DPNQPOFOU PG GVODUJPOBM QSPHSBNNJOH BOE HJWFT VT


B XBZ UP DPNCJOF GVODUJPOT FƸDJFOUMZ
-FUƊT FYBNJOF B TUBOEBSE IJHIFSPSEFS GVODUJPO flip

Prelude> :t flip
flip :: (a -> b -> c) -> b -> a -> c

-- using (-) as our (a -> b -> c)


Prelude> (-) 10 1
9
Prelude> let fSub = flip (-)
Prelude> fSub 10 1
-9
Prelude> fSub 5 10
5

5IF ƶSTU QBSBNFUFS PG flip JT B GVODUJPO TVDI BT (-) UIBU


JUTFMG IBT UXP QBSBNFUFST flip ƷJQT UIF PSEFS PG UIF BSHVNFOUT
8F DBO JNQMFNFOU flip MJLF UIJT VTJOH UIF WBSJBCMF ԕ UP
SFQSFTFOU UIF GVODUJPO (a -> b -> c)

flip :: (a -> b -> c) -> b -> a -> c


flip f x y = f y x

"MUFSOBUFMZ JU DPVMEƊWF CFFO XSJUUFO BT

myFlip :: (a -> b -> c) -> b -> a -> c


myFlip f = \ x y -> f y x
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

5IFSFƊT OP EJƵFSFODF JO XIBU flip BOE myFlip EP POF EF


DMBSFT QBSBNFUFST JO UIF GVODUJPO EFƶOJUJPO BOE UIF PUIFS
EFDMBSFT UIFN JOTUFBE JO UIF BOPOZNPVT GVODUJPO WBMVF CFJOH
SFUVSOFE #VU XIBU NBLFT ƷJQ B IJHIFSPSEFS GVODUJPO 8FMM
JUƊT UIJT

flip :: (a -> b -> c) -> b -> a -> c


[ 1 ]
flip f x y = f y x
[2] [3]

 8IFO XF XBOU UP FYQSFTT B GVODUJPO BSHVNFOU XJUIJO B


GVODUJPO UZQF XF NVTU VTF QBSFOUIFTFT UP OFTU JU

 5IF BSHVNFOU ԕ JT UIF GVODUJPO a -> b -> c

 8F BQQMZ ԕ UP ԧ BOE Ԩ CVU flip XJMM ƷJQ UIF PSEFS PG BQ


QMJDBUJPO BOE BQQMZ ԕ UP Ԩ BOE UIFO ԧ JOTUFBE PG UIF VTVBM
PSEFS

5P CFUUFS VOEFSTUBOE IPX )0'T XPSL TZOUBDUJDBMMZ JUƊT


XPSUI SFNFNCFSJOH IPX QBSFOUIFTFT BTTPDJBUF JO UZQF TJHOB
UVSFT
-FUƊT MPPL BU UIF UZQF PG UIF GPMMPXJOH GVODUJPO

returnLast :: a -> b -> c -> d -> d


returnLast _ _ _ d = d
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

*G XF FYQMJDJUMZ QBSFOUIFTJ[F returnLast JU NVTU NBUDI UIF


BTTPDJBUJWJUZ PG -> XIJDI JT SJHIUBTTPDJBUJWF 5IF GPMMPXJOH
QBSFOUIFTJ[BUJPO XPSLT ƶOF /PUF UIBU UIJT NFSFMZ NBLFT UIF
EFGBVMU DVSSZJOH FYQMJDJU

returnLast' :: a -> (b -> (c -> (d -> d)))


returnLast' _ _ _ d = d

)PXFWFS UIJT XJMM OPU XPSL 5IJT JT OPU IPX -> BTTPDJBUFT

returnBroke :: (((a -> b) -> c) -> d) -> d


returnBroke _ _ _ d = d

*G ZPV BUUFNQU UP MPBE returnBroke ZPVƊMM HFU B UZQF FSSPS

Couldn't match expected type ‘t0 -> t1 -> t2 -> t2’


with actual type ‘d’

‘d’ is a rigid type variable bound by


the type signature for
returnBroke :: (((a -> b) -> c) -> d) -> d

Relevant bindings include


returnBroke :: (((a -> b) -> c) -> d) -> d

The equation(s) for ‘returnBroke’ have four arguments,


but its type ‘(((a -> b) -> c) -> d) -> d’
has only one
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

5IJT UZQF FSSPS JT UFMMJOH VT UIBU UIF UZQF PG returnBroke POMZ


TQFDJƶFT POF BSHVNFOU UIBU IBT UIF UZQF ((a -> b) -> c) -> d
ZFU PVS GVODUJPO EFƶOJUJPO TFFNT UP FYQFDU GPVS BSHVNFOUT
5IF UZQF TJHOBUVSF PG returnBroke TQFDJƶFT B TJOHMF GVODUJPO BT
UIF TPMF BSHVNFOU UP returnBroke
8F DBO IBWF B UZQF UIBU JT QBSFOUIFTJ[FE JO UIBU GBTIJPO BT
MPOH BT XF XBOU UP EP TPNFUIJOH EJƵFSFOU UIBO XIBU returnLast
EPFT

returnAfterApply :: (a -> b) -> a -> c -> b


returnAfterApply f a c = f a

8IBU XFƊSF EPJOH IFSF JT QBSFOUIFTJ[JOH UP UIF MFǕ TP UIBU


XF DBO SFGFS UP B TFQBSBUF GVODUJPO XJUI JUT PXO QBSBNFUFST
BOE SFTVMU BT BO BSHVNFOU UP PVS UPQ MFWFM GVODUJPO )FSF UIF
(a -> b) JT UIF ԕ BSHVNFOU XF VTF UP QSPEVDF B WBMVF PG UZQF ԑ
GSPN B WBMVF PG UZQF Ԑ
0OF SFBTPO XF XBOU )0'T JT UP NBOJQVMBUF IPX GVODUJPOT
BSF BQQMJFE UP BSHVNFOUT 5P VOEFSTUBOE BOPUIFS SFBTPO MFUƊT
SFWJTJU UIF compare GVODUJPO GSPN UIF Ord UZQFDMBTT

Prelude> :t compare
compare :: Ord a => a -> a -> Ordering
Prelude> :info Ordering
data Ordering = LT | EQ | GT

'VO GBDU returnBroke JT BO JNQPTTJCMF GVODUJPO
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

Prelude> compare 10 9
GT
Prelude> compare 9 9
EQ
Prelude> compare 9 10
LT

/PX XFƊMM XSJUF B GVODUJPO UIBU NBLFT VTF PG UIJT


$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

data Employee = Coder


| Manager
| Veep
| CEO
deriving (Eq, Ord, Show)

reportBoss :: Employee -> Employee -> IO ()


reportBoss e e' =
putStrLn $ show e ++ " is the boss of " ++ show e'

employeeRank :: Employee -> Employee -> IO ()


employeeRank e e' =
case compare e e' of
GT -> reportBoss e e'
-- [ 1 ]
EQ -> putStrLn "Neither employee is the boss"
-- [ 2 ]
LT -> (flip reportBoss) e e'
-- [ 3 ]

5IF case JO UIF employeeRank GVODUJPO JT B DBTF FYQSFTTJPO


5IJT GVODUJPO TBZT case expression

 *O UIF DBTF PG DPNQBSJOH F BOE FƊ BOE ƶOEJOH F JT HSFBUFS


UIBO FƊ SFUVSO reportBoss F FƊ
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 *O UIF DBTF PG ƶOEJOH UIFN FRVBM SFUVSO UIF TUSJOH ƌ/FJ


UIFS FNQMPZFF JT UIF CPTTƍ

 *O UIF DBTF PG ƶOEJOH F MFTT UIBO FƊ ƷJQ UIF GVODUJPO reportBoss


5IJT DPVME BMTP IBWF CFFO XSJUUFO reportBoss e' e

5IF compare GVODUJPO VTFT UIF CFIBWJPS PG UIF Ord JOTUBODF


EFƶOFE GPS B HJWFO UZQF JO PSEFS UP DPNQBSF UIFN *O UIJT
DBTF PVS EBUB EFDMBSBUJPO MJTUT UIFN JO PSEFS GSPN Coder JO
UIF MPXFTU SBOL BOE CEO JO UIF UPQ SBOL TP compare XJMM VTF UIBU
PSEFSJOH UP FWBMVBUF UIF SFTVMU PG UIF GVODUJPO
*G XF MPBE UIJT VQ BOE USZ JU PVU

Prelude> employeeRank Veep CEO


CEO is the boss of Veep

5IBUƊT QSPCBCMZ USVF JO NPTU DPNQBOJFT #FJOH JOEVTUSJPVT


QSPHSBNNFST XF OBUVSBMMZ XBOU UP SFGBDUPS UIJT B CJU UP CF
NPSF ƷFYJCMF ƈ OPUJDF IPX XF DIBOHF UIF UZQF PG employeeRank
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

data Employee = Coder


| Manager
| Veep
| CEO
deriving (Eq, Ord, Show)

reportBoss :: Employee -> Employee -> IO ()


reportBoss e e' =
putStrLn $ show e ++ " is the boss of " ++ show e'

employeeRank :: (Employee -> Employee -> Ordering)


-> Employee
-> Employee
-> IO ()
employeeRank f e e' =
case f e e' of
GT -> reportBoss e e'
EQ -> putStrLn "Neither employee is the boss"
LT -> (flip reportBoss) e e'

/PX PVS employeeRank GVODUJPO XJMM BDDFQU B GVODUJPO BSHV


NFOU XJUI UIF UZQF Employee -> Employee -> Ordering XIJDI XF
OBNFE ԕ JO UIF QMBDF XIFSF XF IBE compare CFGPSF :PVƊMM OP
UJDF XF IBWF UIF TBNF DBTF FYQSFTTJPOT IFSF BHBJO 8F DBO HFU
UIF TBNF CFIBWJPS XF IBE MBTU UJNF CZ KVTU QBTTJOH JU compare
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

BT UIF GVODUJPO BSHVNFOU

Prelude> employeeRank compare Veep CEO


CEO is the boss of Veep
Prelude> employeeRank compare CEO Veep
CEO is the boss of Veep

#VU TJODF XFƊSF DMFWFS IBDLFST XF DBO TVCWFSU UIF IJFSBSDIZ


XJUI B DPNQBSJTPO GVODUJPO UIBU EPFT TPNFUIJOH B CJU EJƵFSFOU
XJUI UIF GPMMPXJOH DPEF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

data Employee = Coder


| Manager
| Veep
| CEO
deriving (Eq, Ord, Show)

reportBoss :: Employee -> Employee -> IO ()


reportBoss e e' =
putStrLn $ show e ++ " is the boss of " ++ show e'

codersRuleCEOsDrool :: Employee -> Employee -> Ordering


codersRuleCEOsDrool Coder Coder = EQ
codersRuleCEOsDrool Coder _ = GT
codersRuleCEOsDrool _ Coder = LT
codersRuleCEOsDrool e e' = compare e e'

employeeRank :: (Employee -> Employee -> Ordering)


-> Employee
-> Employee
-> IO ()
employeeRank f e e' =
case f e e' of
GT -> reportBoss e e'
EQ -> putStrLn "Neither employee is the boss"
LT -> (flip reportBoss) e e'
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

)FSF XFƊWF DSFBUFE B OFX GVODUJPO UIBU DIBOHFT UIF CFIBW


JPS PG UIF OPSNBM compare GVODUJPO CZ QBUUFSO NBUDIJOH PO
PVS EBUB DPOTUSVDUPS Coder *O B DBTF XIFSF Coder JT UIF ƶSTU
WBMVF BOE UIF TFDPOE WBMVF JT BOZUIJOH ƈ OPUF UIF VOEFSTDPSF
VTFE BT B DBUDIBMM
UIF SFTVMU XJMM CF GT PS HSFBUFS UIBO *O
B DBTF XIFSF Coder JT UIF TFDPOE WBMVF QBTTFE UIJT GVODUJPO
XJMM SFUVSO B LT PS MFTT UIBO SFTVMU *O BOZ DBTF XIFSF Coder JT
OPU POF PG UIF WBMVFT compare XJMM FYIJCJU JUT OPSNBM CFIBWJPS
5IF DBTF FYQSFTTJPO JO UIF employeeRank GVODUJPO JT PUIFSXJTF
VODIBOHFE
"OE IFSFƊT IPX UIBU XPSLT

Prelude> employeeRank compare Coder CEO


CEO is the boss of Coder
Prelude> employeeRank codersRuleCEOsDrool Coder CEO
Coder is the boss of CEO
Prelude> employeeRank codersRuleCEOsDrool CEO Coder
Coder is the boss of CEO

*G XF VTF compare BT PVS ԕ BSHVNFOU UIFO UIF CFIBWJPS


JT VODIBOHFE *G PO UIF PUIFS IBOE XF VTF PVS OFX GVOD
UJPO codersRuleCEOsDrool BT UIF ԕ BSHVNFOU UIFO UIF CFIBWJPS
DIBOHFT BOE XF VOMFBTI BOBSDIZ JO UIF DVCJDMF GBSN
8F XFSF BCMF UP SFMZ PO UIF CFIBWJPS PG compare CVU NBLF
DIBOHFT JO UIF QBSU XF XBOUFE UP DIBOHF 5IJT JT UIF WBMVF PG
)0'T 5IFZ HJWF VT UIF CFHJOOJOHT PG B QPXFSGVM NFUIPE GPS
SFVTJOH BOE DPNQPTJOH DPEF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

&YFSDJTFT "SUGVM %PEHZ


(JWFO UIF GPMMPXJOH EFƶOJUJPOT UFMM VT XIBU WBMVF SFTVMUT GSPN
GVSUIFS BQQMJDBUJPOT 8IFO ZPVƊWF XSJUUFO EPXO BU MFBTU TPNF
PG UIF BOTXFST BOE UIJOL ZPV LOPX XIBUƊT XIBU UZQF UIF EFG
JOJUJPOT JOUP B ƶMF BOE MPBE UIFN JO ()$J UP UFTU ZPVS BOTXFST

-- Types not provided, try filling them in yourself.

dodgy x y = x + y * 10
oneIsOne = dodgy 1
oneIsTwo = (flip dodgy) 2

 'PS FYBNQMF HJWFO UIF FYQSFTTJPO dodgy 1 0 XIBU EP ZPV


UIJOL XJMM IBQQFO JG XF FWBMVBUF JU *G ZPV QVU UIF EFG
JOJUJPOT JO B ƶMF BOE MPBE UIFN JO ()$J ZPV DBO EP UIF
GPMMPXJOH UP TFF UIF SFTVMU

Prelude> dodgy 1 0
1

/PX BUUFNQU UP EFUFSNJOF XIBU UIF GPMMPXJOH FYQSFTTJPOT


SFEVDF UP %P JU JO ZPVS IFBE WFSJGZ JO ZPVS 3&1- BǒFS
ZPV UIJOL ZPV IBWF BO BOTXFS

 dodgy 1 1

 dodgy 2 2
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 dodgy 1 2

 dodgy 2 1

 oneIsOne 1

 oneIsOne 2

 oneIsTwo 1

 oneIsTwo 2

 oneIsOne 3

 oneIsTwo 3

 (VBSET
8F IBWF QMBZFE BSPVOE XJUI CPPMFBOT BOE FYQSFTTJPOT UIBU
FWBMVBUF UP UIFJS USVUI WBMVF JODMVEJOH if-then-else FYQSFTTJPOT
XIJDI SFMZ PO CPPMFBO FWBMVBUJPO UP EFDJEF CFUXFFO UXP PVU
DPNFT *O UIJT TFDUJPO XF XJMM MPPL BU BOPUIFS TZOUBDUJD QBUUFSO
DBMMFE HVBSET UIBU SFMJFT PO USVUI WBMVFT UP EFDJEF CFUXFFO UXP
PS NPSF QPTTJCMF SFTVMUT

JGUIFOFMTF
-FUƊT CFHJO XJUI B RVJDL SFWJFX PG XIBU XF MFBSOFE BCPVU
if-then-else FYQSFTTJPOT JO UIF #BTJD %BUBUZQFT DIBQUFS /PUF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

if-then-else JT OPU HVBSET 8FƊSF KVTU SFWJFXJOH TPNFUIJOH TJN


JMBS CFGPSF NPWJOH PO UP HVBSET UIFNTFMWFT 5IF QBUUFSO JT
UIJT

if <condition>
then <result if True>
else <result if False>

XIFSF UIF if DPOEJUJPO JT BO FYQSFTTJPO UIBU SFTVMUT JO B Bool


WBMVF 8F TBX IPX UIJT BMMPXT VT UP XSJUF GVODUJPOT MJLF UIJT

Prelude> let x = 0
Prelude> if (x + 1 == 1) then "AWESOME" else "wut"
"AWESOME"

5IF OFYU DPVQMF PG FYBNQMFT XJMM EFNPOTUSBUF IPX UP VTF


UIF NVMUJMJOF CMPDL TZOUBY GPS BO if FYQSFTTJPO

-- alternately
Prelude> let x = 0
Prelude> :{
Prelude| if (x + 1 == 1)
Prelude| then "AWESOME"
Prelude| else "wut"
Prelude| :}
"AWESOME"

5IF JOEFOUBUJPO JTOƊU SFRVJSFE


$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

Prelude> let x = 0
Prelude> :{
Prelude| if (x + 1 == 1)
Prelude| then "AWESOME"
Prelude| else "wut"
Prelude| :}
"AWESOME"

*O UIF FYFSDJTFT BU UIF FOE PG $IBQUFS  ZPV XFSF BTLFE UP


XSJUF B GVODUJPO DBMMFE myAbs UIBU SFUVSOT UIF BCTPMVUF WBMVF PG
B SFBM OVNCFS :PV XPVME IBWF JNQMFNFOUFE UIBU GVODUJPO
XJUI BO if-then-else FYQSFTTJPO TJNJMBS UP UIF GPMMPXJOH

myAbs :: Integer -> Integer


myAbs x = if x < 0 then (-x) else x

8FƊSF HPJOH UP MPPL BU BOPUIFS XBZ UP XSJUF UIJT VTJOH HVBSET

8SJUJOH HVBSE CMPDLT


(VBSE TZOUBY BMMPXT VT UP XSJUF DPNQBDU GVODUJPOT UIBU BMMPX
GPS UXP PS NPSF QPTTJCMF PVUDPNFT EFQFOEJOH PO UIF USVUI PG
UIF DPOEJUJPOT -FUƊT TUBSU CZ MPPLJOH BU IPX XF XPVME XSJUF
myAbs XJUI B HVBSE CMPDL JOTUFBE PG XJUI BO if-then-else
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

myAbs :: Integer -> Integer


myAbs x
| x < 0 = (-x)
| otherwise = x

/PUJDF UIBU FBDI HVBSE IBT JUT PXO FRVBMT TJHO 8F EJEOƊU
QVU POF BǒFS UIF BSHVNFOU JO UIF ƶSTU MJOF PG UIF GVODUJPO EFG
JOJUJPO CFDBVTF FBDI DBTF OFFET JUT PXO FYQSFTTJPO UP SFUVSO
JG JUT CSBODI TVDDFFET /PX XFƊMM FOVNFSBUF UIF DPNQPOFOUT
GPS DMBSJUZ

myAbs :: Integer -> Integer


myAbs x
-- [1] [2]
| x < 0 = (-x)
-- [3] [4] [5] [6]
| otherwise = x
-- [7] [8] [9] [10]

 5IF OBNF PG PVS GVODUJPO myAbs TUJMM DPNFT ƶSTU

 5IFSF JT POF QBSBNFUFS OBNFE ԧ

 )FSFƊT XIFSF JU HFUT EJƵFSFOU 3BUIFS UIBO BO = JNNF


EJBUFMZ BǒFS UIF JOUSPEVDUJPO PG BOZ QBSBNFUFS T
XFƊSF
TUBSUJOH B OFX MJOF BOE VTJOH UIF QJQF | UP CFHJO B HVBSE
DBTF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 5IJT JT UIF FYQSFTTJPO XFƊSF VTJOH UP UFTU UP TFF JG UIJT


CSBODI TIPVME CF FWBMVBUFE PS OPU 5IF HVBSE DBTF FY
QSFTTJPO CFUXFFO UIF | BOE = NVTU FWBMVBUF UP Bool

 5IF = EFOPUFT UIBU XFƊSF EFDMBSJOH XIBU FYQSFTTJPO UP


SFUVSO TIPVME PVS x < 0 CF True

 5IFO BǒFS UIF = XF IBWF UIF FYQSFTTJPO (-x) XIJDI XJMM


CF SFUVSOFE JG x < 0

 "OPUIFS OFX MJOF BOE B | UP CFHJO B OFX HVBSE DBTF

 otherwise JT KVTU BOPUIFS OBNF GPS True VTFE IFSF BT B


GBMMCBDL DBTF JO DBTF x < 0 XBT False

 "OPUIFS = UP CFHJO EFDMBSJOH UIF FYQSFTTJPO UP SFUVSO JG


XF IJU UIF otherwise DBTF

 8F LJDL ԧ CBDL PVU JG JU XBTOƊU MFTT UIBO 

-FUƊT TFF IPX UIJT FWBMVBUFT

*Main> myAbs (-10)


10
*Main> myAbs 10
10

*O UIF ƶSTU FYBNQMF XIFO JU JT QBTTFE B OFHBUJWF OVNCFS


BT BO BSHVNFOU JU MPPLT BU UIF ƶSTU HVBSE BOE TFFT UIBU (-10)
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

JT JOEFFE MFTT UIBO  FWBMVBUFT UIBU BT True BOE TP SFUVSOT


UIF SFTVMU PG (-x) JO UIJT DBTF (-(-10)) PS  *O UIF TFDPOE
FYBNQMF JU MPPLT BU UIF ƶSTU HVBSE TFFT UIBU  EPFT OPU NFFU
UIBU DPOEJUJPO TP JU JT False BOE HPFT UP UIF OFYU HVBSE 5IF
otherwise JT BMXBZT True TP JU SFUVSOT ԧ JO UIJT DBTF  (VBSET
BMXBZT FWBMVBUF TFRVFOUJBMMZ TP ZPVS HVBSET TIPVME CF PSEFSFE
GSPN UIF DBTF UIBU JT NPTU SFTUSJDUJWF UP UIF DBTF UIBU JT MFBTU
SFTUSJDUJWF
-FUƊT MPPL OFYU BU B GVODUJPO UIBU XJMM IBWF NPSF UIBO UXP
QPTTJCMF PVUDPNFT JO UIJT DBTF UIF SFTVMUT PG B UFTU PG TPEJVN
/B
MFWFMT JO UIF CMPPE 8F XBOU B GVODUJPO UIBU MPPLT BU UIF
OVNCFST UIF OVNCFST SFQSFTFOU N&R- PS NJMMJFRVJWBMFOUT
QFS MJUFS
BOE UFMMT VT JG UIF CMPPE TPEJVN MFWFMT BSF OPSNBM PS
OPU

bloodNa :: Integer -> String


bloodNa x
| x < 135 = "too low"
| x > 145 = "too high"
| otherwise = "just right"

8F DBO JODPSQPSBUF EJƵFSFOU UZQFT PG FYQSFTTJPOT JOUP UIF


HVBSE CMPDL BT MPOH BT FBDI HVBSE DBO CF FWBMVBUFE UP B Bool
WBMVF 'PS FYBNQMF UIF GPMMPXJOH UBLFT  OVNCFST BOE UFMMT
ZPV JG UIF USJBOHMF XIPTF TJEFT UIFZ NFBTVSF JT B SJHIU USJBOHMF
PS OPU VTJOH UIF 1ZUIBHPSFBO UIFPSFN

$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-- c is the hypotenuse of the triangle. Google it.

isRight :: (Num a, Eq a) => a -> a -> a -> String


isRight a b c
| a^2 + b^2 == c^2 = "RIGHT ON"
| otherwise = "not right"

"OE UIF GPMMPXJOH GVODUJPO XJMM UBLF ZPVS EPHƊT BHF BOE UFMM
ZPV IPX PME ZPVS EPH JT JO IVNBO ZFBST

dogYrs :: Integer -> Integer


dogYrs x
| x <= 0 = 0
| x <= 1 = x * 15
| x <= 2 = x * 12
| x <= 4 = x * 8
| otherwise = x * 6

8IZ UIF EJƵFSFOU OVNCFST #FDBVTF QVQQJFT SFBDI NBUV


SJUZ NVDI GBTUFS UIBO IVNBO CBCJFT EP TP B ZFBSPME QVQQZ
JTOƊU BDUVBMMZ FRVJWBMFOU UP B  PS ZFBSPME DIJME UIFSF JT
NPSF DPNQMFYJUZ UP UIJT DPOWFSTJPO UIBO UIJT GVODUJPO VTFT
CFDBVTF PUIFS GBDUPST TVDI BT UIF TJ[F PG UIF EPH QMBZ B SPMF BT
XFMM :PV DBO DFSUBJOMZ FYQFSJNFOU XJUI UIBU JG ZPV MJLF

8F DBO BMTP VTF where EFDMBSBUJPOT XJUIJO HVBSE CMPDLT -FUƊT
TBZ ZPV HBWF B UFTU UIBU IBE  RVFTUJPOT BOE ZPV XBOUFE B
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

TJNQMF GVODUJPO GPS USBOTMBUJOH UIF OVNCFS PG RVFTUJPOT UIF


TUVEFOU HPU SJHIU JOUP B MFUUFS HSBEF

avgGrade :: (Fractional a, Ord a) => a -> Char


avgGrade x
| y >= 0.9 = 'A'
| y >= 0.8 = 'B'
| y >= 0.7 = 'C'
| y >= 0.59 = 'D'
| y < 0.59 = 'F'
where y = x / 100

/P TVSQSJTFT UIFSF /PUJDF UIF WBSJBCMF Ԩ JT JOUSPEVDFE OPU


BT BO BSHVNFOU UP UIF OBNFE GVODUJPO CVU JO UIF HVBSE CMPDL
BOE JT EFƶOFE JO UIF where DMBVTF #Z EFƶOJOH JU UIFSF JU JT JO
TDPQF GPS BMM UIF HVBSET BCPWF JU 5IFSF XFSF  QSPCMFNT PO
UIF IZQPUIFUJDBM UFTU TP BOZ ԧ XF HJWF JU XJMM CF EJWJEFE CZ 
UP SFUVSO UIF MFUUFS HSBEF
"MTP OPUJDF XF MFǒ PVU UIF otherwise XF DPVME IBWF VTFE JU
GPS UIF ƶOBM DBTF CVU DIPTF JOTUFBE UP VTF less than 5IBU JT ƶOF
CFDBVTF JO PVS HVBSET XFƊWF IBOEMFE BMM QPTTJCMF WBMVFT *U JT
JNQPSUBOU UP OPUF UIBU ()$J DBOOPU BMXBZT UFMM ZPV XIFO ZPV
IBWFOƊU BDDPVOUFE GPS BMM QPTTJCMF DBTFT BOE JU DBO CF EJƸDVMU
UP SFBTPO BCPVU JU TP JU JT XJTF UP VTF otherwise JO ZPVS ƶOBM
HVBSE
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

3FNFNCFS :PV DBO VTF :set -Wall JO ()$J UP UVSO PO


XBSOJOHT BOE UIFO JU XJMM UFMM ZPV JG ZPV IBWF OPOFYIBVTUJWF
QBUUFSOT

&YFSDJTFT (VBSE %VUZ


 *U JT QSPCBCMZ DMFBS UP ZPV XIZ ZPV XPVMEOƊU QVU BO otherwise
JO ZPVS UPQNPTU HVBSE CVU USZ JU XJUI avgGrade BOZXBZ
BOE TFF XIBU IBQQFOT *UƊMM CF NPSF DMFBS JG ZPV SFXSJUF
JU BT BO BDUVBM otherwise NBUDI | otherwise = 'F' 8IBU
IBQQFOT OPX JG ZPV QBTT B  BT BO BSHVNFOU  

 8IBU IBQQFOT JG ZPV UBLF avgGrade BT JU JT XSJUUFO BOE


SFPSEFS UIF HVBSET %PFT JU TUJMM UZQFDIFDL BOE XPSL UIF
TBNF 5SZ NPWJOH | y >= 0.7 = 'C' BOE QBTTJOH JU UIF
BSHVNFOU  XIJDI TIPVME CF BO Ɖ"Ɗ %PFT JU SFUVSO BO Ɖ"Ɗ

 5IF GPMMPXJOH GVODUJPO SFUVSOT

pal xs
| xs == reverse xs = True
| otherwise = False

B
xs XSJUUFO CBDLXBSET XIFO JUƊT True
C
True XIFO xs JT B QBMJOESPNF
D
False XIFO xs JT B QBMJOESPNF
E
False XIFO xs JT SFWFSTFE
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 8IBU UZQFT PG BSHVNFOUT DBO pal UBLF

 8IBU JT UIF UZQF PG UIF GVODUJPO pal

 5IF GPMMPXJOH GVODUJPO SFUVSOT

numbers x
| x < 0 = -1
| x == 0 = 0
| x > 0 = 1

B
UIF WBMVF PG JUT BSHVNFOU QMVT PS NJOVT 
C
UIF OFHBUJPO PG JUT BSHVNFOU
D
BO JOEJDBUJPO PG XIFUIFS JUT BSHVNFOU JT B QPTJUJWF PS
OFHBUJWF OVNCFS PS [FSP
E
CJOBSZ NBDIJOF MBOHVBHF

 8IBU UZQFT PG BSHVNFOUT DBO numbers UBLF

 8IBU JT UIF UZQF PG UIF GVODUJPO numbers

 'VODUJPO DPNQPTJUJPO


'VODUJPO DPNQPTJUJPO JT B UZQF PG IJHIFSPSEFS GVODUJPO UIBU
BMMPXT VT UP DPNCJOF GVODUJPOT TVDI UIBU UIF SFTVMU PG BQQMZJOH
POF GVODUJPO HFUT QBTTFE UP UIF OFYU GVODUJPO BT BO BSHVNFOU
*U JT B WFSZ DPODJTF TUZMF JO LFFQJOH XJUI UIF UFSTF GVODUJPOBM
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

TUZMF )BTLFMM JT LOPXO GPS "U ƶSTU JU TFFNT DPNQMJDBUFE BOE


EJƸDVMU UP VOQBDL CVU PODF ZPV HFU UIF IBOH PG JU JUƊT GVO
-FUƊT CFHJO CZ MPPLJOH BU UIF UZQF TJHOBUVSF BOE XIBU JU NFBOT

(.) :: (b -> c) -> (a -> b) -> a -> c


-- [1] [2] [3] [4]

 JT B GVODUJPO GSPN ԑ UP Ԓ QBTTFE BT BO BSHVNFOU UIVT UIF


QBSFOUIFTFT

 JT B GVODUJPO GSPN Ԑ UP ԑ

 JT B WBMVF PG UZQF Ԑ UIF TBNF BT [2] FYQFDUT BT BO BSHVNFOU

 JT B WBMVF PG UZQF Ԓ UIF TBNF BT [1] SFUVSOT BT B SFTVMU

5IFO XJUI UIF BEEJUJPO PG POF TFU PG QBSFOUIFTFT

(.) :: (b -> c) -> (a -> b) -> (a -> c)


-- [1] [2] [3]

*O &OHMJTI

 HJWFO B GVODUJPO ԑ UP Ԓ

 HJWFO B GVODUJPO Ԑ UP ԑ

 SFUVSO B GVODUJPO Ԑ UP Ԓ
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

5IF SFTVMU PG (a -> b) JT UIF BSHVNFOU PG (b -> c) TP UIJT JT


IPX XF HFU GSPN BO Ԑ BSHVNFOU UP B Ԓ SFTVMU 8FƊWF TUJUDIFE
UIF SFTVMU PG POF GVODUJPO JOUP CFJOH UIF BSHVNFOU PG BOPUIFS
/FYU MFUƊT TUBSU MPPLJOH BU DPNQPTFE GVODUJPOT BOE IPX
UP SFBE BOE XPSL XJUI UIFN 5IF CBTJD TZOUBY PG GVODUJPO
DPNQPTJUJPO MPPLT MJLF UIJT

(f . g) x = f (g x)

5IJT DPNQPTJUJPO PQFSBUPS (.) UBLFT UXP GVODUJPOT IFSF


OBNFE ԕ BOE Ԗ 5IF ԕ GVODUJPO DPSSFTQPOET UP UIF (b -> c) JO
UIF UZQF TJHOBUVSF XIJMF UIF Ԗ GVODUJPO DPSSFTQPOET UP UIF
(a -> b) 5IF Ԗ GVODUJPO JT BQQMJFE UP UIF QPMZNPSQIJD
ԧ
BSHVNFOU 5IF SFTVMU PG UIBU BQQMJDBUJPO UIFO QBTTFT UP UIF ԕ
GVODUJPO BT JUT BSHVNFOU 5IF ԕ GVODUJPO JT JO UVSO BQQMJFE UP
UIBU BSHVNFOU BOE FWBMVBUFE UP SFBDI UIF ƶOBM SFTVMU
-FUƊT HP TUFQ CZ TUFQ UISPVHI UIJT USBOTGPSNBUJPO 8F DBO
UIJOL PG UIF (.) PS DPNQPTJUJPO PQFSBUPS BT CFJOH B XBZ PG
QJQFMJOJOH EBUB UISPVHI NVMUJQMF GVODUJPOT 5IF GPMMPXJOH
DPNQPTFE GVODUJPOT XJMM ƶSTU BEE UIF WBMVFT JO UIF MJTU UPHFUIFS
BOE UIFO OFHBUF UIF SFTVMU PG UIBU

Prelude> negate . sum $ [1, 2, 3, 4, 5]


-15

-- which is evaluated like this


negate . sum $ [1, 2, 3, 4, 5]
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-- note: this code works as well


negate (sum [1, 2, 3, 4, 5])
negate (15)
-15

/PUJDF UIBU XF EJE UIJT EJSFDUMZ JO PVS 3&1- CFDBVTF UIF


DPNQPTJUJPO PQFSBUPS JT BMSFBEZ JO TDPQF JO Prelude 5IF TVN
PG UIF MJTU JT  5IBU SFTVMU HFUT QBTTFE UP UIF negate GVODUJPO
BOE SFUVSOT B SFTVMU PG -15
:PV NBZ CF XPOEFSJOH XIZ XF OFFE UIF $ PQFSBUPS :PV
NJHIU SFNFNCFS XBZ CBDL XIFO XF UBMLFE BCPVU UIF QSFDF
EFODF PG WBSJPVT PQFSBUPST UIBU XF TBJE UIBU PQFSBUPS IBT B
MPXFS QSFDFEFODF UIBO BO PSEJOBSZ GVODUJPO DBMM XIJUF TQBDF
VTVBMMZ
 0SEJOBSZ GVODUJPO BQQMJDBUJPO IBT B QSFDFEFODF PG
 PVU PG 
 5IF DPNQPTJUJPO PQFSBUPS IBT B QSFDFEFODF PG
 *G XF MFǒ XIJUF TQBDF BT PVS GVODUJPO BQQMJDBUJPO UIJT XPVME
CF FWBMVBUFE MJLF UIJT

negate . sum [1, 2, 3, 4, 5]


negate . 15

#FDBVTF GVODUJPO BQQMJDBUJPO IBT B IJHIFS QSFDFEFODF UIBO


UIF DPNQPTJUJPO PQFSBUPS UIBU GVODUJPO BQQMJDBUJPO XPVME
IBQQFO CFGPSF UIF UXP GVODUJPOT DPNQPTFE 8FƊE CF USZJOH UP
QBTT B OVNFSJD WBMVF XIFSF PVS DPNQPTJUJPO PQFSBUPS OFFET B
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

GVODUJPO #Z VTJOH UIF $ XF TJHOBM UIBU BQQMJDBUJPO UP UIF BSHV


NFOUT TIPVME IBQQFO BǕFS UIF GVODUJPOT BSF BMSFBEZ DPNQPTFE

8F DBO BMTP QBSFOUIFTJ[F JU JOTUFBE PG VTJOH UIF $ PQFSBUPS


*O UIBU DBTF JU MPPLT MJLF UIJT

Prelude> (negate . sum) [1, 2, 3, 4, 5]


-15

5IF DIPJDF PG XIFUIFS UP VTF QBSFOUIFTFT PS UIF EPMMBS TJHO


JTOƊU JNQPSUBOU JU JT KVTU B RVFTUJPO PG TUZMF BOE FBTF PG XSJUJOH
BOE SFBEJOH
5IF OFYU FYBNQMF VTFT UXP GVODUJPOT take BOE reverse BOE
JT BQQMJFE UP BO BSHVNFOU UIBU JT B MJTU PG OVNCFST GSPN  UP 
8IBU XF FYQFDU UP IBQQFO JT UIBU UIF MJTU XJMM ƶSTU CF SFWFSTFE
GSPN  UP 
BOE UIFO UIF ƶSTU  FMFNFOUT PG UIF OFX MJTU XJMM
CF SFUVSOFE BT UIF SFTVMU

Prelude> take 5 . reverse $ [1..10]


[10,9,8,7,6]

(JWFO UIF OFYU CJU PG DPEF IPX DPVME XF SFXSJUF JU UP VTF


GVODUJPO DPNQPTJUJPO JOTUFBE PG QBSFOUIFTFT

Prelude> take 5 (enumFrom 3)


[3,4,5,6,7]
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

8F LOPX UIBU XF XJMM IBWF UP FMJNJOBUF UIF QBSFOUIFTFT


BEE UIF DPNQPTJUJPO PQFSBUPS BOE BEE UIF $ PQFSBUPS *U XJMM
UIFO MPPL MJLF UIJT

Prelude> take 5 . enumFrom $ 3


[3,4,5,6,7]

:PV NBZ BMTP EFƶOF JU UIJT XBZ XIJDI JT NPSF TJNJMBS UP


IPX DPNQPTJUJPO JT XSJUUFO JO TPVSDF ƶMFT

Prelude> let f x = take 5 . enumFrom $ x


Prelude> f 3
[3,4,5,6,7]

:PV NBZ CF XPOEFSJOH XIZ CPUIFS XJUI UIJT JG JU TJNQMZ


EPFT UIF TBNF UIJOH BT OFTUJOH GVODUJPOT JO QBSFOUIFTFT 0OF
SFBTPO JT UIBU JU JT RVJUF FBTZ UP DPNQPTF NPSF UIBO UXP GVOD
UJPOT UIJT XBZ
5IF filter odd GVODUJPO JT OFX GPS VT CVU JU TJNQMZ ƶMUFST UIF
PEE OVNCFST ZPV DBO DIBOHF JU UP filter even JG ZPV XJTI
PVU
PG UIF MJTU UIBU enumFrom CVJMET GPS VT 'JOBMMZ take XJMM SFUVSO
BT UIF SFTVMU POMZ UIF OVNCFS PG FMFNFOUT XF IBWF TQFDJƶFE
BT UIF BSHVNFOU PG take 'FFM GSFF UP FYQFSJNFOU XJUI WBSZJOH
BOZ PG UIF BSHVNFOUT

Prelude> take 5 . filter odd . enumFrom $ 3


[3,5,7,9,11]
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

"T ZPV DPNQPTF NPSF GVODUJPOT ZPV DBO TFF UIBU OFTUJOH
BMM UIF QBSFOUIFTFT XPVME CFDPNF UJSFTPNF 5IJT PQFSBUPS
BMMPXT VT UP EP BXBZ XJUI UIBU *U BMTP BMMPXT VT UP XSJUF JO BO
FWFO NPSF UFSTF TUZMF LOPXO BT ƌQPJOUGSFFƍ

 1PJOUGSFF TUZMF


1PJOUGSFF SFGFST UP B TUZMF PG DPNQPTJOH GVODUJPOT XJUIPVU
TQFDJGZJOH UIFJS BSHVNFOUT 5IF ƌQPJOUƍ JO ƌQPJOUGSFFƍ SFGFST
UP UIF BSHVNFOUT OPU BT JU NBZ TFFN
UP UIF GVODUJPO DPNQP
TJUJPO PQFSBUPS *O TPNF TFOTF XF BEE ƌQPJOUTƍ UIF PQFSBUPS

UP CF BCMF UP ESPQ QPJOUT BSHVNFOUT


 2VJUF PǒFO QPJOUGSFF
DPEF JT UJEJFS PO UIF QBHF BOE FBTJFS UP SFBE BT JU IFMQT UIF
SFBEFS GPDVT PO UIF GVODUJPOT SBUIFS UIBO UIF EBUB UIBU JT CFJOH
TIVƹFE BSPVOE
8F TBJE BCPWF UIBU GVODUJPO DPNQPTJUJPO MPPLT MJLF UIJT

(f . g) x = f (g x)

"T ZPV QVU NPSF GVODUJPOT UPHFUIFS DPNQPTJUJPO DBO NBLF


UIFN FBTJFS UP SFBE 'PS FYBNQMF (f. g. h) x DBO CF FBTJFS UP
SFBE UIBO f (g (h x)) BOE JU BMTP CSJOHT UIF GPDVT UP UIF GVOD
UJPOT SBUIFS UIBO UIF BSHVNFOUT 1PJOUGSFF JT KVTU BO FYUFOTJPO
PG UIBU JEFB CVU OPX XF ESPQ UIF BSHVNFOUT BMUPHFUIFS

f . g = \x -> f (g x)
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

f . g . h = \x -> f (g (h x))

5P TFF XIBU UIJT MPPLT MJLF JO QSBDUJDF XFƊMM TUBSU CZ SFXSJUJOH


JO QPJOUGSFF TUZMF TPNF PG UIF GVODUJPOT XF VTFE JO UIF TFDUJPO
BCPWF

Prelude> let f = negate . sum


Prelude> f [1, 2, 3, 4, 5]
-15

/PUJDF UIBU XIFO XF EFƶOF PVS GVODUJPO f XF EPOƊU TQFD


JGZ UIBU UIFSF XJMM CF BOZ BSHVNFOUT :FU XIFO XF BQQMZ UIF
GVODUJPO UP BO BSHVNFOU UIF TBNF UIJOH IBQQFOT BT CFGPSF
)PX XPVME XF SFXSJUF

f :: Int -> [Int] -> Int


f z xs = foldr (+) z xs

BT B QPJOUGSFF GVODUJPO

Prelude> let f = foldr (+)


Prelude> f 0 [1..5]
15

"OE OPX CFDBVTF XF OBNFE UIF GVODUJPO JU DBO CF SFVTFE


XJUI EJƵFSFOU BSHVNFOUT
)FSF JT BOPUIFS FYBNQMF PG B TIPSU QPJOUGSFF GVODUJPO BOE
JUT SFTVMU *U JOWPMWFT B OFX VTF PG filter UIBU VTFT UIF Bool
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

PQFSBUPS == -PPL BU JU DBSFGVMMZ BOE PO QBQFS PS JO ZPVS IFBE


XBML UISPVHI UIF FWBMVBUJPO QSPDFTT JOWPMWFE

Prelude> let f = length . filter (== 'a')


Prelude> f "abracadabra"
5

/FYU XFƊMM MPPL BU B TFU PG GVODUJPOT UIBU XPSL UPHFUIFS JO B


TJOHMF NPEVMF BOE SFMZ PO CPUI DPNQPTJUJPO BOE QPJOUGSFF
TUZMF

-- arith2.hs
module Arith2 where

add :: Int -> Int -> Int


add x y = x + y

addPF :: Int -> Int -> Int


addPF = (+)

addOne :: Int -> Int


addOne = \x -> x + 1

addOnePF :: Int -> Int


addOnePF = (+1)
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

main :: IO ()
main = do
print (0 :: Int)
print (add 1 0)
print (addOne 0)
print (addOnePF 0)
print ((addOne . addOne) 0)

print ((addOnePF . addOne) 0)


print ((addOne . addOnePF) 0)
print ((addOnePF . addOnePF) 0)
print (negate (addOne 0))
print ((negate . addOne) 0)
print ((addOne . addOne . addOne
. negate . addOne) 0)

5BLF ZPVS UJNF BOE XPSL UISPVHI XIBU FBDI GVODUJPO JT


EPJOH XIFUIFS PO QBQFS PS JO ZPVS IFBE 5IFO MPBE UIJT DPEF
BT B TPVSDF ƶMF BOE SVO JU JO ()$ BOE TFF JG ZPVS SFTVMUT XFSF
BDDVSBUF
:PV TIPVME OPX IBWF B HPPE VOEFSTUBOEJOH PG IPX ZPV
DBO VTF (.) UP DPNQPTF GVODUJPOT *UƊT JNQPSUBOU UP SFNFNCFS
UIBU UIF GVODUJPOT JO DPNQPTJUJPO BSF BQQMJFE GSPN SJHIU UP
MFǒ MJLF B 1BDNBO NVODIJOH GSPN UIF SJHIU TJEF SFEVDJOH UIF
FYQSFTTJPOT BT IF HPFT
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 %FNPOTUSBUJOH DPNQPTJUJPO


:PV NBZ SFDBMM UIBU CBDL JO UIF DIBQUFS PO 1SJOUJOH 4USJOHT XF
NFOUJPOFE UIBU UIF GVODUJPOT print BOE putStr TFFN TJNJMBS PO
UIF TVSGBDF CVU CFIBWF EJƵFSFOUMZ CFDBVTF UIFZ IBWF EJƵFSFOU
VOEFSMZJOH UZQFT -FUƊT UBLF B DMPTFS MPPL BU UIBU OPX
'JSTU putStrLn BOE putStr IBWF UIF TBNF UZQF

putStr :: String -> IO ()


putStrLn :: String -> IO ()

#VU UIF UZQF PG print JT EJƵFSFOU

print :: Show a => a -> IO ()

5IFZ BMM SFUVSO B SFTVMU PG IO () GPS SFBTPOT XF EJTDVTTFE


JO UIF QSFWJPVT DIBQUFS #VU UIF QBSBNFUFST IFSF BSF RVJUF
EJƵFSFOU 5IF ƶSTU UXP UBLF StringT BT BSHVNFOUT XIJMF print
IBT B DPOTUSBJOFE QPMZNPSQIJD QBSBNFUFS Show a => a 5IF
ƶSTU UXP XPSL ƶOF UIFO JG XIBU XF OFFE UP EJTQMBZ PO UIF
TDSFFO BSF BMSFBEZ TUSJOHT CVU IPX EP XF EJTQMBZ OVNCFST
PS PUIFS OPOTUSJOH WBMVFT
'JSTU XF IBWF UP DPOWFSU UIPTF
OVNCFST UP TUSJOHT UIFO XF DBO QSJOU UIF TUSJOHT
:PV NBZ BMTP SFDBMM B GVODUJPO GSPN PVS EJTDVTTJPO PG UIF
Show UZQFDMBTT DBMMFE show )FSFƊT UIF UZQF PG show BHBJO

show :: Show a => a -> String


$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

'PSUVOBUFMZ JU XBT VOEFSTUPPE UIBU DPNCJOJOH putStrLn BOE


show XPVME CF B DPNNPO QBUUFSO TP UIF GVODUJPO OBNFE print
JT UIF DPNQPTJUJPO PG show BOE putStrLn 8F EP JU UIJT XBZ
CFDBVTF JUƊT TJNQMFS 5IF QSJOUJOH GVODUJPO DPODFSOT JUTFMG POMZ
XJUI QSJOUJOH XIJMF UIF TUSJOHJƶDBUJPO GVODUJPO DPODFSOT JUTFMG
POMZ XJUI UIBU
)FSF BSF UXP XBZT UP JNQMFNFOU print XJUI putStrLn BOE
show

print :: Show a => a -> IO ()


print a = putStrLn (show a)

-- using the . operator for composing functions.


(.) :: (b -> c) -> (a -> b) -> a -> c

-- we can write print as:


print :: Show a => a -> IO ()
print a = (putStrLn . show) a

/PX MFUƊT HP TUFQ CZ TUFQ UISPVHI UIJT VTF PG (.) putStrLn


BOE show

(.) :: (b -> c) -> (a -> b) -> a -> c

putStrLn :: String -> IO ()


-- [1] [2]
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

show :: Show a => a -> String


-- [3] [4]

putStrLn . show :: Show a => a -> IO ()


-- [5] [6]

(.) :: (b -> c) -> (a -> b) -> a -> c


-- [1] [2] [3] [4] [5] [6]

-- If we replace the variables with the specific


-- types they take on in this application of (.)

(.) :: Show a => (String -> IO ())


-> (a -> String)
-> a -> IO ()

(.) :: (b -> c)
-- (String -> IO ())

-> (a -> b)
-- (a -> String)

-> a -> c
-- a -> IO ()

 JT UIF 4USJOH UIBU putStrLn BDDFQUT BT BO BSHVNFOU


$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 JT UIF IO () UIBU putStrLn SFUVSOT UIBU JT QFSGPSNJOH UIF


TJEF FƵFDU PG QSJOUJOH BOE SFUVSOJOH VOJU

 JT Ԑ XIP NVTU JNQMFNFOU UIF 4IPX UZQFDMBTT UIJT JT UIF


Show a => a GSPN UIF show GVODUJPO XIJDI JT B NFUIPE PO
UIF 4IPX UZQFDMBTT

 JT UIF 4USJOH XIJDI TIPX SFUVSOT 5IJT JT XIBU UIF Show a


=> a WBMVF HPU TUSJOHJƶFE JOUP

 JT UIF Show a => a UIF ƶOBM DPNQPTFE GVODUJPO FYQFDUT

 JT UIF IO () UIF ƶOBM DPNQPTFE GVODUJPO SFUVSOT

8F DBO OPX NBLF JU QPJOUGSFF 8IFO XF BSF XPSLJOH XJUI


GVODUJPOT QSJNBSJMZ JO UFSNT PG DPNQPTJUJPO SBUIFS UIBO BQQMJ
DBUJPO UIF QPJOUGSFF WFSTJPO DBO PǒFO OPU BMXBZT
CF NPSF
FMFHBOU
)FSFƊT UIF QPJOUGSFF WFSTJPO PG print

-- Previous version of the function


print :: Show a => a -> IO ()
print a = (putStrLn . show) a

print :: Show a => a -> IO ()


print = putStrLn . show

5IF QPJOU PG print JT UP DPNQPTF putStrLn BOE show TP UIBU


XF EPOƊU IBWF UP DBMM show PO JUT BSHVNFOU PVSTFMWFT 5IBU JT
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

print JT QSJODJQBMMZ BCPVU UIF DPNQPTJUJPO PG UXP GVODUJPOT


TP JU DPNFT PVU OJDFMZ BT B QPJOUGSFF GVODUJPO 4BZJOH UIBU
XF DPVME BQQMZ putStrLn . show UP BO BSHVNFOU JO UIJT DBTF JT
SFEVOEBOU

 $IBQUFS &YFSDJTFT


.VMUJQMF DIPJDF
 " QPMZNPSQIJD GVODUJPO

B
DIBOHFT UIJOHT JOUP TIFFQ XIFO JOWPLFE
C
IBT NVMUJQMF BSHVNFOUT
D
IBT B DPODSFUF UZQF
E
NBZ SFTPMWF UP WBMVFT PG EJƵFSFOU UZQFT EFQFOEJOH
PO JOQVUT

 5XP GVODUJPOT OBNFE f BOE g IBWF UZQFT Char -> String


BOE String -> [String] SFTQFDUJWFMZ 5IF DPNQPTFE GVOD
UJPO g . f IBT UIF UZQF

B
Char -> String
C
Char -> [String]
D
[[String]]
E
Char -> String -> [String]
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 " GVODUJPO f IBT UIF UZQF Ord a => a -> a -> Bool BOE XF
BQQMZ JU UP POF OVNFSJD WBMVF 8IBU JT UIF UZQF OPX

B
Ord a => a -> Bool
C
Num -> Num -> Bool
D
Ord a => a -> a -> Integer
E
(Ord a, Num a) => a -> Bool

 " GVODUJPO XJUI UIF UZQF (a -> b) -> c

B
SFRVJSFT WBMVFT PG UISFF EJƵFSFOU UZQFT
C
JT B IJHIFSPSEFS GVODUJPO
D
NVTU UBLF B UVQMF BT JUT ƶSTU BSHVNFOU
E
IBT JUT QBSBNFUFST JO BMQIBCFUJDBM PSEFS

 (JWFO UIF GPMMPXJOH EFƶOJUJPO PG f XIBU JT UIF UZQF PG f


True

f :: a -> a
f x = x

B
f True :: Bool
C
f True :: String
D
f True :: Bool -> Bool
E
f True :: a
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-FUƊT XSJUF DPEF


 5IF GPMMPXJOH GVODUJPO SFUVSOT UIF UFOT EJHJU PG BO JOUFHSBM
BSHVNFOU

tensDigit :: Integral a => a -> a


tensDigit x = d
where xLast = x `div` 10
d = xLast `mod` 10

B
'JSTU SFXSJUF JU VTJOH divMod
C
%PFT UIF divMod WFSTJPO IBWF UIF TBNF UZQF BT UIF
PSJHJOBM WFSTJPO
D
/FYU MFUƊT DIBOHF JU TP UIBU XFƊSF HFUUJOH UIF IVOESFET
EJHJU JOTUFBE :PV DPVME TUBSU JU MJLF UIJT UIPVHI UIBU
NBZ OPU CF UIF POMZ QPTTJCJMJUZ


hunsD x = d2
where d = undefined
...

 *NQMFNFOU UIF GVODUJPO PG UIF UZQF a -> a -> Bool -> a


PODF FBDI VTJOH B DBTF FYQSFTTJPO BOE PODF XJUI B HVBSE

foldBool :: a -> a -> Bool -> a


foldBool = error "Error: Need to implement foldBool!"
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

5IF SFTVMU JT TFNBOUJDBMMZ TJNJMBS UP if-then-else FYQSFT


TJPOT CVU TZOUBDUJDBMMZ RVJUF EJƵFSFOU )FSF JT UIF QBUUFSO
NBUDIJOH WFSTJPO UP HFU ZPV TUBSUFE

foldBool3 :: a -> a -> Bool -> a


foldBool3 x y True = x
foldBool3 x y False = y

 'JMM JO UIF EFƶOJUJPO /PUF UIBU UIF ƶSTU BSHVNFOU UP PVS


GVODUJPO JT BMTP B GVODUJPO XIJDI DBO CF BQQMJFE UP WBMVFT
:PVS TFDPOE BSHVNFOU JT B UVQMF XIJDI DBO CF VTFE GPS
QBUUFSO NBUDIJOH

g :: (a -> b) -> (a, c) -> (b, c)


g = undefined

 'PS UIJT OFYU FYFSDJTF ZPVƊMM FYQFSJNFOU XJUI XSJUJOH


QPJOUGSFF WFSTJPOT PG FYJTUJOH DPEF 5IJT JOWPMWFT TPNF
OFX JOGPSNBUJPO TP SFBE UIF GPMMPXJOH FYQMBOBUJPO DBSF
GVMMZ
5ZQFDMBTTFT BSF EJTQBUDIFE CZ UZQF Read JT B UZQFDMBTT MJLF
Show CVU JU JT UIF EVBM PS ƌPQQPTJUFƍ PG Show *O HFOFSBM UIF
Read UZQFDMBTT JTOƊU TPNFUIJOH ZPV TIPVME QMBO UP VTF B
MPU CVU UIJT FYFSDJTF JT TUSVDUVSFE UP UFBDI ZPV TPNFUIJOH
BCPVU UIF JOUFSBDUJPO CFUXFFO UZQFDMBTTFT BOE UZQFT
5IF GVODUJPO read JO UIF Read UZQFDMBTT IBT UIF UZQF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

read :: Read a => String -> a

/PUJDF B QBUUFSO

read :: Read a => String -> a


show :: Show a => a -> String

8SJUF UIF GPMMPXJOH DPEF JOUP B TPVSDF ƶMF 5IFO MPBE JU


BOE SVO JU JO ()$J UP NBLF TVSF ZPV VOEFSTUBOE XIZ UIF
FWBMVBUJPO SFTVMUT JO UIF BOTXFST ZPV TFF

-- arith4.hs
module Arith4 where

-- id :: a -> a
-- id x = x

roundTrip :: (Show a, Read a) => a -> a


roundTrip a = read (show a)

main = do
print (roundTrip 4)
print (id 4)

 /FYU XSJUF B QPJOUGSFF WFSTJPO PG roundTrip OC UIJT


SFGFST UP UIF GVODUJPO EFƶOJUJPO OPU UP JUT BQQMJDBUJPO JO
main

$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 8F XJMM DPOUJOVF UP VTF UIF DPEF JO module Arith4 GPS UIJT


FYFSDJTF BT XFMM
8IFO XF BQQMZ show UP B WBMVF TVDI BT (1 :: Int) UIF Ԑ UIBU
JNQMFNFOUT 4IPX JT *OU TP ()$ XJMM VTF UIF *OU JOTUBODF
PG UIF 4IPX UZQFDMBTT UP TUSJOHJGZ PVS *OU PG 
)PXFWFS read FYQFDUT B String BSHVNFOU JO PSEFS UP SF
UVSO BO Ԑ 5IF String BSHVNFOU UIBU JT UIF ƶSTU BSHVNFOU
UP read UFMMT UIF GVODUJPO OPUIJOH BCPVU XIBU UZQF UIF EF
TUSJOHJƶFE SFTVMU TIPVME CF *O UIF UZQF TJHOBUVSF roundTrip
DVSSFOUMZ IBT JU LOPXT CFDBVTF UIF UZQF WBSJBCMFT BSF UIF
TBNF TP UIF UZQF UIBU JT UIF JOQVU UP show IBT UP CF UIF
TBNF UZQF BT UIF PVUQVU PG read
:PVS UBTL OPX JT UP DIBOHF UIF UZQF PG roundTrip JO Arith4 UP
(Show a, Read b) => a -> b )PX NJHIU XF UFMM ()$ XIJDI
JOTUBODF PG Read UP EJTQBUDI BHBJOTU UIF String OPX .BLF
UIF FYQSFTTJPO print (roundTrip 4) XPSL :PV XJMM POMZ
OFFE UIF IBT UIF UZQF TZOUBY PG :: BOE QBSFOUIFTFT GPS
TDPQJOH

 $IBQUFS %FƶOJUJPOT


 #JOEJOH PS CPVOE JT B DPNNPO XPSE VTFE UP JOEJDBUF DPO
OFDUJPO MJOLBHF PS BTTPDJBUJPO CFUXFFO UXP PCKFDUT *O
)BTLFMM XFƊMM VTF JU UP UBML BCPVU XIBU WBMVF B WBSJBCMF IBT
FH B QBSBNFUFS WBSJBCMF JT CPVOE UP BO BSHVNFOU WBMVF
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

NFBOJOH UIF WBMVF JT QBTTFE JOUP UIF QBSBNFUFS BT JOQVU


BOE FBDI PDDVSSFODF PG UIBU OBNFE QBSBNFUFS XJMM IBWF
UIF TBNF WBMVF #JOEJOHT BT B QMVSBMJUZ XJMM VTVBMMZ SFGFS
UP B DPMMFDUJPO PG WBSJBCMFT BOE GVODUJPOT XIJDI DBO CF
SFGFSFODFE CZ OBNF

blah :: Int
blah = 10

)FSF UIF WBSJBCMF blah JT CPVOE UP UIF WBMVF 10

 "O BOPOZNPVT GVODUJPO JT B GVODUJPO XIJDI JT OPU CPVOE UP


BO JEFOUJƶFS BOE JT JOTUFBE QBTTFE BT BO BSHVNFOU UP BO
PUIFS GVODUJPO BOEPS VTFE UP DPOTUSVDU BOPUIFS GVODUJPO
4FF UIF GPMMPXJOH FYBNQMFT

\x -> x
-- anonymous version of id

id x = x
-- not anonymous, it's bound to 'id'

 $VSSZJOH JT UIF QSPDFTT PG USBOTGPSNJOH B GVODUJPO UIBU


UBLFT NVMUJQMF BSHVNFOUT JOUP B TFSJFT PG GVODUJPOT XIJDI
FBDI UBLF POF BSHVNFOU BOE SFUVSO POF SFTVMU 5IJT JT BD
DPNQMJTIFE UISPVHI UIF OFTUJOH *O )BTLFMM BMM GVODUJPOT
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

BSF DVSSJFE CZ EFGBVMU :PV EPOƊU OFFE UP EP BOZUIJOH


TQFDJBM ZPVSTFMG

-- curry and uncurry already exist in Prelude

curry' :: ((a, b) -> c) -> a -> b -> c


curry' f a b = f (a, b)

uncurry' :: (a -> b -> c) -> ((a, b) -> c)


uncurry' f (a, b) = f a b

-- uncurried function, takes a tuple of its arguments


add :: (Int, Int) -> Int
add (x, y) = x + y

add' :: Int -> Int -> Int


add' = curry' add

" GVODUJPO UIBU BQQFBST UP UBLF UXP BSHVNFOUT JT BDUVBMMZ


UXP GVODUJPOT UIBU FBDI UBLF POF BSHVNFOU BOE SFUVSO
POF SFTVMU 8IBU NBLFT UIJT XPSL JT UIBU B GVODUJPO DBO
SFUVSO BOPUIFS GVODUJPO
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

f a b = a + b

-- is equivalent to

f = \a -> (\b -> a + b)

 1BUUFSO NBUDIJOH JT B TZOUBDUJD XBZ PG EFDPOTUSVDUJOH QSPE


VDU BOE TVN UZQFT UP HFU BU UIFJS JOIBCJUBOUT 8JUI SF
TQFDU UP QSPEVDUT QBUUFSO NBUDIJOH HJWFT ZPV UIF NFBOT
GPS EFTUSVDUVSJOH BOE FYQPTJOH UIF DPOUFOUT PG QSPEVDUT
CJOEJOH POF PS NPSF WBMVFT DPOUBJOFE UIFSFJO UP OBNFT
8JUI TVNT QBUUFSO NBUDIJOH MFUT ZPV EJTDSJNJOBUF XIJDI
JOIBCJUBOU PG B TVN ZPV NFBO UP IBOEMF JO UIBU NBUDI
*UƊT CFTU UP FYQMBJO QBUUFSO NBUDIJOH JO UFSNT PG IPX
EBUBUZQFT XPSL TP XFƊSF HPJOH UP VTF UFSNJOPMPHZ UIBU
ZPV NBZ OPU GVMMZ VOEFSTUBOE ZFU 8FƊMM DPWFS UIJT NPSF
EFFQMZ TPPO

-- nullary data constructor, not a sum or product.


-- Just a single value.
data Blah = Blah

1BUUFSO NBUDIJOH PO Blah DBO POMZ EP POF UIJOH

blahFunc :: Blah -> Bool


blahFunc Blah = True
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

data Identity a =
Identity a
deriving (Eq, Show)

*EFOUJUZ JT B VOBSZ EBUB DPOTUSVDUPS 4UJMM OPU B QSPEVDU


POMZ DPOUBJOT POF WBMVF

-- when you pattern match on Identity


-- you can unpack and expose the 'a'

unpackIdentity :: Identity a -> a


unpackIdentity (Identity x) = x

-- But you can choose to ignore


-- the contents of Identity

ignoreIdentity :: Identity a -> Bool


ignoreIdentity (Identity _) = True

-- or ignore it completely since matching on


-- a non-sum data constructor changes nothing.

ignoreIdentity' :: Identity a -> Bool


ignoreIdentity' _ = True
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

data Product a b =
Product a b
deriving (Eq, Show)

/PX XF DBO DIPPTF UP VTF OPOF POF PS CPUI PG UIF WBMVFT


JO UIF QSPEVDU PG Ԑ BOE ԑ

productUnpackOnlyA :: Product a b -> a


productUnpackOnlyA (Product x _) = x

productUnpackOnlyB :: Product a b -> b


productUnpackOnlyB (Product _ y) = y

0S XF DBO CJOE UIFN CPUI UP B EJƵFSFOU OBNF

productUnpack :: Product a b -> (a, b)


productUnpack (Product x y) = (x, y)

8IBU IBQQFOT JG ZPV USZ UP CJOE UIF WBMVFT JO UIF QSPEVDU


UP UIF TBNF OBNF

data SumOfThree a b c =
FirstPossible a
| SecondPossible b
| ThirdPossible c
deriving (Eq, Show)
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

/PX XF DBO EJTDSJNJOBUF CZ UIF JOIBCJUBOUT PG UIF TVN


BOE DIPPTF UP EP EJƵFSFOU UIJOHT CBTFE PO XIJDI DPO
TUSVDUPS JO UIF TVN UIFZ XFSF

sumToInt :: SumOfThree a b c -> Integer


sumToInt (FirstPossible _) = 0
sumToInt (SecondPossible _) = 1
sumToInt (ThirdPossible _) = 2

-- We can selectively ignore inhabitants of the sum

sumToInt :: SumOfThree a b c -> Integer


sumToInt (FirstPossible _) = 0
sumToInt _ = 1

-- We still need to handle every possible value

1BUUFSO NBUDIJOH JT BCPVU ZPVS EBUB

 #PUUPN JT B OPOWBMVF VTFE UP EFOPUF UIBU UIF QSPHSBN


DBOOPU SFUVSO B WBMVF PS SFTVMU 5IF NPTU FMFNFOUBM
NBOJGFTUBUJPO PG UIJT JT B QSPHSBN UIBU MPPQT JOƶOJUFMZ
0UIFS GPSNT DBO JOWPMWF UIJOHT MJLF XSJUJOH B GVODUJPO
UIBU EPFTOƊU IBOEMF BMM PG JUT JOQVUT BOE GBJMT PO B QBUUFSO
NBUDI 5IF GPMMPXJOH BSF FYBNQMFT PG CPUUPN
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-- If you apply this to any values,


-- it'll recurse indefinitely.
f x = f x

-- It'll a'splode if you pass a False value


dontDoThis :: Bool -> Int
dontDoThis True = 1

-- morally equivalent to

definitelyDontDoThis :: Bool -> Int


definitelyDontDoThis True = 1
definitelyDontDoThis False = error "oops"

-- don't use error. We'll show you a better way soon.

#PUUPN DBO CF VTFGVM BT B DBOBSZ GPS TJHOBMJOH XIFO DPEF


QBUIT BSF CFJOH FWBMVBUFE 8F VTVBMMZ EP UIJT UP EFUFSNJOF
IPX MB[Z B QSPHSBN JT PS JTOƊU :PVƊMM TFF B MPU PG UIJT JO
PVS DIBQUFS PO OPOTUSJDUOFTT MBUFS PO

 )JHIFSPSEFS GVODUJPOT BSF GVODUJPOT XIJDI UIFNTFMWFT UBLF


GVODUJPOT BT BSHVNFOUT PS SFUVSO GVODUJPOT BT SFTVMUT %VF
UP DVSSZJOH UFDIOJDBMMZ BOZ GVODUJPO UIBU BQQFBST UP UBLF
NPSF UIBO POF BSHVNFOU JT IJHIFS PSEFS JO )BTLFMM
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-- Technically higher order


-- because of currying
Int -> Int -> Int

-- See? Returns another function


-- after applying the first argument
Int -> (Int -> Int)

-- The rest of the following examples are


-- types of higher order functions

(a -> b) -> a -> b

(a -> b) -> [a] -> [b]

(Int -> Bool) -> [Int] -> [Bool]

-- also higher order, this one


-- takes a function argument which itself
-- is higher order as well.

((a -> b) -> c) -> [a] -> [c]

 $PNQPTJUJPO JT UIF BQQMJDBUJPO PG B GVODUJPO UP UIF SFTVMU


PG IBWJOH BQQMJFE BOPUIFS GVODUJPO 5IF DPNQPTJUJPO PQ
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

FSBUPS JT B IJHIFSPSEFS GVODUJPO BT JU UBLFT UIF GVODUJPOT


JU DPNQPTFT BT BSHVNFOUT BOE UIFO SFUVSOT B GVODUJPO PG
UIF DPNQPTJUJPO

(.) :: (b -> c) -> (a -> b) -> a -> c

-- is actually

(.) :: (b -> c) -> (a -> b) -> (a -> c)

-- or

(.) :: (b -> c) -> ((a -> b) -> (a -> c))

-- can be implemented as
comp :: (b -> c) -> ((a -> b) -> (a -> c))
comp f g x = f (g x)

5IF GVODUJPO g JT BQQMJFE UP x f JT BQQMJFE UP UIF SFTVMU PG


g x

 1PJOUGSFF JT QSPHSBNNJOH UBDJUMZ PS XJUIPVU NFOUJPOJOH


BSHVNFOUT CZ OBNF 5IJT UFOET UP MPPL MJLF ƌQMVNCZƍ
DPEF XIFSF ZPVƊSF SPVUJOH EBUB BSPVOE JNQMJDJUMZ PS MFBW
JOH PƵ VOOFDFTTBSZ BSHVNFOUT UIBOLT UP DVSSZJOH 5IF
ƌQPJOUƍ SFGFSSFE UP JO UIF UFSN QPJOUGSFF JT BO BSHVNFOU
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

-- not pointfree
blah x = x
addAndDrop x y = x + 1
reverseMkTuple a b = (b, a)
reverseTuple (a, b) = (b, a)

-- pointfree versions of the above


blah = id
addAndDrop = const . (1 +)
reverseMkTuple = flip (,)
reverseTuple = uncurry (flip (,))

5P TFF NPSF FYBNQMFT MJLF UIJT DIFDL PVU UIF )BTLFMM 8JLJ
QBHF PO 1PJOUGSFF BU https://wiki.haskell.org/Pointfree

 'PMMPXVQ SFTPVSDFT


 1BVM )VEBL +PIO 1FUFSTPO +PTFQI 'BTFM " (FOUMF *O
USPEVDUJPO UP )BTLFMM DIBQUFS PO DBTF FYQSFTTJPOT BOE
QBUUFSO NBUDIJOH
https://www.haskell.org/tutorial/patterns.html

 4JNPO 1FZUPO +POFT 5IF *NQMFNFOUBUJPO PG 'VODUJPOBM


1SPHSBNNJOH -BOHVBHFT QBHFT 
http://research.microsoft.com/en-us/um/people/simonpj/papers/
slpj-book-1987/index.htm
$)"15&3  .03& '6/$5*0/"- 1"55&3/4 

 $ISJTUPQIFS 4USBDIFZ 'VOEBNFOUBM $PODFQUT JO 1SP


HSBNNJOH -BOHVBHFT QBHF  GPS FYQMBOBUJPO PG DVSSZ
JOH
http://www.cs.cmu.edu/~crary/819-f09/Strachey67.pdf

 +/ 0MJWFJSB "O JOUSPEVDUJPO UP QPJOUGSFF QSPHSBNNJOH


http://www.di.uminho.pt/~jno/ps/iscalc_1.ps.gz

 .BOVFM "MDJOP 1FSFJSB EB $VOIB 1PJOUGSFF 1SPHSBN


$BMDVMBUJPO
http://www4.di.uminho.pt/~mac/Publications/phd.pdf
$IBQUFS 

3FDVSTJPO

*NBHJOF B QPSUJPO PG UIF


UFSSJUPSZ PG &OHMBOE IBT
CFFO QFSGFDUMZ MFWFMMFE
BOE B DBSUPHSBQIFS USBDFT
B NBQ PG &OHMBOE 5IF
XPSL JT QFSGFDU 5IFSF JT
OP QBSUJDVMBS PG UIF
UFSSJUPSZ PG &OHMBOE
TNBMM BT JU DBO CF UIBU IBT
OPU CFFO SFDPSEFE JO UIF
NBQ &WFSZUIJOH IBT JUT
PXO DPSSFTQPOEFODF
5IF NBQ UIFO NVTU
DPOUBJO B NBQ PG UIF NBQ
UIBU NVTU DPOUBJO B NBQ
PG UIF NBQ PG UIF NBQ
BOE TP PO UP JOƶOJUZ

+PSHF -VJT #PSHFT DJUJOH


+PTJBI 3PZDF


$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

 3FDVSTJPO
3FDVSTJPO JT EFƶOJOH B GVODUJPO JO UFSNT PG JUTFMG WJB TFMG
SFGFSFOUJBM FYQSFTTJPOT *U NFBOT UIBU UIF GVODUJPO XJMM DPO
UJOVF UP DBMM JUTFMG BOE SFQFBU JUT CFIBWJPS VOUJM TPNF DPOEJUJPO
JT NFU UP SFUVSO B SFTVMU *UƊT BO JNQPSUBOU DPODFQU JO )BTLFMM
BOE JO NBUIFNBUJDT CFDBVTF JU HJWFT VT B NFBOT PG FYQSFTT
JOH JOEFƶOJUF PS JODSFNFOUBM DPNQVUBUJPO XJUIPVU GPSDJOH VT
UP FYQMJDJUMZ SFQFBU PVSTFMWFT BOE BMMPXJOH UIF EBUB XF BSF
QSPDFTTJOH UP EFDJEF XIFO XF BSF EPOF DPNQVUJOH
3FDVSTJPO JT B OBUVSBM QSPQFSUZ PG NBOZ MPHJDBM BOE NBUI
FNBUJDBM TZTUFNT JODMVEJOH IVNBO MBOHVBHF 5IBU UIFSF JT
OP MJNJU PO UIF OVNCFS PG FYQSFTTJCMF WBMJE TFOUFODFT JO IV
NBO MBOHVBHF JT EVF UP SFDVSTJPO " TFOUFODF JO &OHMJTI DBO
IBWF BOPUIFS TFOUFODF OFTUFE XJUIJO JU 4FOUFODFT DBO CF
SPVHIMZ EFTDSJCFE BT TUSVDUVSFT XIJDI IBWF B OPVO QISBTF B
WFSC QISBTF BOE PQUJPOBMMZ BOPUIFS TFOUFODF 5IJT QPTTJCJMJUZ
GPS VOMJNJUFE OFTUFE TFOUFODFT JT SFDVSTJWF BOE FOBCMFT UIF
MJNJUMFTT FYQSFTTJCJMJUZ UIFSFJO 3FDVSTJPO JT B NFBOT PG FY
QSFTTJOH DPEF UIBU NVTU UBLF BO JOEFƶOJUF OVNCFS PG TUFQT UP
SFUVSO B SFTVMU
#VU UIF MBNCEB DBMDVMVT EPFT OPU BQQFBS PO UIF TVSGBDF
UP IBWF BOZ NFBOT PG SFDVSTJPO CFDBVTF PG UIF BOPOZNJUZ
PG FYQSFTTJPOT )PX EP ZPV DBMM TPNFUIJOH XJUIPVU B OBNF
#FJOH BCMF UP XSJUF SFDVSTJWF GVODUJPOT UIPVHI JT FTTFOUJBM UP
5VSJOH DPNQMFUFOFTT 8F VTF B DPNCJOBUPS Ƈ LOPXO BT UIF
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

: DPNCJOBUPS PS ƶYFEQPJOU DPNCJOBUPS Ƈ UP XSJUF SFDVSTJWF


GVODUJPOT JO UIF MBNCEB DBMDVMVT )BTLFMM IBT OBUJWF SFDVSTJPO
BCJMJUZ CBTFE PO UIF TBNF QSJODJQMF BT UIF : DPNCJOBUPS
*U JT JNQPSUBOU UP IBWF B TPMJE VOEFSTUBOEJOH PG UIF CFIBWJPS
PG SFDVSTJWF GVODUJPOT *O MBUFS DIBQUFST XF XJMM TFF UIBU JO
GBDU JU JT OPU PǒFO OFDFTTBSZ UP XSJUF PVS PXO SFDVSTJWF GVOD
UJPOT BT NBOZ TUBOEBSE IJHIFSPSEFS GVODUJPOT IBWF CVJMUJO
SFDVSTJPO #VU XJUIPVU VOEFSTUBOEJOH UIF TZTUFNBUJD CFIBW
JPS PG SFDVSTJPO JUTFMG JU DBO CF EJƸDVMU UP SFBTPO BCPVU UIPTF
)0'T *O UIJT DIBQUFS XF XJMM

Ƒ FYQMPSF XIBU SFDVSTJPO JT BOE IPX SFDVSTJWF GVODUJPOT


FWBMVBUF

Ƒ HP TUFQCZTUFQ UISPVHI UIF QSPDFTT PG XSJUJOH SFDVSTJWF


GVODUJPOT

Ƒ IBWF GVO XJUI CPUUPN

 'BDUPSJBM
0OF PG UIF DMBTTJD JOUSPEVDUPSZ GVODUJPOT GPS EFNPOTUSBUJOH
SFDVSTJPO JO GVODUJPOBM MBOHVBHFT JT GBDUPSJBM *O BSJUINFUJD
ZPV NJHIUƊWF TFFO FYQSFTTJPOT MJLF 4! 5IF CBOH ZPVƊSF TFFJOH
OFYU UP UIF OVNCFS  JT UIF OPUBUJPO GPS UIF GBDUPSJBM GVODUJPO

-FUT FWBMVBUF 4!


$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

4! = 4 * 3 * 2 * 1
12 * 2 * 1
24 * 1
24
4! = 24

/PX MFUƊT EP JU UIF TJMMZ XBZ JO )BTLFMM

fourFactorial :: Integer
fourFactorial = 4 * 3 * 2 * 1

5IJT XJMM SFUVSO UIF DPSSFDU SFTVMU CVU JU POMZ DPWFST POF
QPTTJCMF SFTVMU GPS factorial 5IJT JT MFTT UIBO JEFBM 8F XBOU
UP FYQSFTT UIF HFOFSBM JEFB PG UIF GVODUJPO OPU FODPEF TQFDJƶD
JOQVUT BOE PVUQVUT NBOVBMMZ
/PX XFƊMM MPPL BU TPNF CSPLFO DPEF UP JOUSPEVDF UIF DPO
DFQU PG B CBTF DBTF
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

-- This won't work. It never stops.


brokenFact1 :: Integer -> Integer
brokenFact1 n = n * brokenFact1 (n - 1)

-- Let's apply this to 4


-- and see what happens
brokenFact1 4 = 4 * (4 - 1)
* ((4 - 1) - 1)
* (((4 - 1) - 1) - 1)
... this series never stops

5IF XBZ XF DBO TUPQ B SFDVSTJWF FYQSFTTJPO JT CZ IBWJOH B


CBTF DBTF UIBU TUPQT UIF TFMGBQQMJDBUJPO UP GVSUIFS BSHVNFOUT
6OEFSTUBOEJOH UIJT JT DSJUJDBM GPS XSJUJOH GVODUJPOT XIJDI BSF
DPSSFDU BOE UFSNJOBUF QSPQFSMZ )FSFƊT XIBU UIJT MPPLT MJLF GPS
factorial

module Factorial where

factorial :: Integer -> Integer


factorial 0 = 1
factorial n = n * factorial (n - 1)
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

brokenFact1 4 = 4 * (4 - 1)
* ((4 - 1) - 1)
* (((4 - 1) - 1) - 1)
* ((((4 - 1) - 1) - 1) - 1)
* (((((4 - 1) - 1) - 1) - 1) - 1)
... never stops

#VU UIF CBTF DBTF factorial 0 = 1 JO UIF ƶYFE WFSTJPO HJWFT


PVS GVODUJPO B TUPQQJOH QPJOU TP UIF SFEVDUJPO DIBOHFT
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

-- Changes to
-- n = n * factorial (n - 1)
factorial 4 = 4 * factorial (4 - 1)

-- evaluate (-) applied to 4 and 1


4 * factorial 3

-- evaluate factorial applied to 3


-- expands to 3 * factorial (3 - 1)
4 * 3 * factorial (3 - 1)

-- beta reduce (-) applied to 3 and 1


4 * 3 * factorial 2

-- evaluate factorial applied to 2


4 * 3 * 2 * factorial (2 - 1)

-- evaluate (-) applied to 2 and 1


4 * 3 * 2 * factorial 1

-- evaluate factorial applied to 1


4 * 3 * 2 * 1 * factorial (1 - 1)

-- evaluate (-) applied to 1 and 1


-- we know factorial 0 = 1
-- so we evaluate that to 1
4 * 3 * 2 * 1 * 1
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

.BLJOH PVS CBTF DBTF BO JEFOUJUZ WBMVF GPS UIF GVODUJPO


NVMUJQMJDBUJPO JO UIJT DBTF
NFBOT UIBU BQQMZJOH UIF GVODUJPO
UP UIBU DBTF EPFTOƊU DIBOHF UIF SFTVMU PG QSFWJPVT BQQMJDBUJPOT

"OPUIFS XBZ UP MPPL BU SFDVSTJPO


*O UIF MBTU DIBQUFS XF MPPLFE BU B IJHIFSPSEFS GVODUJPO DBMMFE
DPNQPTJUJPO 'VODUJPO DPNQPTJUJPO JT B XBZ PG UZJOH UXP PS
NPSF
GVODUJPOT UPHFUIFS TVDI UIBU UIF SFTVMU PG BQQMZJOH UIF
ƶSTU GVODUJPO HFUT QBTTFE BT BO BSHVNFOU UP UIF OFYU GVODUJPO
5IJT JT UIF TBNF UIJOH SFDVSTJWF GVODUJPOT BSF EPJOH ƈ UBLJOH
UIF SFTVMU PG UIF ƶSTU BQQMJDBUJPO PG UIF GVODUJPO BOE QBTTJOH JU
UP UIF OFYU GVODUJPO ƈ FYDFQU JO UIF DBTF PG SFDVSTJWF GVODUJPOT
UIF ƶSTU SFTVMU HFUT QBTTFE CBDL UP UIF TBNF GVODUJPO SBUIFS UIBO
B EJƵFSFOU POF VOUJM JU SFBDIFT UIF CBTF DBTF BOE UFSNJOBUFT
8IFSF GVODUJPO DPNQPTJUJPO BT XF OPSNBMMZ UIJOL PG JU JT
TUBUJD BOE EFƶOJUF SFDVSTJWF DPNQPTJUJPOT BSF JOEFƶOJUF 5IF
OVNCFS PG UJNFT UIF GVODUJPO NBZ CF BQQMJFE EFQFOET PO UIF
BSHVNFOUT UP UIF GVODUJPO BOE UIF BQQMJDBUJPOT DBO CF JOƶOJUF
JG B TUPQQJOH QPJOU JT OPU DMFBSMZ EFƶOFE
-FUƊT SFDBMM UIBU GVODUJPO DPNQPTJUJPO IBT UIF GPMMPXJOH
UZQF

(.) :: (b -> c) -> (a -> b) -> a -> c

"OE XIFO XF VTF JU MJLF UIJT


$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

take 5 . filter odd . enumFrom $ 3

XF LOPX UIBU UIF ƶSTU SFTVMU XJMM CF B MJTU HFOFSBUFE CZ


enumFrom XIJDI XJMM CF QBTTFE UP filter odd HJWJOH VT B MJTU PG
POMZ UIF PEE SFTVMUT BOE UIBU MJTU XJMM CF QBTTFE UP take 5 BOE
PVS ƶOBM SFTVMU XJMM CF UIF ƶSTU ƶWF NFNCFST PG UIBU MJTU 5IVT
SFTVMUT HFU QJQFE UISPVHI B TFSJFT PG GVODUJPOT
3FDVSTJPO JT TFMGSFGFSFOUJBM DPNQPTJUJPO 8F BQQMZ B GVOD
UJPO UP BO BSHVNFOU UIFO QBTT UIBU SFTVMU PO BT BO BSHVNFOU
UP B TFDPOE BQQMJDBUJPO PG UIF TBNF GVODUJPO BOE TP PO
/PX MPPL BHBJO BU IPX UIF DPNQPTF GVODUJPO (.) JT XSJUUFO

(.) :: (b -> c) -> (a -> b) -> a -> c


(.) f g = \x -> f (g x)

" QSPHSBNNJOH MBOHVBHF TVDI BT )BTLFMM UIBU JT CVJMU


QVSFMZ PO MBNCEB DBMDVMVT IBT POF WFSC GPS FYQSFTTJOH DPNQV
UBUJPOT UIBU DBO CF FWBMVBUFE BQQMZ 8F BQQMZ B GVODUJPO UP BO
BSHVNFOU "QQMZJOH B GVODUJPO UP BO BSHVNFOU BOE QPUFOUJBMMZ
EPJOH TPNFUIJOH XJUI UIF SFTVMU JT BMM XF DBO EP OP NBUUFS
XIBU TZOUBDUJD DPOWFOJFODFT XF DPOTUSVDU UP NBLF JU TFFN UIBU
XF BSF EPJOH NPSF UIBO UIBU 8IJMF XF HJWF GVODUJPO DPNQP
TJUJPO B TQFDJBM OBNF BOE PQFSBUPS UP QPJOU VQ UIF QBUUFSO BOE
NBLF JU DPOWFOJFOU UP VTF JUƊT POMZ B XBZ PG TBZJOH

Ƒ HJWFO UXP GVODUJPOT ԕ BOE Ԗ BT BSHVNFOUT UP (.)



.BOZ UIBOLT UP (FPSHF .BLSZEBLJT GPS EJTDVTTJOH UIJT XJUI VT
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

Ƒ XIFO XF HFU BO BSHVNFOU ԧ BQQMZ Ԗ UP ԧ

Ƒ UIFO BQQMZ ԕ UP UIF SFTVMU PG (g x) PS

Ƒ UP SFQISBTF JO DPEF

(.) f g = \x -> f (g x)

8JUI GVODUJPO SFDVSTJPO ZPV NJHIU OPUJDF UIBU JU JT GVOD


UJPO BQQMJDBUJPO JO UIF TBNF XBZ UIBU DPNQPTJUJPO JT 5IF
EJƵFSFODF JT UIBU JOTUFBE PG B ƶYFE OVNCFS PG BQQMJDBUJPOT
SFDVSTJWF GVODUJPOT SFMZ PO JOQVUT UP EFUFSNJOF XIFO UP TUPQ
BQQMZJOH GVODUJPOT UP TVDDFTTJWF SFTVMUT 8JUIPVU B TQFDJƶFE
TUPQQJOH QPJOU UIF SFTVMU PG (g x) XJMM LFFQ CFJOH QBTTFE CBDL
UP Ԗ JOEFƶOJUFMZ
-FUƊT MPPL BU TPNF DPEF UP TFF UIF TJNJMBSJUZ JO QBUUFSOT

inc :: Num a => a -> a


inc = (+1)

three = inc . inc . inc $ 0


-- different syntax, same thing
three' = (inc . inc . inc) 0

#FDBVTF )BTLFMM JT CVJMU PO QVSF MBNCEB DBMDVMVT SFDVSTJPO JT JNQMFNFOUFE JO UIF
MBOHVBHF UISPVHI UIF : PS ƶYFEQPJOU DPNCJOBUPS :PV DBO SFBE B WFSZ HPPE FYQMBOBUJPO
PG UIBU BU http://mvanier.livejournal.com/2897.html JG ZPV BSF JOUFSFTUFE JO LOPXJOH IPX JU
XPSLT
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

0VS DPNQPTJUJPO PG inc CBLFT UIF OVNCFS PG BQQMJDBUJPOT


JOUP UIF TPVSDF DPEF 8F EPOƊU QSFTFOUMZ IBWF B NFBOT PG
DIBOHJOH IPX NBOZ UJNFT XF XBOU JU UP BQQMZ inc XJUIPVU
XSJUJOH B OFX GVODUJPO
4P XF NJHIU XBOU UP NBLF B HFOFSBM GVODUJPO UIBU DBO BQQMZ
inc BO JOEFƶOJUF OVNCFS PG UJNFT BOE BMMPX VT UP TQFDJGZ BT
BO BSHVNFOU IPX NBOZ UJNFT JU TIPVME CF BQQMJFE

incTimes :: (Eq a, Num a) => a -> a -> a


incTimes 0 n = n
incTimes times n = 1 + (incTimes (times - 1) n)

)FSF ԣԘԜԔԢ JT B WBSJBCMF SFQSFTFOUJOH UIF OVNCFS PG UJNFT


UIF JODSFNFOUJOH GVODUJPO OPU DBMMFE inc IFSF CVU XSJUUFO BT 1
+ JO UIF GVODUJPO CPEZ
TIPVME CF BQQMJFE UP UIF BSHVNFOU ԝ
*G XF XBOU UP BQQMZ JU [FSP UJNFT JU XJMM KVTU SFUVSO PVS ԝ UP VT
0UIFSXJTF UIF JODSFNFOUJOH GVODUJPO XJMM CF BQQMJFE BT NBOZ
UJNFT BT XFƊWF EFDMBSFE

Prelude> incTimes 10 0
10
Prelude> incTimes 5 0
5
Prelude> incTimes 5 5
10

--does this look familiar?


$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

*O B GVODUJPO TVDI BT UIJT UIF MPPNJOH UISFBU PG VOFOEJOH


SFDVSTJPO JT NJOJNJ[FE CFDBVTF UIF OVNCFS PG UJNFT UP BQQMZ
UIF GVODUJPO JT BO BSHVNFOU UP UIF GVODUJPO JUTFMG BOE XFƊWF
EFƶOFE B TUPQQJOH QPJOU XIFO (times - 1) JT FRVBM UP [FSP JU
SFUVSOT ԝ BOE UIBUƊT BMM UIF BQQMJDBUJPOT XF HFU
8F DBO BCTUSBDU UIF SFDVSTJPO PVU PG incTimes UPP

applyTimes :: (Eq a, Num a) =>


a -> (b -> b) -> b -> b
applyTimes 0 f b = b
applyTimes n f b = f (applyTimes (n-1) f b)

incTimes' :: (Eq a, Num a) => a -> a -> a


incTimes' times n = applyTimes times (+1) n

8IFO XF EP XF DBO NBLF UIF DPNQPTJUJPO NPSF PCWJPVT


JO applyTimes

applyTimes :: (Eq a, Num a) =>


a -> (b -> b) -> b -> b
applyTimes 0 f b = b
applyTimes n f b = f . applyTimes (n-1) f $ b

8FƊSF SFDVSTJWFMZ DPNQPTJOH PVS GVODUJPO ԕ XJUI applyTimes


(n-1) f IPXFWFS NBOZ TVCUSBDUJPOT JU UBLFT UP HFU n UP 
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

*OUFSNJTTJPO &YFSDJTF
8SJUF PVU UIF FWBMVBUJPO PG UIF GPMMPXJOH *U NJHIU CF B MJUUMF
MFTT OPJTZ JG ZPV EP TP XJUI UIF GPSN UIBU EJEOƊU VTF (.)

applyTimes 5 (+1) 5

 #PUUPN
વ PS CPUUPN JT B UFSN VTFE JO )BTLFMM UP SFGFS UP DPNQVUBUJPOT
UIBU EP OPU TVDDFTTGVMMZ SFTVMU JO B WBMVF 5IF UXP NBJO WBSJ
FUJFT PG CPUUPN BSF DPNQVUBUJPOT UIBU GBJMFE XJUI BO FSSPS PS
UIPTF UIBU GBJMFE UP UFSNJOBUF *O MPHJD વ DPSSFTQPOET UP GBMTF
-FU VT FYBNJOF B GFX XBZT CZ XIJDI XF DBO IBWF CPUUPN JO
PVS QSPHSBNT

Prelude> let x = x in x
*** Exception: <<loop>>
Prelude>

)FSF ()$J EFUFDUFE UIBU let x = x in x XBT OFWFS HPJOH


UP SFUVSO BOE TIPSUDJSDVJUFE UIF OFWFSFOEJOH DPNQVUBUJPO
5IJT JT BO FYBNQMF PG CPUUPN CFDBVTF JU XBT OFWFS HPJOH UP
SFUVSO B SFTVMU /PUF UIBU JG ZPVƊSF VTJOH B 8JOEPXT DPNQVUFS
UIJT FYBNQMF NBZ KVTU GSFF[F ZPVS ()$J BOE OPU UISPX BO
FYDFQUJPO
/FYU MFUƊT EFƶOF B GVODUJPO UIBU XJMM SFUVSO BO FYDFQUJPO
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

f :: Bool -> Int


f True = error "blah"
f False = 0

"OE MFUƊT USZ UIBU PVU JO ()$J

Prelude> f False
0
Prelude> f True
*** Exception: blah

*O UIF ƶSTU DBTF XIFO XF FWBMVBUFE f False BOE HPU 0 UIBU


EJEOƊU SFTVMU JO B CPUUPN WBMVF #VU XIFO XF FWBMVBUFE f True
XF HPU BO FYDFQUJPO XIJDI JT B NFBOT PG FYQSFTTJOH UIBU B
DPNQVUBUJPO GBJMFE 8F HPU BO FYDFQUJPO CFDBVTF XF TQFDJƶFE
UIBU UIJT WBMVF TIPVME SFUVSO BO FSSPS #VU UIJT UPP JT BO
FYBNQMF PG CPUUPN
"OPUIFS FYBNQMF PG B CPUUPN XPVME CF B QBSUJBM GVODUJPO
-FUƊT DPOTJEFS B SFXSJUF PG UIF QSFWJPVT GVODUJPO

f :: Bool -> Int


f False = 0

5IJT IBT UIF TBNF UZQF BOE SFUVSOT UIF TBNF PVUQVU 8IBU
XFƊWF EPOF JT FMJEFE UIF f True = error "blah" DBTF GSPN UIF
GVODUJPO EFƶOJUJPO 5IJT JT OPU B TPMVUJPO UP UIF QSPCMFN XJUI
UIF QSFWJPVT GVODUJPO CVU JU XJMM HJWF VT B EJƵFSFOU FYDFQUJPO
8F DBO PCTFSWF UIJT GPS PVSTFMWFT JO ()$J
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

Prelude> let f :: Bool -> Int; f False = 0


Prelude> f False
0
Prelude> f True
*** Exception: 6:23-33:
Non-exhaustive patterns in function f

5IF error WBMVF JT TUJMM UIFSF CVU PVS MBOHVBHF JNQMFNFO


UBUJPO JT NBLJOH JU UIF GBMMCBDL DBTF CFDBVTF XF EJEOƊU XSJUF
B UPUBM GVODUJPO UIBU JT B GVODUJPO XIJDI IBOEMFT BMM PG JUT JO
QVUT #FDBVTF XF GBJMFE UP EFƶOF XBZT UP IBOEMF BMM QPUFOUJBM
JOQVUT GPS FYBNQMF UISPVHI BO ƌPUIFSXJTFƍ DBTF UIF QSFWJPVT
GVODUJPO XBT SFBMMZ

f :: Bool -> Int


f False = 0
f _ = error $ "*** Exception: "
++ "Non-exhaustive"
++ "patterns in function f"

" QBSUJBM GVODUJPO JT POF XIJDI EPFT OPU IBOEMF BMM PG JUT
JOQVUT " UPUBM GVODUJPO JT POF UIBU EPFT )PX EP XF NBLF PVS
ԕ JOUP B UPUBM GVODUJPO 0OF XBZ JT XJUI UIF VTF PG UIF EBUBUZQF
Maybe

data Maybe a = Nothing | Just a


$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

5IF Maybe EBUBUZQF DBO UBLF BO BSHVNFOU *O UIF ƶSTU DBTF


Nothing UIFSF JT OP BSHVNFOU UIJT JT PVS XBZ UP TBZ UIBU UIFSF
JT OP SFTVMU PS EBUB GSPN UIF GVODUJPO XJUIPVU IJUUJOH CPUUPN
5IF TFDPOE DBTF Just a UBLFT BO BSHVNFOU BOE BMMPXT VT UP
SFUVSO UIF EBUB XFƊSF XBOUJOH Maybe NBLFT BMM VTFT PG nil WBMVFT
BOE NPTU VTFT PG CPUUPN VOOFDFTTBSZ )FSFƊT IPX XFƊE VTF JU
XJUI ԕ

f :: Bool -> Maybe Int


f False = Just 0
f _ = Nothing

/PUF UIBU UIF UZQF BOE CPUI DBTFT BMM DIBOHF /PU POMZ EP
XF SFQMBDF UIF error XJUI UIF Nothing WBMVF GSPN Maybe CVU XF
BMTP IBWF UP XSBQ 0 JO UIF Just DPOTUSVDUPS GSPN Maybe *G XF
EPOƊU EP TP XFƊMM HFU B UZQF FSSPS XIFO XF USZ UP MPBE UIF DPEF
BT ZPV DBO TFF

f :: Bool -> Maybe Int


f False = 0
f _ = Nothing

Prelude> :l code/brokenMaybe1.hs
[1 of 1] Compiling Main

code/brokenMaybe1.hs:3:11:
No instance for (Num (Maybe Int)) arising from the literal ‘0’
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

In the expression: 0
In an equation for ‘f’: f False = 0

5IJT UZQF FSSPS JT CFDBVTF BT CFGPSF 0 IBT UIF UZQF Num a =>
a TP JUƊT USZJOH UP HFU BO JOTUBODF PG Num GPS Maybe Int 8F DBO
DMBSJGZ PVS JOUFOU B CJU

f :: Bool -> Maybe Int


f False = 0 :: Int
f _ = Nothing

"OE UIFO HFU B CFUUFS UZQF FSSPS JO UIF CBSHBJO

Prelude> :l code/brokenMaybe2.hs
[1 of 1] Compiling Main

code/brokenMaybe2.hs:3:11:
Couldn't match expected type
‘Maybe Int’ with actual type ‘Int’
In the expression: 0 :: Int
In an equation for ‘f’: f False = 0 :: Int

8FƊMM FYQMBJO Maybe JO NPSF EFUBJM B CJU MBUFS

 'JCPOBDDJ OVNCFST


"OPUIFS DMBTTJD EFNPOTUSBUJPO PG SFDVSTJPO JO GVODUJPOBM QSP
HSBNNJOH JT B GVODUJPO UIBU DBMDVMBUFT UIF ԝUI OVNCFS JO B
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

'JCPOBDDJ TFRVFODF 5IF 'JCPOBDDJ TFRVFODF JT B TFRVFODF


PG OVNCFST JO XIJDI FBDI OVNCFS JT UIF TVN PG UIF QSFWJPVT
UXP          BOE TP PO *UƊT BO JOEFƶOJUF
DPNQVUBUJPO UIBU SFMJFT PO BEEJOH UXP PG JUT PXO NFNCFST TP
JUƊT B QFSGFDU DBOEJEBUF GPS B SFDVSTJWF GVODUJPO 8FƊSF HPJOH UP
XBML UISPVHI UIF TUFQT PG IPX XF XPVME XSJUF TVDI B GVODUJPO
GPS PVSTFMWFT UP HFU B CFUUFS VOEFSTUBOEJOH PG UIF SFBTPOJOH
QSPDFTT

 $POTJEFS UIF UZQFT


5IF ƶSTU UIJOH XFƊMM DPOTJEFS JT UIF QPTTJCMF UZQF TJHOBUVSF
GPS PVS GVODUJPO 5IF 'JCPOBDDJ TFRVFODF POMZ JOWPMWFT
QPTJUJWF XIPMF OVNCFST 5IF BSHVNFOU UP PVS 'JCPOBDDJ
GVODUJPO JT HPJOH UP CF B QPTJUJWF XIPMF OVNCFS CFDBVTF
XFƊSF USZJOH UP SFUVSO UIF WBMVF UIBU JT UIF ԝUI NFNCFS PG
UIF 'JCPOBDDJ TFRVFODF 0VS SFTVMU XJMM BMTP CF B QPTJUJWF
XIPMF OVNCFS TJODF UIBUƊT XIBU 'JCPOBDDJ OVNCFST BSF
8F XPVME CF MPPLJOH UIFO GPS WBMVFT UIBU BSF PG UIF Int PS
Integer UZQFT 8F DPVME VTF POF PG UIPTF DPODSFUF UZQFT
PS VTF B UZQFDMBTT GPS DPOTUSBJOFE QPMZNPSQIJTN 4QFDJG
JDBMMZ XF XBOU B UZQF TJHOBUVSF UIBU UBLFT POF JOUFHSBM
BSHVNFOU BOE SFUVSOT POF JOUFHSBM SFTVMU 4P PVS UZQF
TJHOBUVSF XJMM MPPL TPNFUIJOH MJLF UIJT
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

fibonacci :: Integer -> Integer


-- or
fibonacci :: Integral a => a -> a

 $POTJEFS UIF CBTF DBTF


*U NBZ TPNFUJNFT CF EJƸDVMU UP EFUFSNJOF ZPVS CBTF DBTF
VQ GSPOU CVU JUƊT XPSUI UIJOLJOH BCPVU 'PS POF UIJOH
ZPV EP XBOU UP FOTVSF UIBU ZPVS GVODUJPO XJMM UFSNJOBUF
'PS BOPUIFS UIJOH HJWJOH TFSJPVT DPOTJEFSBUJPO UP ZPVS
CBTF DBTF JT B WBMVBCMF QBSU PG VOEFSTUBOEJOH IPX ZPVS
GVODUJPO XPSLT 'JCPOBDDJ OVNCFST BSF QPTJUJWF JOUFHFST
TP B SFBTPOBCMF CBTF DBTF JT [FSP 8IFO UIF SFDVSTJWF
QSPDFTT IJUT [FSP JU TIPVME UFSNJOBUF
5IF 'JCPOBDDJ TFRVFODF JT BDUVBMMZ B CJU USJDLJFS UIBO TPNF
UIPVHI CFDBVTF JU SFBMMZ OFFET UXP CBTF DBTFT 5IF TF
RVFODF IBT UP TUBSU PƵ XJUI UXP OVNCFST TJODF UXP OVN
CFST BSF JOWPMWFE JO DPNQVUJOH UIF OFYU 5IF OFYU OVN
CFS BǒFS [FSP JT  BOE XF BEE [FSP UP  UP TUBSU UIF TFRVFODF
TP UIPTF XJMM CF PVS CBTF DBTFT

fibonacci :: Integral a => a -> a


fibonacci 0 = 0
fibonacci 1 = 1

 $POTJEFS UIF BSHVNFOUT


$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

8FƊWF BMSFBEZ EFUFSNJOFE UIBU UIF BSHVNFOU UP PVS GVOD


UJPO UIF WBMVF UP XIJDI UIF GVODUJPO JT BQQMJFE JT BO JOUF
HSBM OVNCFS BOE SFQSFTFOUT UIF NFNCFS PG UIF TFRVFODF
XF XBOU UP CF FWBMVBUFE 5IBU JT XF XBOU UP QBTT B WBMVF
TVDI BT  UP UIJT GVODUJPO BOE IBWF JU DBMDVMBUF UIF UI
OVNCFS JO UIF 'JCPOBDDJ TFRVFODF 8F POMZ OFFE UP IBWF
POF WBSJBCMF BT BO BSHVNFOU UP UIJT GVODUJPO UIFO
#VU UIBU BSHVNFOU XJMM BMTP CF VTFE BT BSHVNFOUT XJUIJO
UIF GVODUJPO EVF UP UIF SFDVSTJWF QSPDFTT &WFSZ 'JCPOBDDJ
OVNCFS JT UIF SFTVMU PG BEEJOH UIF QSFDFEJOH UXP OVNCFST
4P JO BEEJUJPO UP B WBSJBCMF ԧ XF XJMM OFFE UP VTF (x - 1)
BOE (x - 2) UP HFU CPUI UIF OVNCFST CFGPSF PVS BSHVNFOU

fibonacci :: Integral a => a -> a


fibonacci 0 = 0
fibonacci 1 = 1
fibonacci x = (x - 1) (x - 2)
-- note: this doesn't work yet.

 $POTJEFS UIF SFDVSTJPO


"MM SJHIU OPX XF DPNF UP UIF IFBSU PG UIF NBUUFS *O XIBU
XBZ XJMM UIJT GVODUJPO SFGFS UP JUTFMG BOE DBMM JUTFMG -PPL BU
XIBU XFƊWF XPSLFE PVU TP GBS XIBU OFFET UP IBQQFO OFYU
UP QSPEVDF B 'JCPOBDDJ OVNCFS 0OF UIJOH UIBU OFFET
UP IBQQFO JT UIBU (x - 1) BOE (x - 2) OFFE UP CF BEEFE
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

UPHFUIFS UP QSPEVDF B SFTVMU 5SZ TJNQMZ BEEJOH UIPTF UXP


UPHFUIFS BOE SVOOJOH UIF GVODUJPO UIBU XBZ

fibonacci :: Integral a => a -> a


fibonacci 0 = 0
fibonacci 1 = 1
fibonacci x = (x - 1) + (x - 2)

*G ZPV QBTT UIF WBMVF  UP UIBU GVODUJPO XIBU XJMM IBQQFO

*Main> fibonacci 6
9

8IZ #FDBVTF   
  

FRVBMT  #VU UIJT JTOƊU IPX


XF DBMDVMBUF 'JCPOBDDJ OVNCFST 5IF TJYUI NFNCFS PG
UIF 'JCPOBDDJ TFRVFODF JT OPU   
  

 8IBU XF
SFBMMZ XBOU JT UP BEE UIF ƶǒI NFNCFS PG UIF 'JCPOBDDJ
TFRVFODF UP UIF GPVSUI NFNCFS 5IBU SFTVMU XJMM CF UIF
TJYUI NFNCFS PG UIF TFRVFODF 8F EP UIJT CZ NBLJOH UIF
GVODUJPO SFGFS UP JUTFMG *O UIJT DBTF XF IBWF UP TQFDJGZ
UIBU CPUI (x - 1) BOE (x - 2) BSF UIFNTFMWFT 'JCPOBDDJ
OVNCFST TP XF IBWF UP DBMM UIF GVODUJPO UP JUTFMG UXJDF

fibonacci :: Integral a => a -> a


fibonacci 0 = 0
fibonacci 1 = 1
fibonacci x = fibonacci (x - 1) + fibonacci (x - 2)
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

/PX JG XF BQQMZ UIJT GVODUJPO UP UIF WBMVF  XF XJMM HFU B


EJƵFSFOU SFTVMU

*Main> fibonacci 6
8

8IZ #FDBVTF JU FWBMVBUFT UIJT SFDVSTJWFMZ

fibonacci 6 = fibonacci 5 + fibonacci 4

fibonacci 5 = fibonacci 4 + fibonacci 3

fibonacci 4 = fibonacci 3 + fibonacci 2

fibonacci 3 = fibonacci 2 + fibonacci 1

fibonacci 2 = fibonacci 1 + fibonacci 0

;FSP BOE  IBWF CFFO EFƶOFE BT CFJOH FRVBM UP [FSP BOE


 4P IFSF PVS SFDVSTJPO TUPQT BOE JU TUBSUT BEEJOH UIF
SFTVMU

fibonacci 0 + 0
fibonacci 1 + 1
fibonacci 2 + (1 + 0 =) 1
fibonacci 3 + (1 + 1 =) 2
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

fibonacci 4 + (1 + 2 =) 3
fibonacci 5 = (2 + 3 =) 5
fibonacci 6 = (3 + 5 =) 8

*U DBO CF EBVOUJOH BU ƶSTU UP UIJOL IPX ZPV XPVME XSJUF B


SFDVSTJWF GVODUJPO BOE XIBU JU NFBOT GPS B GVODUJPO UP DBMM
JUTFMG #VU BT ZPV DBO TFF JUƊT VTFGVM XIFO UIF GVODUJPO XJMM
NBLF SFGFSFODF UP JUT PXO SFTVMUT JO B SFQFBUFE GBTIJPO

 *OUFHSBM EJWJTJPO GSPN TDSBUDI


.BOZ QFPQMF MFBSOFE NVMUJQMJDBUJPO CZ NFNPSJ[JOH NVMUJ
QMJDBUJPO UBCMFT VTVBMMZ VQ UP Y PS Y EP[FO
 *O GBDU
POF DBO QFSGPSN NVMUJQMJDBUJPO JO UFSNT PG BEEJUJPO SFQFBUFE
PWFS BOE PWFS 4JNJMBSMZ POF DBO EFƶOF JOUFHSBM EJWJTJPO JO
UFSNT PG TVCUSBDUJPO
-FUƊT UIJOL UISPVHI PVS SFDVSTJWF EJWJTJPO GVODUJPO POF TUFQ
BU B UJNF 'JSTU MFUƊT DPOTJEFS UIF UZQFT XF XPVME XBOU UP VTF GPS
TVDI B GVODUJPO BOE TFF JG XF DBO DPOTUSVDU B SFBTPOBCMF UZQF
TJHOBUVSF 8IFO XF EJWJEF OVNCFST XF IBWF B OVNFSBUPS BOE
B EFOPNJOBUPS 8IFO XF FWBMVBUF 10 / 5 UP HFU UIF BOTXFS 
 JT UIF OVNFSBUPS  UIF EFOPNJOBUPS BOE  XBT UIF RVPUJFOU
4P XF IBWF BU MFBTU UISFF OVNCFST IFSF 4P QFSIBQT B UZQF
MJLF Integer -> Integer -> Integer XPVME CF TVJUBCMF :PV DPVME
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

FWFO BEE TPNF UZQF TZOPOZNT UIBU XPOƊU DIBOHF ZPVS DPEF

UP NBLF JU NPSF PCWJPVT JG ZPV XJTIFE

dividedBy :: Integer -> Integer -> Integer


dividedBy = div

-- changes to

type Numerator = Integer


type Denominator = Integer
type Quotient = Integer

dividedBy :: Numerator -> Denominator -> Quotient


dividedBy = div

'PS UIJT FYBNQMF XF EJEOƊU XSJUF PVU UIF SFDVSTJWF JNQMF


NFOUBUJPO PG dividedBy XF IBE JO NJOE "T JU UVSOT PVU XIFO
XF XSJUF UIF GVODUJPO XF XJMM XBOU UP DIBOHF UIF ƶOBM UZQF TJH
OBUVSF B CJU GPS SFBTPOT XFƊMM TFF JO B NJOVUF 4PNFUJNFT UIF
VTF PG UZQF TZOPOZNT DBO JNQSPWF UIF DMBSJUZ BOE QVSQPTF PG
ZPVS UZQF TJHOBUVSFT TP UIJT JT TPNFUIJOH ZPVƊMM TFF FTQFDJBMMZ
JO NPSF DPNQMFY DPEF 'PS PVS SFMBUJWFMZ TJNQMF GVODUJPO JU
NBZ OPU CF OFDFTTBSZ
/FYU MFUƊT UIJOL UISPVHI PVS CBTF DBTF 5IF XBZ XF EJWJEF JO
UFSNT PG TVCUSBDUJPO JT CZ TUPQQJOH XIFO PVS SFTVMU PG IBWJOH
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

TVCUSBDUFE SFQFBUFEMZ JT MPXFS UIBO UIF EJWJTPS *G JU EJWJEFT


FWFOMZ JUƊMM TUPQ BU 

Solve 20 divided by 4
-- [1] [2]
-- [1]: Dividend or numerator
-- [2]: Divisor or denominator
-- Result is quotient

20 divided by 4 == 20 - 4, 16
- 4, 12
- 4, 8
- 4, 4
- 4, 0
-- 0 is less than 4, so we stopped.
-- We subtracted 5 times, so 20 / 4 == 5

0UIFSXJTF XFƊMM IBWF B SFNBJOEFS -FUƊT MPPL BU B DBTF XIFSF


JU EPFTOƊU EJWJEF FWFOMZ

Solve 25 divided by 4

25 divided by 4 == 25 - 4, 21
- 4, 17
- 4, 13
- 4, 9
- 4, 5
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

- 4, 1
-- we stop at 1, because it's less than 4

*O UIF DBTF PG  EJWJEFE CZ  XF TVCUSBDUFE  TJY UJNFT BOE


IBE  BT PVS SFNBJOEFS 8F DBO HFOFSBMJ[F UIJT QSPDFTT PG EJ
WJEJOH XIPMF OVNCFST SFUVSOJOH UIF RVPUJFOU BOE SFNBJOEFS
JOUP B SFDVSTJWF GVODUJPO XIJDI EPFT UIF SFQFBUFE TVCUSBDUJPO
BOE DPVOUJOH GPS VT 4JODF XFƊE MJLF UP SFUVSO UIF RVPUJFOU
BOE UIF SFNBJOEFS XFƊSF HPJOH UP SFUVSO UIF UVQMF (,) BT UIF
SFTVMU PG PVS SFDVSTJWF GVODUJPO

dividedBy :: Integral a => a -> a -> (a, a)


dividedBy num denom = go num denom 0
where go n d count
| n < d = (count, n)
| otherwise = go (n - d) d (count + 1)

8FƊWF DIBOHFE UIF UZQF TJHOBUVSF GSPN UIF POF XF IBE


PSJHJOBMMZ XPSLFE PVU CPUI UP NBLF JU NPSF QPMZNPSQIJD
Integral a => a WFSTVT Integer
BOE BMTP UP SFUVSO UIF UVQMF
JOTUFBE PG KVTU BO JOUFHFS
)FSF XF VTFE B DPNNPO )BTLFMM JEJPN DBMMFE B go GVODUJPO
5IJT BMMPXT VT UP EFƶOF B GVODUJPO WJB B whereDMBVTF UIBU DBO
BDDFQU NPSF BSHVNFOUT UIBO UIF UPQMFWFM GVODUJPO dividedBy
EPFT *O UIJT DBTF UIF UPQMFWFM GVODUJPO UBLFT UXP BSHVNFOUT
num BOE denom CVU XF OFFE B UIJSE BSHVNFOU JO PSEFS UP LFFQ
USBDL PG IPX NBOZ UJNFT XF EP UIF TVCUSBDUJPO 5IBU BSHVNFOU
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

JT DBMMFE count BOE JT EFƶOFE XJUI B TUBSUJOH WBMVF PG [FSP BOE


JT JODSFNFOUFE CZ  FWFSZ UJNF UIF otherwise DBTF JT JOWPLFE
5IFSF BSF UXP CSBODIFT JO PVS go GVODUJPO 5IF ƶSTU DBTF
JT UIF NPTU TQFDJƶD XIFO UIF OVNFSBUPS ԝ JT MFTT UIBO UIF
EFOPNJOBUPS ԓ UIF SFDVSTJPO TUPQT BOE SFUVSOT B SFTVMU *U
JT OPU TJHOJƶDBOU UIBU XF DIBOHFE UIF BSHVNFOU OBNFT GSPN
ԝԤԜ BOE ԓԔԝԞԜ UP ԝ BOE ԓ 5IF go GVODUJPO IBT BMSFBEZ CFFO
BQQMJFE UP UIPTF BSHVNFOUT JO UIF EFƶOJUJPO PG dividedBy TP
UIF ԝԤԜ ԓԔԝԞԜ BOE  BSF CPVOE UP ԝ ԓ BOE ԒԞԤԝԣ JO UIF where
DMBVTF
5IF SFTVMU JT B UVQMF PG ԒԞԤԝԣ BOE UIF MBTU WBMVF GPS ԝ 5IJT JT
PVS CBTF DBTF UIBU TUPQT UIF SFDVSTJPO BOE HJWFT B ƶOBM SFTVMU
)FSFƊT BO FYBNQMF PG IPX dividedBy FYQBOET CVU XJUI UIF
DPEF JOMJOFE

dividedBy 10 2

-- first we'll do this the previous way,


-- but we'll keep track of how many times we subtracted.
10 divided by 2 == 10 - 2, 8 (subtracted 1 time)
- 2, 6 (subtracted 2 times)
- 2, 4 (subtracted 3 times)
- 2, 2 (subtracted 4 times)
- 2, 0 (subtracted 5 times)

4JODF UIF ƶOBM OVNCFS XBT  UIFSFƊT OP SFNBJOEFS 8F


$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

TVCUSBDUFE ƶWF UJNFT 4P 10 / 2 == 5


/PX XFƊMM FYQBOE UIF DPEF
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

dividedBy 10 2 =
go 10 2 0

| 10 < 2 = ...
-- false, skip this branch

| otherwise = go (10 - 2) 2 (0 + 1)
-- otherwise is literally the value True
-- so if first branch fails, this always succeeds

go 8 2 1
-- 8 isn't < 2, so the otherwise branch
go (8 - 2) 2 (1 + 1)
-- n == 6, d == 2, count == 2

go 6 2 2
go (6 - 2) 2 (2 + 1)
-- 6 isn't < 2, so the otherwise branch
-- n == 4, d == 2, count == 3

go 4 2 3
go (4 - 2) 2 (3 + 1)
-- 4 isn't < 2, so the otherwise branch
-- n == 2, d == 2, count == 4

go 2 2 4
go (2 - 2) 2 (4 + 1)
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

5IF SFTVMU PG ԒԞԤԝԣ JT UIF RVPUJFOU UIBU JT IPX NBOZ UJNFT


ZPV DBO TVCUSBDU  GSPN  *O B DBTF XIFSF UIFSF XBT B SFNBJO
EFS UIBU OVNCFS XPVME CF UIF ƶOBM WBMVF GPS ZPVS OVNFSBUPS
BOE XPVME CF SFUVSOFE BT UIF SFNBJOEFS

 $IBQUFS &YFSDJTFT


3FWJFX PG UZQFT
 8IBU JT UIF UZQF PG [[True, False], [True, True], [False,
True]]

B
Bool
C
NPTUMZ True
D
[a]
E
[[Bool]]

 8IJDI PG UIF GPMMPXJOH IBT UIF TBNF UZQF BT [[True, False],


[True, True], [False, True]]

B
[(True, False), (True, True), (False, True)]
C
[[3 == 3], [6 > 5], [3 < 4]]
D
[3 == 3, 6 > 5, 3 < 4]
E
["Bool", "more Bool", "Booly Bool!"]

 'PS UIF GPMMPXJOH GVODUJPO


$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

func :: [a] -> [a] -> [a]


func x y = x ++ y

XIJDI PG UIF GPMMPXJOH JT USVF

B
x BOE y NVTU CF PG UIF TBNF UZQF
C
x BOE y NVTU CPUI CF MJTUT
D
JG x JT B String UIFO y NVTU CF B String
E
BMM PG UIF BCPWF

 'PS UIF func DPEF BCPWF XIJDI JT B WBMJE BQQMJDBUJPO PG


func UP CPUI PG JUT BSHVNFOUT

B
func "Hello World"
C
func "Hello" "World"
D
func [1, 2, 3] "a, b, c"
E
func ["Hello", "World"]

3FWJFXJOH DVSSZJOH
(JWFO UIF GPMMPXJOH EFƶOJUJPOT UFMM VT XIBU WBMVF SFTVMUT GSPN
GVSUIFS BQQMJDBUJPOT
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

cattyConny :: String -> String -> String


cattyConny x y = x ++ " mrow " ++ y

-- fill in the types

flippy = flip cattyConny

appedCatty = cattyConny "woops"


frappe = flippy "haha"

 8IBU JT UIF WBMVF PG appedCatty "woohoo!" 5SZ UP EFUFS


NJOF UIF BOTXFS GPS ZPVSTFMG UIFO UFTU JO UIF 3&1-

 frappe "1"

 frappe (appedCatty "2")

 appedCatty (frappe "blue")

 cattyConny (frappe "pink")


(cattyConny "green" (appedCatty "blue"))

 cattyConny (flippy "Pugs" "are") "awesome"

3FDVSTJPO
 8SJUF PVU UIF TUFQT GPS SFEVDJOH dividedBy 15 2 UP JUT ƶOBM
BOTXFS BDDPSEJOH UP UIF )BTLFMM DPEF
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

 8SJUF B GVODUJPO UIBU SFDVSTJWFMZ TVNT BMM OVNCFST GSPN


 UP O O CFJOH UIF BSHVNFOU 4P UIBU JG O XBT  ZPVƊE BEE
     UP HFU  5IF UZQF TIPVME CF (Eq a, Num a)
=> a -> a

 8SJUF B GVODUJPO UIBU NVMUJQMJFT UXP JOUFHSBM OVNCFST


VTJOH SFDVSTJWF TVNNBUJPO 5IF UZQF TIPVME CF (Integral
a) => a -> a -> a

'JYJOH EJWJEFE#Z
0VS EJWJEFE#Z GVODUJPO XBTOƊU RVJUF JEFBM 'PS POF UIJOH *U
XBT B QBSUJBM GVODUJPO BOE EPFTOƊU SFUVSO B SFTVMU CPUUPN

XIFO HJWFO B EJWJTPS UIBU JT  PS MFTT


6TJOH UIF QSFFYJTUJOH div GVODUJPO XF DBO TFF IPX OFHBUJWF
OVNCFST TIPVME CF IBOEMFE

Prelude> div 10 2
5
Prelude> div 10 (-2)
-5
Prelude> div (-10) (-2)
5
Prelude> div (-10) (2)
-5

5IF OFYU JTTVF JT IPX UP IBOEMF [FSP ;FSP JT VOEFƶOFE


GPS EJWJTJPO JO NBUI TP SFBMMZ XF PVHIU UP VTF B EBUBUZQF UIBU
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

MFUT VT TBZ UIFSF XBT OP TFOTJCMF SFTVMU XIFO UIF VTFS EJWJEFT
CZ [FSP *G ZPV OFFE JOTQJSBUJPO DPOTJEFS VTJOH UIF GPMMPXJOH
EBUBUZQF UP IBOEMF UIJT

data DividedResult =
Result Integer
| DividedByZero

.D$BSUIZ  GVODUJPO
8FƊSF HPJOH UP EFTDSJCF B GVODUJPO JO &OHMJTI UIFO JO NBUI
OPUBUJPO UIFO TIPX ZPV XIBU ZPVS GVODUJPO TIPVME SFUVSO GPS
TPNF UFTU JOQVUT :PVS UBTL JT UP XSJUF UIF GVODUJPO JO )BTLFMM
5IF .D$BSUIZ  GVODUJPO ZJFMET ԧ ਷  XIFO ԧ   BOE 
PUIFSXJTF 5IF GVODUJPO JT SFDVSTJWF


৖ԝ ਷  JG ԝ  
Ԃ Ӹ ԝ
 ৗ

৕Ԃ Ӹ Ԃ Ӹ ԝ 

JG ԝ ମ 

mc91 = undefined

:PV IBWFOƊU TFFO map ZFU CVU BMM ZPV OFFE UP LOPX SJHIU
OPX JT UIBU JU BQQMJFT B GVODUJPO UP FBDI NFNCFS PG B MJTU BOE
SFUVSOT UIF SFTVMUJOH MJTU *UƊMM CF FYQMBJOFE JO NPSF EFUBJM JO
UIF OFYU DIBQUFS

Prelude> map mc91 [95..110]


[91,91,91,91,91,91,91,92,93,94,95,96,97,98,99,100]
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

/VNCFST JOUP XPSET


module WordNumber where

import Data.List (intersperse)

digitToWord :: Int -> String


digitToWord n = undefined

digits :: Int -> [Int]


digits n = undefined

wordNumber :: Int -> String


wordNumber n = undefined

)FSF undefined JT B QMBDFIPMEFS UP TIPX ZPV XIFSF ZPV OFFE


UP ƶMM JO UIF GVODUJPOT 5IF n UP UIF SJHIU PG UIF GVODUJPO OBNFT
JT UIF BSHVNFOU XIJDI XJMM CF BO JOUFHFS
'JMM JO UIF JNQMFNFOUBUJPOT PG UIF GVODUJPOT BCPWF TP UIBU
wordNumber SFUVSOT UIF &OHMJTI XPSE WFSTJPO PG UIF *OU WBMVF
:PV XJMM ƶSTU XSJUF B GVODUJPO UIBU UVSOT JOUFHFST GSPN  JOUP
UIFJS DPSSFTQPOEJOH &OHMJTI XPSET ƍPOF ƍ ƍUXP ƍ BOE TP PO
5IFO ZPV XJMM XSJUF B GVODUJPO UIBU UBLFT UIF JOUFHFS TFQBSBUFT
UIF EJHJUT BOE SFUVSOT JU BT B MJTU PG JOUFHFST 'JOBMMZ ZPV XJMM
OFFE UP BQQMZ UIF ƶSTU GVODUJPO UP UIF MJTU QSPEVDFE CZ UIF TFD
POE GVODUJPO BOE UVSO JU JOUP B TJOHMF TUSJOH XJUI JOUFSTQFSTFE
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

IZQIFOT
8FƊWF MBJE PVU NVMUJQMF GVODUJPOT GPS ZPV UP DPOTJEFS BT ZPV
UBDLMF UIF QSPCMFN :PV NBZ OPU OFFE BMM PG UIFN EFQFOEJOH
PO IPX ZPV TPMWF JUƇUIFTF BSF KVTU TVHHFTUJPOT 1MBZ XJUI
UIFN BOE MPPL VQ UIFJS EPDVNFOUBUJPO UP VOEFSTUBOE UIFN
JO EFFQFS EFUBJM
:PV XJMM QSPCBCMZ ƶOE UIJT EJƸDVMU

div :: Integral a => a -> a -> a


mod :: Integral a => a -> a -> a
map :: (a -> b) -> [a] -> [b]
concat :: [[a]] -> [a]
intersperse :: a -> [a] -> [a]
(++) :: [a] -> [a] -> [a]
(:[]) :: a -> [a]

"MTP DPOTJEFS

Prelude> div 135 10


13
Prelude> mod 135 10
5
Prelude> div 13 10
1
Prelude> mod 13 10
3
$)"15&3  '6/$5*0/4 5)"5 $"-- 5)&.4&-7&4 

)FSF JT XIBU ZPVS PVUQVU TIPVME MPPL JO UIF 3&1- XIFO JUƊT
XPSLJOH

Prelude> wordNumber 12324546


"one-two-three-two-four-five-four-six"
Prelude>

 %FƶOJUJPOT
 3FDVSTJPO JT B NFBOT PG DPNQVUJOH SFTVMUT UIBU NBZ SFRVJSF
BO JOEFƶOJUF BNPVOU PG XPSL UP PCUBJO UISPVHI UIF VTF PG
SFQFBUFE GVODUJPO BQQMJDBUJPO .PTU SFDVSTJWF GVODUJPOT
UIBU UFSNJOBUF PS PUIFSXJTF EP VTFGVM XPSL XJMM PǒFO IBWF
B DBTF UIBU DBMMT JUTFMG BOE B CBTF DBTF UIBU BDUT BT B CBDLTUPQ
PG TPSUT GPS UIF SFDVSTJPO

-- not recursive
lessOne :: Int -> Int
lessOne n = n - 1

-- recursive
zero :: Int -> Int
zero 0 = 0
zero n = zero (n - 1)
$IBQUFS 

-JTUT

*G UIF EPPST PG QFSDFQUJPO


XFSF DMFBOTFE FWFSZUIJOH
XPVME BQQFBS UP NBO BT JU
JT  JOƶOJUF

8JMMJBN #MBLF


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 -JTUT
-JTUT EP EPVCMF EVUZ JO )BTLFMM 5IF ƶSTU QVSQPTF MJTUT TFSWF
JT BT B XBZ UP SFGFS UP BOE QSPDFTT B DPMMFDUJPO PS QMVSBMJUZ PG
WBMVFT 5IF TFDPOE JT BT BO JOƶOJUF TFSJFT PG WBMVFT VTVBMMZ
HFOFSBUFE CZ B GVODUJPO XIJDI BMMPXT UIFN UP BDU BT B TUSFBN
EBUBUZQF
*O UIJT DIBQUFS XF XJMM

Ƒ FYQMBJO MJTUƊT EBUBUZQF BOE IPX UP QBUUFSO NBUDI PO MJTUT

Ƒ QSBDUJDF NBOZ TUBOEBSE MJCSBSZ GVODUJPOT GPS PQFSBUJOH


PO MJTUT

Ƒ MFBSO BCPVU UIF VOEFSMZJOH SFQSFTFOUBUJPOT PG MJTUT

Ƒ TFF XIBU UIBU SFQSFTFOUBUJPO NFBOT GPS UIFJS FWBMVBUJPO

Ƒ BOE EP B XIPMF CVODI PG FYFSDJTFT

 5IF MJTU EBUBUZQF


5IF MJTU EBUBUZQF JO )BTLFMM JT EFƶOFE MJLF UIJT

data [] a = [] | a : [a]

)FSF [] JT UIF UZQF DPOTUSVDUPS GPS MJTUT BT XFMM BT UIF EBUB


DPOTUSVDUPS GPS UIF FNQUZ MJTU 5IF [] EBUB DPOTUSVDUPS JT B
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

OVMMBSZ DPOTUSVDUPS CFDBVTF JU UBLFT OP BSHVNFOUT 5IF TFDPOE


EBUB DPOTUSVDUPS JO DPOUSBTU IBT BSHVNFOUT (:) JT BO JOƶY
PQFSBUPS VTVBMMZ DBMMFE ƉDPOTƊ TIPSU GPS DPOTUSVDU
 )FSF DPOT
UBLFT B WBMVF PG UZQF a BOE B MJTU PG UZQF [a] BOE FWBMVBUFT UP
[a]
8IFSFBT UIF MJTU EBUBUZQF BT B XIPMF JT B TVN UZQF BT XF DBO
UFMM GSPN UIF | JO UIF EFƶOJUJPO UIF TFDPOE EBUB DPOTUSVDUPS (:)
`cons` JT B QSPEVDU CFDBVTF JU UBLFT UXP BSHVNFOUT 3FNFNCFS
B TVN UZQF DBO CF SFBE BT BO ƌPSƍ BT JO UIF Bool EBUBUZQF XIFSF
ZPV HFU False PS True " QSPEVDU JT MJLF BO ƌBOEƍ 8FƊSF HPJOH
UP UBML NPSF BCPVU TVN BOE QSPEVDU UZQFT JO BOPUIFS DIBQUFS
CVU GPS OPX JU XJMM TVƸDF UP SFDPHOJ[F UIBU a : [a] DPOTUSVDUT
B WBMVF GSPN UXP BSHVNFOUT CZ BEEJOH UIF Ԑ UP UIF GSPOU PG
UIF MJTU [a] 5IF MJTU EBUBUZQF JT B TVN UZQF UIPVHI CFDBVTF
JU JT FJUIFS BO FNQUZ MJTU PS B TJOHMF WBMVF XJUI NPSF MJTU ƈ OPU
CPUI
*O &OHMJTI POF DBO SFBE UIJT BT

data [] a = [] | a : [a]
-- [1] [2] [3] [4] [5] [6]

 5IF EBUBUZQF XJUI UIF UZQF DPOTUSVDUPS []

 UBLFT B TJOHMF UZQF DPOTUSVDUPS BSHVNFOU ƉBƊ

 BU UIF UFSN MFWFM DBO CF DPOTUSVDUFE WJB

 OVMMBSZ DPOTUSVDUPS []
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 PS JU DBO CF DPOTUSVDUFE CZ

 EBUB DPOTUSVDUPS (:) XIJDI JT B QSPEVDU PG B WBMVF PG UIF


UZQF a XF NFOUJPOFE JO UIF UZQF DPOTUSVDUPS BOE B WBMVF
PG UZQF [a] UIBU JT ƌNPSF MJTUƍ

5IF DPOT DPOTUSVDUPS (:) JT BO JOƶY EBUB DPOTUSVDUPS BOE


HPFT CFUXFFO UIF UXP BSHVNFOUT a BOE [a] UIBU JU BDDFQUT 4JODF
JU UBLFT UXP BSHVNFOUT JU JT B QSPEVDU PG UIPTF UXP BSHVNFOUT
MJLF UIF UVQMF UZQF (a, b) 6OMJLF B UVQMF IPXFWFS UIJT DPO
TUSVDUPS JT SFDVSTJWF CFDBVTF JU NFOUJPOT JUT PXO UZQF [a] BT
POF PG UIF NFNCFST PG UIF QSPEVDU
*G ZPVƊSF BO FYQFSJFODFE QSPHSBNNFS PS UPPL B $4 DMBTT BU
TPNF QPJOU ZPV NBZ CF GBNJMJBS XJUI TJOHMZMJOLFE MJTUT 5IJT
JT B GBJS EFTDSJQUJPO PG UIF MJTU EBUBUZQF JO )BTLFMM BMUIPVHI
BWFSBHF DBTF QFSGPSNBODF JO TPNF TJUVBUJPOT DIBOHFT EVF
UP OPOTUSJDU FWBMVBUJPO IPXFWFS JU DBO DPOUBJO JOƶOJUF EBUB
XIJDI NBLFT JU BMTP XPSL BT B TUSFBN EBUBUZQF CVU POF UIBU IBT
UIF PQUJPO PG FOEJOH UIF TUSFBN XJUI UIF [] EBUB DPOTUSVDUPS

 1BUUFSO NBUDIJOH PO MJTUT


8F LOPX XF DBO QBUUFSO NBUDI PO EBUB DPOTUSVDUPST BOE UIF
EBUB DPOTUSVDUPST GPS MJTUT BSF OP FYDFQUJPOT )FSF XF NBUDI
PO UIF ƶSTU BSHVNFOU UP UIF JOƶY (:) DPOTUSVDUPS JHOPSJOH UIF
SFTU PG UIF MJTU BOE SFUVSO UIBU WBMVF
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

Prelude> let myHead (x : _) = x


Prelude> :t myHead
myHead :: [t] -> t
Prelude> myHead [1, 2, 3]
1

8F DBO EP UIF PQQPTJUF BT XFMM

Prelude> let myTail (_ : xs) = xs


Prelude> :t myTail
myTail :: [t] -> [t]
Prelude> myTail [1, 2, 3]
[2,3]

8F EP OFFE UP CF DBSFGVM XJUI GVODUJPOT MJLF UIFTF /FJUIFS


myHead OPS myTail IBT B DBTF UP IBOEMF BO FNQUZ MJTU ƈ JG XF USZ
UP QBTT UIFN BO FNQUZ MJTU BT BO BSHVNFOU UIFZ DBOƊU QBUUFSO
NBUDI

Prelude> myHead []
*** Exception:
Non-exhaustive patterns in function myHead

Prelude> myTail []
*** Exception:
Non-exhaustive patterns in function myTail
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

5IF QSPCMFN JT UIBU UIF UZQF [a] -> a PG myHead JT EFDFQUJWF


CFDBVTF UIF [a] UZQF EPFTOƊU HVBSBOUFF UIBU JUƊMM IBWF BO Ԑ WBMVF
*UƊT OPU HVBSBOUFFE UIBU UIF MJTU XJMM IBWF BU MFBTU POF WBMVF TP
myTail DBO GBJM BT XFMM 0OF QPTTJCJMJUZ JT QVUUJOH JO B CBTF DBTF

myTail :: [a] -> [a]


myTail [] = []
myTail (_ : xs) = xs

*O UIBU DBTF PVS GVODUJPO OPX FWBMVBUFT MJLF UIJT

Prelude> myTail [1..5]


[2,3,4,5]
Prelude> myTail []
[]

6TJOH .BZCF " CFUUFS XBZ UP IBOEMF UIJT TJUVBUJPO JT XJUI B


EBUBUZQF DBMMFE Maybe 8FƊMM TBWF B GVMM USFBUNFOU PG Maybe GPS
B MBUFS DIBQUFS CVU UIJT TIPVME HJWF ZPV TPNF JEFB PG IPX JU
XPSLT 5IF JEFB IFSF JT UIBU JU NBLFT ZPVS GBJMVSF DBTF FYQMJDJU
BOE BT QSPHSBNT HFU MPOHFS BOE NPSF DPNQMFY UIBU DBO CF
RVJUF VTFGVM
-FUƊT USZ BO FYBNQMF VTJOH Maybe XJUI myTail *OTUFBE PG
IBWJOH B CBTF DBTF UIBU SFUVSOT BO FNQUZ MJTU UIF GVODUJPO
XSJUUFO XJUI Maybe XPVME SFUVSO B SFTVMU PG Nothing "T XF DBO
TFF CFMPX UIF Maybe EBUBUZQF IBT UXP QPUFOUJBM WBMVFT Nothing
PS Just a
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

Prelude> :info Maybe


data Maybe a = Nothing | Just a

3FXSJUJOH myTail UP VTF Maybe JT GBJSMZ TUSBJHIUGPSXBSE

safeTail :: [a] -> Maybe [a]


safeTail [] = Nothing
safeTail (x:[]) = Nothing
safeTail (_:xs) = Just xs

/PUJDF UIBU PVS GVODUJPO JT TUJMM QBUUFSO NBUDIJOH PO UIF MJTU


8FƊWF NBEF UIF TFDPOE CBTF DBTF safeTail (x:[]) = Nothing UP
SFƷFDU UIF GBDU UIBU JG ZPVS MJTU IBT POMZ POF WBMVF JOTJEF JU JUT
UBJM JT BO FNQUZ MJTU *G ZPV MFBWF UIJT DBTF PVU UIFO UIJT GVODUJPO
XJMM SFUVSO Just [] GPS MJTUT UIBU IBWF POMZ B IFBE WBMVF 5BLF
B GFX NJOVUFT UP QMBZ BSPVOE XJUI UIJT BOE TFF IPX JU XPSLT
5IFO TFF JG ZPV DBO SFXSJUF UIF myHead GVODUJPO BCPWF VTJOH
Maybe
-BUFS JO UIF CPPL XFƊMM BMTP DPWFS B EBUBUZQF DBMMFE NonEmpty
XIJDI BMXBZT IBT BU MFBTU POF WBMVF BOE BWPJET UIF FNQUZ MJTU
QSPCMFN

 -JTUƊT TZOUBDUJD TVHBS


)BTLFMM IBT TPNF TZOUBDUJD TVHBS UP BDDPNNPEBUF UIF VTF PG
MJTUT TP UIBU ZPV DBO XSJUF
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

Prelude> [1, 2, 3] ++ [4]


[1, 2, 3, 4]

3BUIFS UIBO

Prelude> (1 : 2 : 3 : []) ++ 4 : []
[1,2,3,4]

5IF TZOUBDUJD TVHBS JT IFSF UP BMMPX CVJMEJOH MJTUT JO UFSNT


PG UIF TVDDFTTJWF BQQMJDBUJPOT PG ƉDPOTƊ (:) UP B WBMVF XJUIPVU
IBWJOH UP UFEJPVTMZ UZQF JU BMM PVU
8IFO XF UBML BCPVU MJTUT XF PǒFO UBML BCPVU UIFN JO UFSNT
PG ƌDPOT DFMMTƍ BOE TQJOFT 5IF TZOUBDUJD TVHBS PCTDVSFT UIJT
VOEFSMZJOH DPOTUSVDUJPO CVU MPPLJOH BU UIF EFTVHBSFE WFS
TJPO BCPWF NBZ NBLF JU NPSF DMFBS 5IF DPOT DFMMT BSF UIF
MJTU EBUBUZQFƊT TFDPOE EBUB DPOTUSVDUPS a : [a] UIF SFTVMU PG
SFDVSTJWFMZ QSFQFOEJOH B WBMVF UP ƌNPSF MJTUƍ 5IF DPOT DFMM JT
B DPODFQUVBM TQBDF UIBU WBMVFT NBZ JOIBCJU
5IF TQJOF JT UIF DPOOFDUJWF TUSVDUVSF UIBU IPMET UIF DPOT
DFMMT UPHFUIFS BOE JO QMBDF "T XF XJMM TPPO TFF UIJT TUSVDUVSF
OFTUT UIF DPOT DFMMT SBUIFS UIBO PSEFSJOH UIFN JO B SJHIUUP
MFǒ SPX #FDBVTF EJƵFSFOU GVODUJPOT NBZ USFBU UIF TQJOF BOE
UIF DPOT DFMMT EJƵFSFOUMZ JU JT JNQPSUBOU UP VOEFSTUBOE UIJT
VOEFSMZJOH TUSVDUVSF
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 6TJOH SBOHFT UP DPOTUSVDU MJTUT


5IFSF BSF TFWFSBM XBZT XF DBO DPOTUSVDU MJTUT 0OF PG UIF
TJNQMFTU JT XJUI SBOHFT 5IF CBTJD TZOUBY JT UP NBLF B MJTU UIBU
IBT UIF FMFNFOU ZPV XBOU UP TUBSU UIF MJTU GSPN GPMMPXFE CZ
UXP EPUT GPMMPXFE CZ UIF WBMVF ZPV XBOU BT UIF ƶOBM FMFNFOU
JO UIF MJTU )FSF BSF TPNF FYBNQMFT VTJOH UIF SBOHF TZOUBY
GPMMPXFE CZ UIF EFTVHBSFE FRVJWBMFOUT VTJOH GVODUJPOT GSPN
UIF Enum UZQFDMBTT

Prelude> [1..10]
[1,2,3,4,5,6,7,8,9,10]
Prelude> enumFromTo 1 10
[1,2,3,4,5,6,7,8,9,10]

Prelude> [1,2..10]
[1,2,3,4,5,6,7,8,9,10]
Prelude> enumFromThenTo 1 2 10
[1,2,3,4,5,6,7,8,9,10]

Prelude> [1,3..10]
[1,3,5,7,9]
Prelude> enumFromThenTo 1 3 10
[1,3,5,7,9]

Prelude> [2,4..10]
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

[2,4,6,8,10]
Prelude> enumFromThenTo 2 4 10
[2,4,6,8,10]

Prelude> ['t'..'z']
"tuvwxyz"
Prelude> enumFromTo 't' 'z'
"tuvwxyz"

5IF UZQFT PG UIF GVODUJPOT VOEFSMZJOH UIF SBOHF TZOUBY BSF

enumFrom :: Enum a => a -> [a]


enumFromThen :: Enum a => a -> a -> [a]

enumFromTo :: Enum a => a -> a -> [a]


enumFromThenTo :: Enum a => a -> a -> a -> [a]

"MM PG UIFTF GVODUJPOT SFRVJSF UIBU UIF UZQF CFJOH ƌSBOHFEƍ


IBWF BO JOTUBODF PG UIF Enum UZQFDMBTT 5IF ƶSTU UXP GVODUJPOT
enumFrom BOE enumFromThen HFOFSBUF MJTUT PG JOEFƶOJUF QPTTJCMZ
JOƶOJUF MFOHUI 'PS JU UP DSFBUF BO JOƶOJUFMZ MPOH MJTU ZPV
NVTU CF SBOHJOH PWFS B UZQF UIBU IBT OP VQQFS CPVOE JO JUT
FOVNFSBUJPO Integer JT TVDI B UZQF :PV DBO NBLF Integer
WBMVFT BT MBSHF BT ZPV IBWF NFNPSZ UP EFTDSJCF
#F BXBSF UIBU enumFromTo NVTU IBWF JUT ƶSTU BSHVNFOU CF
MPXFS UIBO UIF TFDPOE BSHVNFOU
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

Prelude> enumFromTo 3 1
[]
Prelude> enumFromTo 1 3
[1,2,3]

0UIFSXJTF ZPVƊMM KVTU HFU BO FNQUZ MJTU

&YFSDJTF &OVN'SPN5P
4PNF UIJOHT ZPVƊMM XBOU UP LOPX BCPVU UIF Enum UZQFDMBTT

Prelude> :info Enum


class Enum a where
succ :: a -> a
pred :: a -> a
toEnum :: Int -> a
fromEnum :: a -> Int
enumFrom :: a -> [a]
enumFromThen :: a -> a -> [a]
enumFromTo :: a -> a -> [a]
enumFromThenTo :: a -> a -> a -> [a]
Prelude> succ 0
1
Prelude> succ 1
2
Prelude> succ 'a'
'b'
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

8SJUF ZPVS PXO enumFromTo EFƶOJUJPOT GPS UIF UZQFT QSP


WJEFE %P OPU VTF SBOHF TZOUBY UP EP TP *U TIPVME SFUVSO UIF
TBNF SFTVMUT BT JG ZPV EJE [start..stop]

eftBool :: Bool -> Bool -> [Bool]


eftBool = undefined

eftOrd :: Ordering -> Ordering -> [Ordering]


eftOrd = undefined

eftInt :: Int -> Int -> [Int]


eftInt = undefined

eftChar :: Char -> Char -> [Char]


eftChar = undefined

 &YUSBDUJOH QPSUJPOT PG MJTUT


*O UIJT TFDUJPO XFƊMM UBLF B MPPL BU TPNF VTFGVM GVODUJPOT GPS
FYUSBDUJOH QPSUJPOT PG B MJTU BOE EJWJEJOH MJTUT JOUP QBSUT 5IF
ƶSTU UISFF GVODUJPOT IBWF TJNJMBS UZQF TJHOBUVSFT UBLJOH Int
BSHVNFOUT BOE BQQMZJOH UIFN UP B MJTU BSHVNFOU

take :: Int -> [a] -> [a]


drop :: Int -> [a] -> [a]
splitAt :: Int -> [a] -> ([a], [a])
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

8F IBWF TFFO FYBNQMFT PG TPNF PG UIF BCPWF GVODUJPOT JO


QSFWJPVT DIBQUFST CVU UIFZ BSF DPNNPO BOE VTFGVM FOPVHI
UIFZ EFTFSWF SFWJFX
5IF take GVODUJPO UBLFT UIF TQFDJƶFE OVNCFS PG FMFNFOUT
PVU PG B MJTU BOE SFUVSOT B MJTU DPOUBJOJOH KVTU UIPTF FMFNFOUT
"T ZPV DBO TFF JU UBLFT POF BSHVNFOU UIBU JT BO Int BOE BQQMJFT
UIBU UP B MJTU BSHVNFOU )FSFƊT IPX JU XPSLT

Prelude> take 7 ['a'..'z']


"abcdefg"

Prelude> take 3 [1..10]


[1,2,3]

Prelude> take 3 []
[]

/PUJDF UIBU XIFO XF QBTT JU BO FNQUZ MJTU BT BO BSHVNFOU JU


KVTU SFUVSOT BO FNQUZ MJTU 5IFTF MJTUT VTF UIF TZOUBDUJD TVHBS
GPS CVJMEJOH MJTUT XJUI SBOHFT 8F DBO BMTP VTF take XJUI B MJTU
CVJMEJOH GVODUJPO TVDI BT enumFrom 3FNJOEFS enumFrom DBO
HFOFSBUF BO JOƶOJUF MJTU JG UIF UZQF PG MJTU JOIBCJUBOUT JT TVDI
BT Integer BO JOƶOJUF TFU #VU BT MPOH BT XFƊSF POMZ UBLJOH B
DFSUBJO OVNCFS PG FMFNFOUT GSPN UIBU JU XPOƊU HFOFSBUF BO
JOƶOJUF MJTU

Prelude> take 10 (enumFrom 10)


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

[10,11,12,13,14,15,16,17,18,19]

5IF drop GVODUJPO JT TJNJMBS UP take CVU ESPQT UIF TQFDJƶFE


OVNCFS PG FMFNFOUT PƵ UIF CFHJOOJOH PG UIF MJTU "HBJO XF
DBO VTF JU XJUI SBOHFT PS MJTUCVJMEJOH GVODUJPOT

Prelude> drop 5 [1..10]


[6,7,8,9,10]

Prelude> drop 8 ['a'..'z']


"ijklmnopqrstuvwxyz"

Prelude> drop 4 []
[]

Prelude> drop 2 (enumFromTo 10 20)


[12,13,14,15,16,17,18,19,20]

5IF splitAt GVODUJPO DVUT B MJTU JOUP UXP QBSUT BU UIF FMFNFOU
TQFDJƶFE CZ UIF Int BOE NBLFT B UVQMF PG UXP MJTUT

Prelude> splitAt 5 [1..10]


([1,2,3,4,5],[6,7,8,9,10])

Prelude> splitAt 10 ['a'..'z']


("abcdefghij","klmnopqrstuvwxyz")
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

Prelude> splitAt 5 []
([],[])

Prelude> splitAt 3 (enumFromTo 5 15)


([5,6,7],[8,9,10,11,12,13,14,15])

5IF IJHIFSPSEFS GVODUJPOT takeWhile BOE dropWhile BSF B CJU


EJƵFSFOU BT ZPV DBO TFF GSPN UIF UZQF TJHOBUVSFT

takeWhile :: (a -> Bool) -> [a] -> [a]


dropWhile :: (a -> Bool) -> [a] -> [a]

4P UIFTF UBLF BOE ESPQ JUFNT PVU PG B MJTU UIBU NFFU TPNF
DPOEJUJPO BT XF DBO TFF GSPN UIF QSFTFODF PG Bool takeWhile
XJMM UBLF FMFNFOUT PVU PG B MJTU UIBU NFFU UIBU DPOEJUJPO BOE
UIFO TUPQ XIFO JU NFFUT UIF ƶSTU FMFNFOU UIBU EPFTOƊU TBUJTGZ
UIF DPOEJUJPO

Prelude> takeWhile (<3) [1..10]


[1,2]
-- Takes the elements that are less than 3

Prelude> takeWhile (<8) (enumFromTo 5 15)


[5,6,7]
-- Takes the elements that are less than 8

Prelude> takeWhile (>6) [1..10]


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

[]
-- It returns an empty list because it stops
-- taking as soon as the condition isn't met,
-- which in this case is the first element

Prelude> takeWhile (=='a') "abracadabra"


"a"

*O UIF ƶOBM FYBNQMF BCPWF XIZ EPFT JU POMZ SFUVSO B TJOHMF


Ԑ
'JOBMMZ XFƊMM MPPL BU dropWhile XIPTF CFIBWJPS JT QSPCBCMZ
QSFEJDUBCMF CBTFE PO UIF GVODUJPOT BOE UZQF TJHOBUVSFT XFƊWF
BMSFBEZ TFFO JO UIJT TFDUJPO 8F XJMM VTF UIF TBNF BSHVNFOUT
BT XF VTFE XJUI takeWhile TP UIF EJƵFSFODF CFUXFFO UIFN JT
FBTZ UP TFF

Prelude> dropWhile (<3) [1..10]


[3,4,5,6,7,8,9,10]

Prelude> dropWhile (<8) (enumFromTo 5 15)


[8,9,10,11,12,13,14,15]

Prelude> dropWhile (>6) [1..10]


[1,2,3,4,5,6,7,8,9,10]

Prelude> dropWhile (=='a') "abracadabra"


"bracadabra"
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

&YFSDJTFT 5IZ 'FBSGVM 4ZNNFUSZ


 6TJOH takeWhile BOE dropWhile XSJUF B GVODUJPO UIBU UBLFT B
TUSJOH BOE SFUVSOT B MJTU PG TUSJOHT VTJOH TQBDFT UP TFQBSBUF
UIF FMFNFOUT PG UIF TUSJOH JOUP XPSET BT JO UIF GPMMPXJOH
TBNQMF

*Main> myWords "all i wanna do is have some fun"


["all","i","wanna","do","is","have","some","fun"]

 /FYU XSJUF B GVODUJPO UIBU UBLFT B TUSJOH BOE SFUVSOT B MJTU


PG TUSJOHT VTJOH OFXMJOF TFQBSBUPST UP CSFBL VQ UIF TUSJOH
BT JO UIF GPMMPXJOH ZPVS KPC JT UP ƶMM JO UIF VOEFƶOFE
GVODUJPO


module PoemLines where

firstSen = "Tyger Tyger, burning bright\n"


secondSen = "In the forests of the night\n"
thirdSen = "What immortal hand or eye\n"
fourthSen = "Could frame thy fearful symmetry?"
sentences = firstSen ++ secondSen
++ thirdSen ++ fourthSen
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

-- putStrLn sentences -- should print


-- Tyger Tyger, burning bright
-- In the forests of the night
-- What immortal hand or eye
-- Could frame thy fearful symmetry?

-- Implement this
myLines :: String -> [String]
myLines = undefined

-- What we want 'myLines sentences' to equal


shouldEqual =
[ "Tyger Tyger, burning bright"
, "In the forests of the night"
, "What immortal hand or eye"
, "Could frame thy fearful symmetry?"
]

-- The main function here is a small test


-- to ensure you've written your function
-- correctly.
main :: IO ()
main =
print $ "Are they equal? "
++ show (myLines sentences == shouldEqual)
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 /PX MFUƊT MPPL BU XIBU UIPTF UXP GVODUJPOT IBWF JO DPN


NPO 5SZ XSJUJOH B OFX GVODUJPO UIBU QBSBNFUFSJ[FT UIF
DIBSBDUFS ZPVƊSF CSFBLJOH UIF TUSJOH BSHVNFOU PO BOE
SFXSJUF myWords BOE myLines VTJOH JU

 -JTU DPNQSFIFOTJPOT


-JTU DPNQSFIFOTJPOT BSF B NFBOT PG HFOFSBUJOH B OFX MJTU
GSPN B MJTU PS MJTUT 5IFZ DPNF EJSFDUMZ GSPN UIF DPODFQU PG
TFU DPNQSFIFOTJPOT JO NBUIFNBUJDT JODMVEJOH TJNJMBS TZOUBY
5IFZ NVTU IBWF BU MFBTU POF MJTU DBMMFE UIF HFOFSBUPS UIBU HJWFT
UIF JOQVU GPS UIF DPNQSFIFOTJPO UIBU JT QSPWJEFT UIF TFU PG
JUFNT GSPN XIJDI UIF OFX MJTU XJMM CF DPOTUSVDUFE 5IFZ NBZ
IBWF DPOEJUJPOT UP EFUFSNJOF XIJDI FMFNFOUT BSF ESBXO GSPN
UIF MJTU BOEPS GVODUJPOT BQQMJFE UP UIPTF FMFNFOUT
-FUƊT TUBSU CZ MPPLJOH BU B WFSZ TJNQMF FYBNQMF

[ x^2 | x <- [1..10]]


-- [1] [2] [ 3 ]

 5IJT JT UIF PVUQVU GVODUJPO UIBU XJMM BQQMZ UP UIF NFNCFST


PG UIF MJTU XF JOEJDBUF

 5IF QJQF IFSF EFTJHOBUFT UIF TFQBSBUJPO CFUXFFO UIF PVU


QVU GVODUJPO BOE UIF JOQVU

 5IJT JT UIF JOQVU TFU B HFOFSBUPS MJTU BOE B WBSJBCMF UIBU


SFQSFTFOUT UIF FMFNFOUT UIBU XJMM CF ESBXO GSPN UIBU MJTU
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

5IJT TBZT ƌGSPN B MJTU PG OVNCFST GSPN  UBLF (<-)


FBDI FMFNFOU BT BO JOQVU UP UIF PVUQVU GVODUJPOƍ

*O QMBJO &OHMJTI UIBU MJTU DPNQSFIFOTJPO XJMM QSPEVDF B


OFX MJTU UIBU JODMVEFT UIF TRVBSF PG FWFSZ OVNCFS GSPN  UP 

Prelude> [x^2 | x <- [1..10]]


[1,4,9,16,25,36,49,64,81,100]

/PX XFƊMM MPPL BU TPNF XBZT UP WBSZ XIBU FMFNFOUT BSF


ESBXO GSPN UIF HFOFSBUPS MJTU T


"EEJOH QSFEJDBUFT
-JTU DPNQSFIFOTJPOT DBO PQUJPOBMMZ UBLF QSFEJDBUFT UIBU MJNJU
UIF FMFNFOUT ESBXO GSPN UIF HFOFSBUPS MJTU 5IF QSFEJDBUFT
NVTU FWBMVBUF UP #PPM WBMVFT BT JO PUIFS DPOEJUJPOQMBDJOH
GVODUJPO UZQFT XFƊWF MPPLFE BU GPS FYBNQMF HVBSET
 5IFO UIF
JUFNT ESBXO GSPN UIF MJTU BOE QBTTFE UP UIF PVUQVU GVODUJPO
XJMM POMZ CF UIPTF UIBU NFU UIF 5SVF DBTF JO UIF QSFEJDBUF
'PS FYBNQMF MFUƊT TBZ XF XBOUFE B TJNJMBS MJTU DPNQSFIFO
TJPO BT XF VTFE BCPWF CVU UIJT UJNF XF XBOUFE PVS OFX MJTU UP
DPOUBJO UIF TRVBSFT PG POMZ UIF FWFO OVNCFST XIJMF JHOPSJOH
UIF PEET *O UIBU DBTF XF QVU B DPNNB BǒFS PVS HFOFSBUPS MJTU
BOE BEE UIF DPOEJUJPO

Prelude> [x^2 | x <- [1..10], rem x 2 == 0]


[4,16,36,64,100]
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

)FSF XFƊWF TQFDJƶFE UIBU UIF POMZ FMFNFOUT UP UBLF GSPN


UIF HFOFSBUPS MJTU BT ԧ BSF UIPTF UIBU XIFO EJWJEFE CZ  IBWF
B SFNBJOEFS PG [FSP ƈ UIBU JT FWFO OVNCFST
8F DBO BMTP XSJUF MJTU DPNQSFIFOTJPOT UIBU IBWF NVMUJQMF
HFOFSBUPST 0OF UIJOH UP OPUF JT UIBU UIF SJHIUNPTU HFOFSBUPS
XJMM CF FYIBVTUFE ƶSTU UIFO UIF TFDPOE SJHIUNPTU BOE TP PO
'PS FYBNQMF MFUƊT TBZ ZPV XBOUFE UP NBLF B MJTU PG ԧ UP
UIF Ԩ QPXFS JOTUFBE PG TRVBSJOH BMM PG UIFN BT XF EJE BCPWF
4FQBSBUF UIF UXP JOQVUT XJUI B DPNNB BT CFMPX

Prelude> [x^y | x <- [1..5], y <- [2, 3]]


[1,1,4,8,9,27,16,64,25,125]

8IFO XF FYBNJOF UIF SFTVMUJOH MJTU XF TFF UIBU JU JT FBDI


ԧ WBMVF ƶSTU UP UIF TFDPOE QPXFS BOE UIFO UP UIF UIJSE QPXFS
GPMMPXFE CZ UIF OFYU ԧ WBMVF UP UIF TFDPOE BOE UIFO UP UIF
UIJSE BOE TP PO FOEJOH XJUI UIF SFTVMU PG ? BOE ? 8F BSF
BQQMZJOH UIF GVODUJPO UP FBDI QPTTJCMF QBJSJOH PG WBMVFT GSPN
UIF UXP MJTUT XFƊSF CJOEJOH WBMVFT PVU PG *U CFHJOT CZ USZJOH
UP HFU B WBMVF PVU PG UIF MFǒNPTU HFOFSBUPS GSPN XIJDI XFƊSF
HFUUJOH ԧ
8F DPVME QVU B DPOEJUJPO PO UIBU UPP -FUƊT TBZ XF POMZ
XBOU UP SFUVSO UIF MJTU PG WBMVFT UIBU BSF MFTT UIBO  8F BEE
BOPUIFS DPNNB BOE XSJUF PVS QSFEJDBUF

Prelude> [x^y | x <- [1..10], y <- [2, 3], x^y < 200]
[1,1,4,8,9,27,16,64,25,125,36,49,64,81,100]
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

8F DBO VTF NVMUJQMF HFOFSBUPST UP UVSO UXP MJTUT JOUP B MJTU


PG UVQMFT DPOUBJOJOH UIPTF FMFNFOUT BT XFMM 5IF HFOFSBUPS
MJTUT EPOƊU FWFO IBWF UP CF PG UIF TBNF MFOHUI PS EVF UP UIF
OBUVSF PG UIF UVQMF UZQF FWFO UIF TBNF UZQF

Prelude> [(x, y) | x <- [1, 2, 3], y <- [6, 7]]


[(1,6),(1,7),(2,6),(2,7),(3,6),(3,7)]

Prelude> [(x, y) | x <- [1, 2, 3], y <- ['a', 'b']]


[(1,'a'),(1,'b'),(2,'a'),(2,'b'),(3,'a'),(3,'b')]

"HBJO UIF QBUUFSO JT UIBU JU HFOFSBUFT FWFSZ QPTTJCMF UVQMF


GPS UIF ƶSTU ԧ WBMVF UIFO JU NPWFT UP UIF OFYU ԧ WBMVF BOE TP
PO
3FDBMM UIBU UIF ƶSTU MJTU DPNQSFIFOTJPO XF MPPLFE BU HFO
FSBUFE B MJTU PG BMM UIF WBMVFT PG ԧ? XIFO ԧ JT B OVNCFS GSPN
 -FUƊT TBZ ZPV XBOUFE UP VTF UIBU MJTU JO BOPUIFS MJTU DPN
QSFIFOTJPO 'JSTU ZPVƊE XBOU UP HJWF UIBU MJTU B OBNF -FUƊT DBMM
JU ƌNZ4RSƍ

Prelude> let mySqr = [x^2 | x <- [1..5]]

/PX XF DBO VTF UIBU MJTU BT UIF HFOFSBUPS GPS BOPUIFS MJTU
DPNQSFIFOTJPO )FSF XF XJMM MJNJU PVS JOQVU WBMVFT UP UIPTF
UIBU BSF MFTT UIBO  GPS UIF TBLF PG CSFWJUZ

Prelude> let mySqr = [x^2 | x <- [1..5]]


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

Prelude> [(x, y) | x <- mySqr, y <- [1..3], x < 4]


[(1,1),(1,2),(1,3)]

&YFSDJTFT $PNQSFIFOE 5IZ -JTUT


5BLF B MPPL BU UIF GPMMPXJOH GVODUJPOT ƶHVSF XIBU ZPV UIJOL
UIF PVUQVU MJTUT XJMM CF BOE UIFO SVO UIFN JO ZPVS 3&1- UP
WFSJGZ OPUF UIBU ZPV XJMM OFFE UIF mySqr MJTU GSPN BCPWF JO
TDPQF UP EP UIJT


[x | x <- mySqr, rem x 2 == 0]

[(x, y) | x <- mySqr, y <- mySqr, x < 50, y > 50]

take 5 [ (x, y) | x <- mySqr


, y <- mySqr, x < 50, y > 50 ]

-JTU DPNQSFIFOTJPOT XJUI 4USJOHT


*UƊT XPSUI SFNFNCFSJOH UIBU TUSJOHT BSF MJTUT TP MJTU DPNQSFIFO
TJPOT DBO BMTP CF VTFE XJUI TUSJOHT 8FƊSF HPJOH UP JOUSPEVDF
B TUBOEBSE GVODUJPO DBMMFE elem UIBU UFMMT ZPV XIFUIFS BO FM
FNFOU JT JO B MJTU PS OPU *U FWBMVBUFT UP B Bool WBMVF TP JU JT
VTFGVM BT B QSFEJDBUF JO MJTU DPNQSFIFOTJPOT

Prelude> :t elem

3FNJOEFS QSFUFOE Foldable JO UIF UZQF PG elem NFBOT JUƊT B MJTU VOUJM XF DPWFS Foldable
MBUFS
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

elem :: Eq a => a -> [a] -> Bool


Prelude> elem 'a' "abracadabra"
True
Prelude> elem 'a' "Julie"
False

*O UIF ƶSTU DBTF ƉBƊ JT BO FMFNFOU PG ƌBCSBDBEBCSBƍ TP UIBU


FWBMVBUFT UP True CVU JO UIF TFDPOE DBTF UIFSF JT OP ƉBƊ JO
ƌ+VMJFƍ TP XF HFU B False SFTVMU "T ZPV DBO TFF GSPN UIF UZQF
TJHOBUVSF elem EPFTOƊU POMZ XPSL XJUI DIBSBDUFST BOE TUSJOHT
CVU UIBUƊT XIBU XFƊMM VTF JU GPS IFSF -FUƊT TFF JG XF DBO XSJUF B
MJTU DPNQSFIFOTJPO UP SFNPWF BMM UIF MPXFSDBTF MFUUFST GSPN
B TUSJOH )FSF PVS DPOEJUJPO JT UIBU XF POMZ XBOU UP UBLF ԧ
GSPN PVS HFOFSBUPS MJTU XIFO JU NFFUT UIF DPOEJUJPO UIBU JU JT
BO FMFNFOU PG UIF MJTU PG DBQJUBM MFUUFST

Prelude> [x | x <- "Three Letter Acronym", elem x ['A'..'Z']]


"TLA"

-FUƊT TFF JG XF DBO OPX HFOFSBMJ[F UIJT JOUP BO BDSPOZN


HFOFSBUPS UIBU XJMM BDDFQU EJƵFSFOU TUSJOHT BT JOQVUT JOTUFBE PG
GPSDJOH VT UP SFXSJUF UIF XIPMF MJTU DPNQSFIFOTJPO GPS FWFSZ
TUSJOH XF NJHIU XBOU UP GFFE JU 8F XJMM EP UIJT CZ OBNJOH
B GVODUJPO UIBU XJMM UBLF POF BSHVNFOU BOE VTF UIBU BT UIF
HFOFSBUPS TUSJOH GPS PVS MJTU DPNQSFIFOTJPO 4P UIF GVODUJPO
BSHVNFOU BOE UIF HFOFSBUPS TUSJOH XJMM OFFE UP CF UIF TBNF
UIJOH
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

Prelude> let acro xs = [x | x <- xs, elem x ['A'..'Z']]

8F VTF ԧԢ GPS PVS GVODUJPO BSHVNFOU UP JOEJDBUF UP PVSTFMWFT


UIBU JUƊT B MJTU UIBU UIF ԧ JT QMVSBM *U EPFTOƊU IBWF UP CF ZPV
DPVME VTF B EJƵFSFOU WBSJBCMF UIFSF BOE PCUBJO UIF TBNF SFTVMU
*U JT JEJPNBUJD UP VTF B ƌQMVSBMƍ WBSJBCMF GPS MJTU BSHVNFOUT CVU
JU JT OPU OFDFTTBSZ
"MM SJHIU TP XF IBWF PVS acro GVODUJPO XJUI XIJDI XF DBO
HFOFSBUF BDSPOZNT GSPN BOZ TUSJOH

Prelude> acro "Self Contained Underwater Breathing Apparatus"


"SCUBA"
Prelude> acro "National Aeronautics and Space Administration"
"NASA"

(JWFO UIF BCPWF XIBU EP ZPV UIJOL UIJT GVODUJPO XPVME EP

Prelude> let myString xs = [x | x <- xs, elem x "aeiou"]

&YFSDJTFT 4RVBSF $VCF


(JWFO UIF GPMMPXJOH

Prelude> let mySqr = [x^2 | x <- [1..5]]


Prelude> let myCube = [y^3 | y <- [1..5]]

 'JSTU XSJUF BO FYQSFTTJPO UIBU XJMM NBLF UVQMFT PG UIF PVU


QVUT PG mySqr BOE myCube
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 /PX BMUFS UIBU FYQSFTTJPO TP UIBU JU POMZ VTFT UIF Y BOE Z


WBMVFT UIBU BSF MFTT UIBO 

 "QQMZ BOPUIFS GVODUJPO UP UIBU MJTU DPNQSFIFOTJPO UP


EFUFSNJOF IPX NBOZ UVQMFT JOIBCJU ZPVS PVUQVU MJTU

 4QJOFT BOE OPOTUSJDU FWBMVBUJPO


"T XF IBWF TFFO MJTUT BSF B SFDVSTJWF TFSJFT PG DPOT DFMMT a : [a]
UFSNJOBUFE CZ UIF FNQUZ MJTU [] CVU XF XBOU B XBZ UP WJTV
BMJ[F UIJT TUSVDUVSF JO PSEFS UP VOEFSTUBOE UIF XBZT MJTUT HFU
QSPDFTTFE 8IFO XF UBML BCPVU EBUB TUSVDUVSFT JO )BTLFMM QBS
UJDVMBSMZ MJTUT TFRVFODFT BOE USFFT XF UBML BCPVU UIFN IBWJOH
B TQJOF 5IJT JT UIF DPOOFDUJWF TUSVDUVSF UIBU UJFT UIF DPMMFDUJPO
PG WBMVFT UPHFUIFS *O UIF DBTF PG B MJTU UIF TQJOF JT VTVBMMZ UFY
UVBMMZ SFQSFTFOUFE CZ UIF SFDVSTJWF DPOT (:) PQFSBUPST (JWFO
UIF EBUB [1, 2, 3] XF HFU B MJTU UIBU MPPLT MJLF

1 : 2 : 3 : []
or
1 : (2 : (3 : []))

:
/ \
1 :
/ \
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

2 :
/ \
3 []

5IF QSPCMFN XJUI UIF 1 : (2 : (3 : [])) SFQSFTFOUBUJPO XF


VTFE FBSMJFS JT UIBU JU NBLFT JU TFFN MJLF UIF WBMVF 1 FYJTUT
ƌCFGPSFƍ UIF DPOT (:) DFMM UIBU DPOUBJOT JU CVU BDUVBMMZ UIF DPOT
DFMMT DPOUBJO UIF WBMVFT #FDBVTF PG UIJT BOE UIF XBZ OPOTUSJDU
FWBMVBUJPO XPSLT ZPV DBO FWBMVBUF DPOT DFMMT JOEFQFOEFOUMZ
PG XIBU UIFZ DPOUBJO *U JT QPTTJCMF UP FWBMVBUF KVTU UIF TQJOF PG
UIF MJTU XJUIPVU FWBMVBUJOH JOEJWJEVBM WBMVFT *U JT BMTP QPTTJCMF
UP FWBMVBUF POMZ QBSU PG UIF TQJOF PG B MJTU BOE OPU UIF SFTU PG JU
&WBMVBUJPO PG UIF MJTU JO UIJT SFQSFTFOUBUJPO QSPDFFET EPXO
UIF TQJOF $POTUSVDUJOH UIF MJTU XIFO UIBU JT OFDFTTBSZ IPX
FWFS QSPDFFET VQ UIF TQJOF *O UIF FYBNQMF BCPWF UIFO XF
TUBSU XJUI BO JOƶY PQFSBUPS FWBMVBUF UIF BSHVNFOUT  BOE B
OFX DPOT DFMM BOE QSPDFFE EPXOXBSE UP UIF  BOE FNQUZ MJTU
#VU XIFO XF OFFE UP CVJME UIF MJTU UP QSJOU JU JO UIF 3&1- GPS
FYBNQMF JU QSPDFFET GSPN UIF CPUUPN PG UIF MJTU VQ UIF TQJOF
ƶSTU QVUUJOH UIF  JOUP UIF FNQUZ MJTU UIFO BEEJOH UIF  UP
UIF GSPOU PG UIBU MJTU UIFO ƶOBMMZ QVUUJOH UIF  JO UIF GSPOU PG
UIBU #FDBVTF )BTLFMMƊT FWBMVBUJPO JT OPOTUSJDU UIF MJTU JTOƊU DPO
TUSVDUFE VOUJM JUƊT DPOTVNFE ƈ JOEFFE OPUIJOH JT FWBMVBUFE
VOUJM JU NVTU CF 6OUJM JUƊT DPOTVNFE PS ZPV GPSDF TUSJDUOFTT
JO TPNF XBZ UIFSF BSF B TFSJFT PG QMBDFIPMEFST BT B CMVFQSJOU
PG UIF MJTU UIBU DBO CF DPOTUSVDUFE XIFO JUƊT OFFEFE 8FƊMM UBML
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

NPSF BCPVU OPOTUSJDUOFTT TPPO


8FƊSF HPJOH UP CSJOH વ PS CPUUPN CBDL JO UIF GPSN PG undefined
JO PSEFS UP EFNPOTUSBUF TPNF PG UIF FƵFDUT PG OPOTUSJDU FWBMV
BUJPO )FSF XFƊSF HPJOH UP VTF _ UP TZOUBDUJDBMMZ TJHOJGZ WBMVFT
XF BSF JHOPSJOH BOE OPU FWBMVBUJOH 5IF VOEFSTDPSFT SFQSF
TFOU UIF WBMVFT DPOUBJOFE CZ UIF DPOT DFMMT 5IF TQJOF JT UIF
SFDVSTJWF TFSJFT PG DPOT DPOTUSVDUPST TJHOJƶFE CZ (:) BT ZPV
DBO TFF CFMPX

: <------|
/ \ |
_ : <----| This is the "spine"
/ \ |
_ : <--|
/ \
_ []

:PVƊMM TFF UIF UFSN ƉTQJOFƊ VTFE JO SFGFSFODF UP EBUB TUSVD


UVSFT TVDI BT USFFT UIBU BSFOƊU MJTUT *O UIF DBTF PG MJTU UIF TQJOF
JT B MJOFBS TVDDFTTJPO PG POF DPOT DFMM XSBQQJOH BOPUIFS DPOT
DFMM 8JUI EBUB TUSVDUVSFT MJLF USFFT XIJDI XF XJMM DPWFS MBUFS
ZPVƊMM TFF UIBU UIF TQJOF DBO CF OPEFT UIBU DPOUBJO  PS NPSF
OPEFT
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

6TJOH ()$JƊT TQSJOU DPNNBOE


8F DBO VTF B TQFDJBM DPNNBOE JO ()$J DBMMFE sprint UP QSJOU
WBSJBCMFT BOE TFF XIBU IBT CFFO FWBMVBUFE BMSFBEZ XJUI UIF VO
EFSTDPSF SFQSFTFOUJOH FYQSFTTJPOT UIBU IBWFOƊU CFFO FWBMVBUFE
ZFU
" XBSOJOH 8F BMXBZT FODPVSBHF ZPV UP FYQFSJNFOU BOE
FYQMPSF GPS ZPVSTFMG BǒFS TFFJOH UIF FYBNQMFT JO UIJT CPPL CVU
:sprint IBT TPNF CFIBWJPSBM RVJSLT UIBU DBO CF B CJU GSVTUSBUJOH
()$ )BTLFMM IBT TPNF PQQPSUVOJTUJD PQUJNJ[BUJPOT XIJDI
JOUSPEVDF TUSJDUOFTT UP NBLF DPEF GBTUFS XIFO JU XPOƊU DIBOHF
IPX ZPVS DPEF FWBMVBUFT "EEJUJPOBMMZ QPMZNPSQIJTN NFBOT
WBMVFT MJLF Num a => a BSF SFBMMZ XBJUJOH GPS B TPSU PG BSHVNFOU
XIJDI XJMM NBLF JU DPODSFUF UIJT XJMM CF DPWFSFE JO NPSF EFUBJM
JO B MBUFS DIBQUFS
 5P BWPJE UIJT ZPV IBWF UP BTTJHO B NPSF
DPODSFUF UZQF TVDI BT Int PS Double PUIFSXJTF JU TUBZT VOFWBM
VBUFE _ JO :sprintƊT PVUQVU *G ZPV DBO LFFQ UIFTF DBWFBUT UP
:sprintƊT CFIBWJPS JO NJOE JU DBO CF VTFGVM 0UIFSXJTF JG ZPV
ƶOE JU DPOGVTJOH EPOƊU TXFBU JU BOE XBJU GPS VT UP FMBCPSBUF
NPSF EFFQMZ JO UIF DIBQUFS PO OPOTUSJDUOFTT
-FUƊT EFƶOF B MJTU VTJOH enumFromTo XIJDI JT UBOUBNPVOU UP
VTJOH TZOUBY MJLF ['a'..'z'] UIFO BTL GPS UIF TUBUF PG blah XJUI
SFTQFDU UP XIFUIFS JU IBT CFFO FWBMVBUFE

Prelude> let blah = enumFromTo 'a' 'z'


Prelude> :sprint blah
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

blah = _

5IF blah = _ JOEJDBUFT UIBU blah JT UPUBMMZ VOFWBMVBUFE


/FYU XFƊMM UBLF POF WBMVF GSPN blah BOE UIFO FWBMVBUF JU CZ
GPSDJOH ()$J UP QSJOU UIF FYQSFTTJPO

Prelude> take 1 blah


"a"
Prelude> :sprint blah
blah = 'a' : _

4P XFƊWF FWBMVBUFE B DPOT DFMM : BOE UIF ƶSTU WBMVF 'a'


5IFO XF UBLF UXP WBMVFT BOE QSJOU UIFN ƈ XIJDI GPSDFT
FWBMVBUJPO PG UIF TFDPOE DPOT DFMM BOE UIF TFDPOE WBMVF

Prelude> take 2 blah


"ab"
Prelude> :sprint blah
blah = 'a' : 'b' : _

"TTVNJOH UIJT JT B DPOUJHVPVT ()$J TFTTJPO UIF ƶSTU DPOT


DFMM BOE WBMVF XFSF BMSFBEZ GPSDFE
8F DBO LFFQ HPJOH XJUI UIJT FWBMVBUJOH UIF MJTU POF WBMVF
BU B UJNF

Prelude> take 3 blah


"abc"
Prelude> :sprint blah
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

blah = 'a' : 'b' : 'c' : _

5IF length GVODUJPO JT POMZ TUSJDU JO UIF TQJOF NFBOJOH JU


POMZ GPSDFT FWBMVBUJPO PG UIF TQJOF PG B MJTU OPU UIF WBMVFT
TPNFUIJOH XF DBO TFF JG XF USZ UP ƶOE UIF MFOHUI PG B MJTU PG
VOEFƶOFE WBMVFT #VU XIFO XF VTF length PO blah :sprint XJMM
CFIBWF BT UIPVHI XF IBE GPSDFE FWBMVBUJPO PG UIF WBMVFT BT
XFMM

Prelude> length blah


26
Prelude> :sprint blah
blah = "abcdefghijklmnopqrstuvwxyz"

5IBU UIF JOEJWJEVBM DIBSBDUFST XFSF TIPXO BT FWBMVBUFE


BOE OPU FYDMVTJWFMZ UIF TQJOF BǒFS HFUUJOH UIF MFOHUI PG blah JT
POF PG UIF VOGPSUVOBUF BGPSFNFOUJPOFE RVJSLT PG IPX ()$J
FWBMVBUFT DPEF

4QJOFT BSF FWBMVBUFE JOEFQFOEFOUMZ PG WBMVFT


7BMVFT JO )BTLFMM HFU SFEVDFE UP XFBL IFBE OPSNBM GPSN CZ
EFGBVMU #Z ƉOPSNBM GPSNƊ XF NFBO UIBU UIF FYQSFTTJPO JT GVMMZ
FWBMVBUFE Ɖ8FBL IFBE OPSNBM GPSNƊ NFBOT UIF FYQSFTTJPO JT
POMZ FWBMVBUFE BT GBS BT JT OFDFTTBSZ UP SFBDI B EBUB DPOTUSVDUPS
8FBL IFBE OPSNBM GPSN 8)/'
JT B MBSHFS TFU BOE DPO
UBJOT CPUI UIF QPTTJCJMJUZ UIBU UIF FYQSFTTJPO JT GVMMZ FWBMV
BUFE OPSNBM GPSN
BOE UIF QPTTJCJMJUZ UIBU UIF FYQSFTTJPO IBT
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

CFFO FWBMVBUFE UP UIF QPJOU PG BSSJWJOH BU B EBUB DPOTUSVDUPS PS


MBNCEB BXBJUJOH BO BSHVNFOU 'PS BO FYQSFTTJPO JO XFBL IFBE
OPSNBM GPSN GVSUIFS FWBMVBUJPO NBZ CF QPTTJCMF PODF BOPUIFS
BSHVNFOU JT QSPWJEFE *G OP GVSUIFS JOQVUT BSF QPTTJCMF UIFO
JU JT TUJMM JO 8)/' CVU BMTP JO OPSNBM GPSN /'
 8FƊSF HPJOH
UP FYQMBJO UIJT NPSF GVMMZ MBUFS JO UIF CPPL JO UIF DIBQUFS PO
OPOTUSJDUOFTT XIFO XF TIPX ZPV IPX DBMMCZOFFE XPSLT BOE
UIF JNQMJDBUJPOT GPS )BTLFMM 'PS OPX XFƊMM KVTU MPPL BU B GFX
FYBNQMFT UP HFU B TFOTF GPS XIBU NJHIU CF HPJOH PO
#FMPX XF MJTU TPNF FYQSFTTJPOT BOE XIFUIFS UIFZ BSF JO
8)/' /' CPUI PS OFJUIFS

(1, 2) -- WHNF & NF

5IJT ƶSTU FYBNQMF JT JO OPSNBM GPSN BOE JT GVMMZ FWBMVBUFE


"OZUIJOH JO OPSNBM GPSN JT CZ EFƶOJUJPO BMTP JO XFBL IFBE
OPSNBM GPSN CFDBVTF XFBL IFBE JT BO FYQSFTTJPO XIJDI JT
FWBMVBUFE VQ UP BU MFBTU UIF ƶSTU EBUB DPOTUSVDUPS /PSNBM GPSN
FYDFFET UIBU CZ SFRVJSJOH UIBU BMM TVCFYQSFTTJPOT CF GVMMZ
FWBMVBUFE )FSF UIF DPNQPOFOUT PG UIF WBMVF BSF UIF UVQMF
EBUB DPOTUSVDUPS BOE UIF WBMVFT  BOE 

(1, 1 + 1)

5IJT FYBNQMF JT JO 8)/' CVU OPU /' 5IF (+) BQQMJFE UP


JUT BSHVNFOUT DPVME CF FWBMVBUFE CVU IBTOƊU CFFO ZFU

\x -> x * 10 -- WHNF & NF


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

5IJT BOPOZNPVT GVODUJPO JT JO OPSNBM GPSN CFDBVTF XIJMF


(*) IBT CFFO BQQMJFE UP UXP BSHVNFOUT PG B TPSU JU DBOOPU CF
SFEVDFE GVSUIFS VOUJM UIF PVUFS x -> ... IBT CFFO BQQMJFE
8JUI OPUIJOH GVSUIFS UP SFEVDF JU JT JO OPSNBM GPSN

"Papu" ++ "chon"

5IJT TUSJOH DPODBUFOBUJPO JT JO OFJUIFS 8)/' OPS /' UIJT


JT CFDBVTF UIF ƌPVUFSNPTUƍ DPNQPOFOU PG UIF FYQSFTTJPO JT B
GVODUJPO (++) XIPTF BSHVNFOUT BSF GVMMZ BQQMJFE CVU JU IBTOƊU
CFFO FWBMVBUFE 8IFSFBT UIF GPMMPXJOH XPVME CF JO 8)/'
CVU OPU /'

(1, "Papu" ++ "chon")

8IFO XF EFƶOF B MJTU BOE EFƶOF BMM JUT WBMVFT JU JT JO /'


BOE BMM JUT WBMVFT BSF LOPXO 5IFSFƊT OPUIJOH MFǒ UP FWBMVBUF
BU UIBU QPJOU TVDI BT JO UIF GPMMPXJOH FYBNQMF

Prelude> let num :: [Int]; num = [1, 2, 3]


Prelude> :sprint num
num = [1,2,3]

8F DBO BMTP DPOTUSVDU B MJTU UISPVHI SBOHFT PS GVODUJPOT


*O UIJT DBTF UIF MJTU JT JO 8)/' CVU OPU /' 5IF DPNQJMFS
POMZ FWBMVBUFT UIF IFBE PS ƶSTU OPEF PG UIF HSBQI CVU KVTU UIF
DPOT DPOTUSVDUPS OPU UIF WBMVF PS SFTU PG UIF MJTU JU DPOUBJOT
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

8F LOPX UIFSFƊT B WBMVF PG UZQF Ԑ JO UIF DPOT DFMM XF IBWFOƊU


FWBMVBUFE BOE B ƌSFTU PG MJTUƍ XIJDI NJHIU FJUIFS CF UIF FNQUZ
MJTU [] XIJDI FOET UIF MJTU PS BOPUIFS DPOT DFMM ƈ XF EPOƊU LOPX
XIJDI CFDBVTF XF IBWFOƊU FWBMVBUFE UIF OFYU [a] WBMVF ZFU 8F
TBX UIBU BCPWF JO UIF :sprint TFDUJPO BOE ZPV DBO TFF UIBU
FWBMVBUJPO PG UIF ƶSTU WBMVFT EPFT OPU GPSDF FWBMVBUJPO PG UIF
SFTU PG UIF MJTU

Prelude> let myNum :: [Int]; myNum = [1..10]


Prelude> :sprint myNum
myNum = _
Prelude> take 2 myNum
[1,2]
Prelude> :sprint myNum
myNum = 1 : 2 : _

5IJT JT BO FYBNQMF PG 8)/' FWBMVBUJPO *UƊT XFBL IFBE


OPSNBM GPSN CFDBVTF UIF MJTU IBT UP CF DPOTUSVDUFE CZ UIF
SBOHF BOE JUƊT POMZ HPJOH UP FWBMVBUF BT GBS BT JU IBT UP 8JUI
take 2 XF POMZ OFFE UP FWBMVBUF UIF ƶSTU UXP DPOT DFMMT BOE
UIF WBMVFT UIFZ DPOUBJO XIJDI JT XIZ XIFO XF VTFE :sprint
XF POMZ TBX 1 : 2 : _ &WBMVBUJOH UP OPSNBM GPSN XPVMEƊWF
NFBOU SFDVSTJOH UISPVHI UIF FOUJSF MJTU GPSDJOH OPU POMZ UIF
FOUJSF TQJOF CVU BMTP UIF WBMVFT FBDI DPOT DFMM DPOUBJOFE
*O UIFTF USFF SFQSFTFOUBUJPOT FWBMVBUJPO PS DPOTVNQUJPO PG
UIF MJTU HPFT EPXO UIF TQJOF 5IF GPMMPXJOH JT B SFQSFTFOUBUJPO
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

PG B MJTU UIBU JTOƊU TQJOF TUSJDU BOE JT BXBJUJOH TPNFUIJOH UP GPSDF


UIF FWBMVBUJPO

:
/ \
_ _

#Z EFGBVMU JU TUPQT IFSF BOE OFWFS FWBMVBUFT FWFO UIF ƶSTU


DPOT DFMM VOMFTT JUƊT GPSDFE UP BT XF TBX
)PXFWFS GVODUJPOT UIBU BSF TQJOF TUSJDU DBO GPSDF DPNQMFUF
FWBMVBUJPO PG UIF TQJOF PG UIF MJTU FWFO JG UIFZ EPOƊU GPSDF FWBM
VBUJPO PG FBDI WBMVF 1BUUFSO NBUDIJOH JT TUSJDU CZ EFGBVMU TP
QBUUFSO NBUDIJOH PO DPOT DFMMT DBO NFBO GPSDJOH TQJOF TUSJDU
OFTT JG ZPVS GVODUJPO EPFTOƊU TUPQ SFDVSTJOH UIF MJTU *U DBO
FWBMVBUF UIF TQJOF POMZ PS UIF TQJOF BT XFMM BT UIF WBMVFT UIBU
JOIBCJU FBDI DPOT DFMM EFQFOEJOH PO DPOUFYU
0O UIF PUIFS IBOE length JT TUSJDU JO UIF TQJOF CVU OPU UIF
WBMVFT *G XF EFƶOFE B MJTU TVDI BT [1, 2, 3] VTJOH length PO JU
XPVME GPSDF FWBMVBUJPO PG UIF FOUJSF TQJOF XJUIPVU BDDPNQB
OZJOH TUSJDUOFTT JO UIF WBMVFT

:
/ \
_ :
/ \
_ :
/ \
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

_ []

8F DBO TFF UIJT JG XF VTF length CVU NBLF POF PG UIF WBMVFT
CPUUPN XJUI UIF undefined WBMVF BOE TFF XIBU IBQQFOT

Prelude> let x = [1, undefined, 3]


Prelude> length x
3

5IF ƶSTU BOE UIJSE WBMVFT JO UIF MJTU XFSF OVNCFST CVU UIF
TFDPOE WBMVF XBT undefined BOE length EJEOƊU NBLF JU DSBTI
8IZ #FDBVTF length NFBTVSFT UIF MFOHUI PG B MJTU XIJDI POMZ
SFRVJSFT SFDVSTJOH UIF TQJOF BOE DPVOUJOH IPX NBOZ DPOT DFMMT
UIFSF BSF 8F DPVME EFƶOF PVS PXO length GVODUJPO PVSTFMWFT
MJLF TP

-- *Not* identical to the length function in Prelude


length :: [a] -> Integer
length [] = 0
length (_:xs) = 1 + length xs

0OF UIJOH UP OPUF JT UIBU XF VTF _ UP JHOPSF UIF WBMVFT JO PVS


BSHVNFOUT PS UIBU BSF QBSU PG B QBUUFSO NBUDI *O UIJT DBTF XF
QBUUFSONBUDIFE PO UIF (:) EBUB DPOTUSVDUPS CVU XBOUFE UP
JHOPSF UIF WBMVF XIJDI JT UIF ƶSTU BSHVNFOU )PXFWFS JUƊT OPU
B NFSF DPOWFOUJPO UP CJOE SFGFSFODFT XF EPOƊU DBSF BCPVU PO
UIF MFǒ IBOE TJEF UP _ :PV DBOƊU CJOE BSHVNFOUT UP UIF OBNF
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

ƍ@ƍ JUƊT QBSU PG UIF MBOHVBHF 5IJT JT QBSUMZ TP UIF DPNQJMFS


LOPXT GPS B DFSUBJOUZ ZPV XPOƊU FWFS FWBMVBUF TPNFUIJOH JO
UIBU QBSUJDVMBS DBTF $VSSFOUMZ JG ZPV USZ VTJOH _ PO UIF SJHIU
IBOE TJEF JO UIF EFƶOJUJPO JUƊMM UIJOL ZPVƊSF USZJOH UP SFGFS UP
B IPMF
8FƊSF POMZ GPSDJOH UIF (:) DPOTUSVDUPST BOE UIF [] BU UIF
FOE JO PSEFS UP DPVOU UIF OVNCFS PG WBMVFT DPOUBJOFE CZ UIF
MJTU

: <-|
/ \ |
|-> _ : <-|
| / \ | These got evaluated (forced)
|-> _ : <-|
| / \ |
|-> _ [] <-|
|
| These did not

)PXFWFS length XJMM UISPX BO FSSPS PO B CPUUPN WBMVF JG


QBSU PG UIF TQJOF JUTFMG JT CPUUPN

Prelude> let x = [1] ++ undefined ++ [3]


Prelude> x
[1*** Exception: Prelude.undefined
Prelude> length x
*** Exception: Prelude.undefined
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

1SJOUJOH UIF MJTU GBJMT BMUIPVHI JU HFUT BT GBS BT QSJOUJOH UIF


ƶSTU [ BOE UIF ƶSTU WBMVF BOE BUUFNQUJOH UP HFU UIF MFOHUI BMTP
GBJMT CFDBVTF JU DBOƊU DPVOU VOEFƶOFE TQJOF WBMVFT
*UƊT QPTTJCMF UP XSJUF GVODUJPOT XIJDI XJMM GPSDF CPUI UIF
TQJOF BOE UIF WBMVFT sum JT BO FYBNQMF CFDBVTF JO PSEFS UP
SFUVSO B SFTVMU BU BMM JU NVTU SFUVSO UIF TVN PG BMM WBMVFT JO UIF
MJTU
8FƊMM XSJUF PVS PXO TVN GVODUJPO GPS UIF TBLF PG EFNPO
TUSBUJPO

mySum :: Num a => [a] -> a


mySum [] = 0
mySum (x : xs) = x + mySum xs

'JSTU UIF + PQFSBUPS JT TUSJDU JO CPUI PG JUT BSHVNFOUT TP UIBU


XJMM GPSDF FWBMVBUJPO PG UIF WBMVFT BOE UIF mySum xs 5IFSFGPSF
mySum XJMM LFFQ SFDVSTJOH VOUJM JU IJUT UIF FNQUZ MJTU BOE NVTU
TUPQ 5IFO JU XJMM TUBSU HPJOH CBDL VQ UIF TQJOF PG UIF MJTU
TVNNJOH UIF JOIBCJUBOUT BT JU HPFT *U MPPLT TPNFUIJOH MJLF
UIJT UIF [FSP SFQSFTFOUT PVS FNQUZ MJTU


Prelude> mySum [1..5]


1 + (2 + (3 + (4 + (5 + 0))))
1 + (2 + (3 + (4 + 5)))
1 + (2 + (3 + 9))
1 + (2 + 12)
1 + 14
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

15

8F XJMM CF SFUVSOJOH UP UIJT UPQJD BU WBSJPVT QPJOUT JO UIF


CPPL CFDBVTF EFWFMPQJOH JOUVJUJPO GPS )BTLFMMƊT FWBMVBUJPO
TUSBUFHJFT UBLFT UJNF BOE QSBDUJDF *G ZPV EPOƊU GFFM MJLF ZPV
GVMMZ VOEFSTUBOE JU BU UIJT QPJOU UIBUƊT 0, *UƊT B DPNQMFY UPQJD
BOE JUƊT CFUUFS UP BQQSPBDI JU JO TUBHFT

&YFSDJTFT #PUUPN .BEOFTT


8JMM JU CMPX VQ

 8JMM UIF GPMMPXJOH FYQSFTTJPO SFUVSO B WBMVF PS CF વ

[x^y | x <- [1..5], y <- [2, undefined]]

 take 1 $ [x^y | x <- [1..5], y <- [2, undefined]]

 sum [1, undefined, 3]

 length [1, 2, undefined]

 length $ [1, 2, 3] ++ undefined

 take 1 $ filter even [1, 2, 3, undefined]

 take 1 $ filter even [1, 3, undefined]

 take 1 $ filter odd [1, 3, undefined]


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 take 2 $ filter odd [1, 3, undefined]

 take 3 $ filter odd [1, 3, undefined]

*OUFSNJTTJPO *T JU JO OPSNBM GPSN

'PS FBDI FYQSFTTJPO CFMPX EFUFSNJOF XIFUIFS JUƊT JO

 OPSNBM GPSN XIJDI JNQMJFT XFBL IFBE OPSNBM GPSN

 XFBL IFBE OPSNBM GPSN POMZ PS

 OFJUIFS

3FNFNCFS UIBU BO FYQSFTTJPO DBOOPU CF JO OPSNBM GPSN PS


XFBL IFBE OPSNBM GPSN JG UIF PVUFSNPTU QBSU PG UIF FYQSFTTJPO
JTOƊU B EBUB DPOTUSVDUPS *U DBOƊU CF JO OPSNBM GPSN JG BOZ QBSU
PG UIF FYQSFTTJPO JT VOFWBMVBUFE

 [1, 2, 3, 4, 5]

 1 : 2 : 3 : 4 : _

 enumFromTo 1 10

 length [1, 2, 3, 4, 5]

 sum (enumFromTo 1 10)

 ['a'..'m'] ++ ['n'..'z']

 (_, 'b')
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 5SBOTGPSNJOH MJTUT PG WBMVFT


8F IBWF BMSFBEZ TFFO IPX XF DBO NBLF SFDVSTJWF GVODUJPOT
XJUI TFMGSFGFSFOUJBM FYQSFTTJPOT *UƊT B VTFGVM UPPM BOE B DPSF
QBSU PG UIF MPHJD PG )BTLFMM *O USVUI JO QBSU CFDBVTF )BTLFMM
VTFT OPOTUSJDU FWBMVBUJPO XF UFOE UP VTF IJHIFSPSEFS GVOD
UJPOT GPS USBOTGPSNJOH EBUB SBUIFS UIBO NBOVBMMZ SFDVSTJOH
PWFS BOE PWFS
'PS FYBNQMF POF DPNNPO UIJOH ZPV XPVME XBOU UP EP JT
SFUVSO B MJTU XJUI B GVODUJPO BQQMJFE VOJGPSNMZ UP BMM WBMVFT
XJUIJO UIF MJTU 5P EP TP ZPV OFFE B GVODUJPO UIBU JT JOIFSFOUMZ
SFDVSTJWF BOE DBO BQQMZ UIBU GVODUJPO UP FBDI NFNCFS PG UIF
MJTU 'PS UIJT QVSQPTF XF DBO VTF FJUIFS UIF map PS fmap GVODUJPOT
map DBO POMZ CF VTFE XJUI [] fmap JT EFƶOFE JO B UZQFDMBTT
OBNFE Functor BOE DBO CF BQQMJFE UP EBUB PUIFS UIBO MJTUT 8F
XJMM MFBSO NPSF BCPVU Functor MBUFS GPS OPX XFƊMM GPDVT KVTU PO
UIF MJTU VTBHF )FSF BSF TPNF FYBNQMFT VTJOH map BOE fmap

Prelude> map (+1) [1, 2, 3, 4]


[2,3,4,5]
Prelude> map (1-) [1, 2, 3, 4]
[0,-1,-2,-3]
Prelude> fmap (+1) [1, 2, 3, 4]
[2,3,4,5]
Prelude> fmap (2*) [1, 2, 3, 4]
[2,4,6,8]
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

Prelude> fmap id [1, 2, 3]


[1,2,3]
Prelude> map id [1, 2, 3]
[1,2,3]

5IF UZQFT PG map BOE fmap SFTQFDUJWFMZ BSF

map :: (a -> b) -> [a] -> [b]


fmap :: Functor f => (a -> b) -> f a -> f b

-FUƊT MPPL BU IPX UIF UZQFT MJOF VQ XJUI B QSPHSBN TUBSUJOH


XJUI map

map :: (a -> b) -> [a] -> [b]

map (+1)
-- (a -> b) becomes more specific,
-- is resolved to: Num a => a -> a

Prelude> :t map (+1)


map (+1) :: Num b => [b] -> [b]
-- now we see it will take one list of Num
-- as an argument and return a list of Num
-- as a result

5IF UZQF PG fmap XJMM CFIBWF TJNJMBSMZ


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

fmap :: Functor f => (a -> b) -> f a -> f b


-- notice this has the Functor typeclass constraint

fmap (+1)
-- again, (a -> b) is now more specific

Prelude> :t fmap (+1)


fmap (+1) :: (Num b, Functor f) => f b -> f b
-- a bit different from map because the Functor
-- typeclass includes more than just lists!

)FSFƊT IPX map JT EFƶOFE JO #BTF

map :: (a -> b) -> [a] -> [b]


map _ [] = []
-- [1] [2] [3]
map f (x:xs) = f x : map f xs
-- [4] [5] [6] [7] [8]

 _ JT VTFE IFSF UP JHOPSF UIF GVODUJPO BSHVNFOU CFDBVTF


XF EPOƊU OFFE JU

 8F BSF QBUUFSO NBUDIJOH PO UIF [] FNQUZ MJTU DBTF CFDBVTF


-JTU JT B TVN UZQF XJUI UXP DBTFT BOE XF NVTU IBOEMF CPUI
FWFSZ UJNF XF QBUUFSO NBUDI PS DBTF PO B MJTU WBMVF

 8F SFUVSO UIF [] FNQUZ MJTU WBMVF CFDBVTF XIFO UIFSF BSF


OP WBMVFT JUƊT UIF POMZ DPSSFDU UIJOH XF DBO EP *G ZPV
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

BUUFNQU UP EP BOZUIJOH FMTF UIF UZQFDIFDLFS XJMM TXBU


ZPV

 8F CJOE UIF GVODUJPO BSHVNFOU UP UIF OBNF ԕ BT JU NFSJUT


OP OBNF NPSF TQFDJƶD UIBO UIJT ԕ BOE Ԗ BSF DPNNPO
OBNFT GPS OPOTQFDJƶD GVODUJPO WBMVFT JO )BTLFMM 5IJT JT
UIF GVODUJPO XF BSF NBQQJOH PWFS UIF MJTU WBMVF XJUI map

 8F EP OPU MFBWF UIF FOUJSF MJTU BSHVNFOU CPVOE BT B TJOHMF


OBNF 4JODF XFƊWF BMSFBEZ QBUUFSONBUDIFE UIF [] FNQUZ
MJTU DBTF XF LOPX UIFSF NVTU CF BU MFBTU POF WBMVF JO
UIF MJTU )FSF XF QBUUFSO NBUDI JOUP UIF (:) TFDPOE EBUB
DPOTUSVDUPS PG UIF MJTU XIJDI JT B QSPEVDU ԧ JT UIF TJOHMF
WBMVF PG UIF DPOT QSPEVDU ԧԢ JT UIF SFTU PG UIF MJTU

 8F BQQMZ PVS GVODUJPO ԕ UP UIF TJOHMF WBMVF ԧ 5IJT QBSU


PG UIF map GVODUJPO JT XIBU BDUVBMMZ BQQMJFT UIF GVODUJPO
BSHVNFOU UP UIF DPOUFOUT PG UIF MJTU

 8F (:) DPOT UIF WBMVF SFUVSOFE CZ UIF FYQSFTTJPO f x POUP


UIF IFBE PG UIF SFTVMU PG mapƊJOH UIF SFTU PG UIF MJTU %BUB JT
JNNVUBCMF JO )BTLFMM 8IFO XF NBQ XF EP OPU NVUBUF
UIF FYJTUJOH MJTU CVU CVJME B OFX MJTU XJUI UIF WBMVFT UIBU
SFTVMU GSPN BQQMZJOH UIF GVODUJPO

 8F DBMM map JUTFMG BQQMJFE UP ԕ BOE ԧԢ 5IJT FYQSFTTJPO JT UIF


SFTU PG UIF MJTU XJUI UIF GVODUJPO ԕ BQQMJFE UP FBDI WBMVF
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

)PX EP XF XSJUF PVU XIBU map f EPFT /PUF UIJT PSEFS PG


FWBMVBUJPO EPFTOƊU SFQSFTFOU UIF QSPQFS OPOTUSJDU FWBMVBUJPO
PSEFS CVU EPFT HJWF BO JEFB PG XIBUƊT HPJOH PO
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

map (+1) [1, 2, 3]


-- desugared, (:) is infixr 5, so it's right-associative
map (+1) (1 : (2 : (3 : [])))

-- Not an empty list, so second pattern-match in map fires.


-- Apply (+1) to value, then map
(+1) 1 : map (+1) (2 : (3 : []))

-- Apply (+1) to the next value, cons onto the


-- result of mapping over the rest
(+1) 1 : ((+1) 2 : (map (+1) (3 : [])))

-- Last time we'll trigger the second-case of map


(+1) 1 : ((+1) 2 : ((+1) 3 : (map (+1) [])))

-- Now we trigger the base-case that handles empty list


-- and return the empty list.
(+1) 1 : ((+1) 2 : ((+1) 3 : []))

-- Now we reduce
2 : ((+1) 2 : ((+1) 3 : []))
2 : 3 : (+1) 3 : []
2 : 3 : 4 : [] == [2, 3, 4]

6TJOH UIF TZOUBDUJD TVHBS PG MJTU IFSFƊT BO BQQSPYJNBUJPO PG


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

XIBU map JT EPJOH GPS VT

map f [1, 2, 3] == [f 1, f 2, f 3]

map (+1) [1, 2, 3]


[(+1) 1, (+1) 2, (+1) 3]
[2, 3, 4]

0S VTJOH UIF TQJOF TZOUBY XF JOUSPEVDFE FBSMJFS

:
/ \
1 :
/ \
2 :
/ \
3 []

map (+1) [1, 2, 3]

:
/ \
(+1) 1 :
/ \
(+1) 2 :
/ \
(+1) 3 []
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

"T XF NFOUJPOFE BCPWF UIFTF SFQSFTFOUBUJPOT EP OPU BD


DPVOU GPS OPOTUSJDU FWBMVBUJPO $SVDJBMMZ map EPFTOƊU BDUVBMMZ
USBWFSTF UIF XIPMF MJTU BOE BQQMZ UIF GVODUJPO JNNFEJBUFMZ
5IF GVODUJPO JT BQQMJFE UP UIF WBMVFT ZPV GPSDF PVU PG UIF MJTU
POF CZ POF 8F DBO TFF UIJT CZ TFMFDUJWFMZ MFBWJOH TPNF WBMVFT
VOEFƶOFE

Prelude> map (+1) [1, 2, 3]


[2,3,4]

-- the whole list was forced because


-- GHCi printed the list that resulted

Prelude> (+1) undefined


*** Exception: Prelude.undefined

Prelude> (1, undefined)


(1,*** Exception: Prelude.undefined
Prelude> fst $ (1, undefined)
1

Prelude> map (+1) [1, 2, undefined]


[2,3,*** Exception: Prelude.undefined

Prelude> take 2 $ map (+1) [1, 2, undefined]


[2,3]
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

*O UIF ƶOBM FYBNQMF UIF undefined WBMVF XBT OFWFS GPSDFE


BOE UIFSF XBT OP FSSPS CFDBVTF XF VTFE take 2 UP SFRVFTU POMZ
UIF ƶSTU UXP FMFNFOUT 8JUI map (+1) XF POMZ GPSDF BT NBOZ
WBMVFT BT DPOT DFMMT XF GPSDFE 8FƊMM POMZ GPSDF UIF WBMVFT JG
XF FWBMVBUF UIF SFTVMU WBMVF JO UIF MJTU UIBU UIF NBQ GVODUJPO
SFUVSOT
5IF TJHOJƶDBOU QBSU IFSF JT UIBU TUSJDUOFTT EPFTOƊU QSPDFFE
POMZ PVUTJEFJO 8F DBO IBWF MB[JMZ FWBMVBUFE DPEF FH map

XSBQQFE BSPVOE B TUSJDU DPSF FH +


 *O GBDU XF DBO DIPPTF UP
BQQMZ MB[JOFTT BOE TUSJDUOFTT JO IPX XF FWBMVBUF UIF TQJOF PS
UIF MFBWFT JOEFQFOEFOUMZ " DPNNPO NBOUSB GPS QFSGPSNBODF
TFOTJUJWF DPEF JO )BTLFMM JT ƌMB[Z JO UIF TQJOF TUSJDU JO UIF
MFBWFTƍ 8FƊMM DPWFS UIJT QSPQFSMZ MBUFS XIFO XF UBML BCPVU
OPOTUSJDUOFTT BOE EBUB TUSVDUVSFT BMUIPVHI NBOZ )BTLFMM VTFST
SBSFMZ XPSSZ BCPVU UIJT
:PV DBO VTF map BOE fmap XJUI PUIFS GVODUJPOT BOE MJTU UZQFT
BT XFMM *O UIJT FYBNQMF XF VTF UIF fst GVODUJPO UP SFUVSO B
MJTU PG UIF ƶSTU FMFNFOU PG FBDI UVQMF JO B MJTU PG UVQMFT

Prelude> map fst [(2, 3), (4, 5), (6, 7), (8, 9)]
[2,4,6,8]

Prelude> fmap fst [(2, 3), (4, 5), (6, 7), (8, 9)]
[2,4,6,8]

*O UIJT FYBNQMF XF NBQ B QBSUJBMMZ BQQMJFE take GVODUJPO


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

Prelude> map (take 3) [[1..5], [1..5], [1..5]]


[[1,2,3],[1,2,3],[1,2,3]]

/FYU XFƊMM NBQ BO if-then-else PWFS B MJTU VTJOH BO BOPOZ


NPVT GVODUJPO 5IJT MJTU XJMM ƶOE BOZ WBMVF FRVBM UP  OFHBUF
JU BOE UIFO SFUVSO UIF MJTU

Prelude> map (\x -> if x == 3 then (-x) else (x)) [1..10]


[1,2,-3,4,5,6,7,8,9,10]

"U UIJT QPJOU ZPV DBO USZ ZPVS IBOE BU NBQQJOH EJƵFSFOU
GVODUJPOT VTJOH UIJT BT B NPEFM 8F SFDPNNFOE HFUUJOH DPN
GPSUBCMF XJUI NBQQJOH CFGPSF NPWJOH PO UP UIF 'PMET DIBQUFS

&YFSDJTFT .PSF #PUUPNT


"T BMXBZT XF FODPVSBHF ZPV UP USZ ƶHVSJOH PVU UIF BOTXFST
CFGPSF ZPV FOUFS UIFN JOUP ZPVS 3&1-

 8JMM UIF GPMMPXJOH FYQSFTTJPO SFUVSO B WBMVF PS CF વ

take 1 $ map (+1) [undefined, 2, 3]

 8JMM UIF GPMMPXJOH FYQSFTTJPO SFUVSO B WBMVF

take 1 $ map (+1) [1, undefined, 3]

 8JMM UIF GPMMPXJOH FYQSFTTJPO SFUVSO B WBMVF

take 2 $ map (+1) [1, undefined, 3]


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 8IBU EPFT UIF GPMMPXJOH NZTUFSZ GVODUJPO EP 8IBU JT JUT


UZQF %FTDSJCF JU UP ZPVSTFMG PS B MPWFE POF
JO TUBOEBSE
&OHMJTI BOE UIFO UFTU JU PVU JO UIF 3&1- UP NBLF TVSF ZPV
XFSF DPSSFDU

itIsMystery xs = map (\x -> elem x "aeiou") xs

 8IBU XJMM CF UIF SFTVMU PG UIF GPMMPXJOH GVODUJPOT

B
map (^2) [1..10]

C
map minimum [[1..10], [10..20], [20..30]]
-- n.b. `minimum` is not the same function
-- as the `min` that we used before

D
map sum [[1..5], [1..5], [1..5]]

 #BDL JO UIF 'VODUJPOT DIBQUFS ZPV XSPUF B GVODUJPO DBMMFE


foldBool 5IBU GVODUJPO FYJTUT JO B NPEVMF LOPXO BT %BUB#PPM
BOE JT DBMMFE bool 8SJUF B GVODUJPO UIBU EPFT UIF TBNF PS
TJNJMBS JG ZPV XJTI
BT UIF map (if-then-else) GVODUJPO ZPV
TBX BCPWF CVU VTFT bool JOTUFBE PG UIF if-then-else TZOUBY
:PVS ƶSTU TUFQ TIPVME CF CSJOHJOH UIF bool GVODUJPO JOUP
TDPQF CZ UZQJOH import Data.Bool BU ZPVS 1SFMVEF QSPNQU
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 'JMUFSJOH MJTUT PG WBMVFT


8IFO XF UBMLFE BCPVU GVODUJPO DPNQPTJUJPO JO UIF 'VODUJPOT
DIBQUFS XF VTFE B GVODUJPO DBMMFE filter UIBU UBLFT B MJTU BT
JOQVU BOE SFUVSOT B OFX MJTU DPOTJTUJOH TPMFMZ PG UIF WBMVFT JO
UIF JOQVU MJTU UIBU NFFU B DFSUBJO DPOEJUJPO BT JO UIJT FYBNQMF
XIJDI ƶOET UIF FWFO OVNCFST PG B MJTU BOE SFUVSOT B OFX MJTU
PG KVTU UIPTF WBMVFT

Prelude> filter even [1..10]


[2,4,6,8,10]

-FUƊT OPX UBLF B DMPTFS MPPL BU filter filter IBT UIF GPMMPX
JOH EFƶOJUJPO

filter :: (a -> Bool) -> [a] -> [a]


filter _ [] = []
filter pred (x:xs)
| pred x = x : filter pred xs
| otherwise = filter pred xs

'JMUFSJOH UBLFT B GVODUJPO UIBU SFUVSOT B Bool WBMVF NBQT


UIBU GVODUJPO PWFS B MJTU BOE SFUVSOT B OFX MJTU PG BMM UIF WBMVFT
UIBU NFU UIF DPOEJUJPO *UƊT JNQPSUBOU UP SFNJOE PVSTFMWFT UIBU
UIJT GVODUJPO BT XF DBO TFF JO UIF EFƶOJUJPO CVJMET B OFX MJTU
JODMVEJOH WBMVFT UIBU NFFU UIF DPOEJUJPO BOE FYDMVEJOH UIF
POFT UIBU EP OPU ƈ JU EPFT OPU NVUBUF UIF FYJTUJOH MJTU
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

8F IBWF TFFO IPX filter XPSLT XJUI odd BOE even BMSFBEZ
8F IBWF BMTP TFFO POF FYBNQMF BMPOH UIF MJOFT PG UIJT

Prelude> filter (== 'a') "abracadabra"


"aaaaa"

"T ZPV NJHIU TVTQFDU GSPN XIBU XFƊWF TFFO PG )0'T UIPVHI
filter DBO IBOEMF NBOZ UZQFT PG BSHVNFOUT 5IF GPMMPXJOH FY
BNQMF EPFT UIF TBNF UIJOH BT filter even CVU XJUI BOPOZNPVT
GVODUJPO TZOUBY

Prelude> filter (\x -> (rem x 2) == 0) [1..20]


[2,4,6,8,10,12,14,16,18,20]

8F DPWFSFE MJTU DPNQSFIFOTJPOT FBSMJFS BT B XBZ PG ƶMUFSJOH


MJTUT BT XFMM $PNQBSF UIF GPMMPXJOH

Prelude> filter (\x -> elem x "aeiou") "abracadabra"


"aaaaa"
Prelude> [x | x <- "abracadabra", elem x "aeiou"]
"aaaaa"

"T UIFZ TBZ UIFSFƊT NPSF UIBO POF XBZ UP TLJO B DBU
"HBJO XF SFDPNNFOE BU UIJT QPJOU ZPV USZ XSJUJOH TPNF
ƶMUFS GVODUJPOT PG ZPVS PXO UP HFU DPNGPSUBCMF XJUI UIF QBU
UFSO
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

&YFSDJTFT 'JMUFSJOH
 (JWFO UIF BCPWF IPX NJHIU XF XSJUF B ƶMUFS GVODUJPO UIBU
XPVME HJWF VT BMM UIF NVMUJQMFT PG  PVU PG B MJTU GSPN 

 3FDBMMJOH XIBU XF MFBSOFE BCPVU GVODUJPO DPNQPTJUJPO


IPX DPVME XF DPNQPTF UIF BCPWF GVODUJPO XJUI UIF length
GVODUJPO UP UFMM VT IPX NBOZ NVMUJQMFT PG  UIFSF BSF
CFUXFFO  BOE 

 /FYU XFƊSF HPJOH UP XPSL PO SFNPWJOH BMM BSUJDMFT ƊUIFƊ ƊBƊ


BOE ƊBOƊ
GSPN TFOUFODFT :PV XBOU UP HFU UP TPNFUIJOH
UIBU XPSLT MJLF UIJT

Prelude> myFilter "the brown dog was a goof"


["brown","dog","was","goof"]

:PV NBZ SFDBMM UIBU FBSMJFS JO UIJT DIBQUFS XF BTLFE ZPV


UP XSJUF B GVODUJPO UIBU TFQBSBUFT B TUSJOH JOUP B MJTU PG
TUSJOHT CZ TFQBSBUJOH UIFN BU TQBDFT 5IBU JT B TUBOEBSE
MJCSBSZ GVODUJPO DBMMFE words :PV NBZ DPOTJEFS TUBSUJOH
UIJT FYFSDJTF CZ VTJOH words PS ZPVS WFSTJPO PG DPVSTF


 ;JQQJOH MJTUT


;JQQJOH MJTUT UPHFUIFS JT B NFBOT PG DPNCJOJOH WBMVFT GSPN
NVMUJQMF MJTUT JOUP B TJOHMF MJTU 3FMBUFE GVODUJPOT MJLF zipWith
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

BMMPX ZPV UP VTF B DPNCJOJOH GVODUJPO UP QSPEVDF B MJTU PG


SFTVMUT GSPN UXP MJTUT
'JSTU MFUƊT MPPL BU zip

Prelude> :t zip
zip :: [a] -> [b] -> [(a, b)]

Prelude> zip [1, 2, 3] [4, 5, 6]


[(1,4),(2,5),(3,6)]

0OF UIJOH UP OPUF JT UIBU zip TUPQT BT TPPO BT POF PG UIF MJTUT
SVOT PVU PG WBMVFT

Prelude> zip [1, 2] [4, 5, 6]


[(1,4),(2,5)]
Prelude> zip [1, 2, 3] [4]
[(1,4)]

"OE XJMM SFUVSO BO FNQUZ MJTU JG FJUIFS PG UIF MJTUT JT FNQUZ

Prelude> zip [] [1..1000000000000000000]


[]

zip QSPDFFET VOUJM UIF TIPSUFTU MJTU FOET

Prelude> zip ['a'] [1..1000000000000000000]


[('a',1)]
Prelude> zip [1..100] ['a'..'c']
[(1,'a'),(2,'b'),(3,'c')]
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

8F DBO VTF unzip UP SFDPWFS UIF MJTUT BT UIFZ XFSF CFGPSF


UIFZ XFSF [JQQFE

Prelude> zip [1, 2, 3] [4, 5, 6]


[(1,4),(2,5),(3,6)]
Prelude> unzip $ zip [1, 2, 3] [4, 5, 6]
([1,2,3],[4,5,6])
Prelude> fst $ unzip $ zip [1, 2, 3] [4, 5, 6]
[1,2,3]
Prelude> snd $ unzip $ zip [1, 2, 3] [4, 5, 6]
[4,5,6]

+VTU CF BXBSF UIBU JOGPSNBUJPO DBO CF MPTU JO UIJT QSPDFTT


CFDBVTF zip NVTU TUPQ PO UIF TIPSUFTU MJTU

Prelude> snd $ unzip $ zip [1, 2] [4, 5, 6]


[4,5]

8F DBO BMTP VTF zipWith UP BQQMZ B GVODUJPO UP UIF WBMVFT PG


UXP MJTUT JO QBSBMMFM

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]


-- [1] [2] [3] [4]

 " GVODUJPO XJUI UXP BSHVNFOUT /PUJDF IPX UIF UZQF


WBSJBCMFT PG UIF BSHVNFOUT BOE SFTVMU BMJHO XJUI UIF UZQF
WBSJBCMFT JO UIF MJTUT
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 5IF ƶSTU JOQVU MJTU

 5IF TFDPOE JOQVU MJTU

 5IF PVUQVU MJTU DSFBUFE GSPN BQQMZJOH UIF GVODUJPO UP UIF


WBMVFT JO UIF JOQVU MJTUT

" CSJFG EFNPOTUSBUJPO PG IPX zipWith XPSLT

Prelude> zipWith (+) [1, 2, 3] [10, 11, 12]


[11,13,15]

Prelude> zipWith (*) [1, 2, 3] [10, 11, 12]


[10,22,36]

Prelude> zipWith (==) ['a'..'f'] ['a'..'m']


[True,True,True,True,True,True]

Prelude> zipWith max [10, 5, 34, 9] [6, 8, 12, 7]


[10,8,34,9]

;JQQJOH FYFSDJTFT
 8SJUF ZPVS PXO WFSTJPO PG zip :: [a] -> [b] -> [(a, b)]
BOE FOTVSF JU CFIBWFT UIF TBNF BT UIF PSJHJOBM

 %P XIBU ZPV EJE GPS zip CVU OPX GPS zipWith :: (a -> b
-> c) -> [a] -> [b] -> [c]
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 3FXSJUF ZPVS zip JO UFSNT PG UIF zipWith ZPV XSPUF

 $IBQUFS &YFSDJTFT


5IF ƶSTU TFU PG FYFSDJTFT IFSF XJMM NPTUMZ CF SFWJFX CVU XJMM
BMTP JOUSPEVDF ZPV UP TPNF OFX UIJOHT 5IF TFDPOE TFU JT
NPSF DPODFQUVBMMZ DIBMMFOHJOH CVU EPFT OPU VTF BOZ TZOUBY PS
DPODFQUT XF IBWFOƊU BMSFBEZ TUVEJFE *G ZPV HFU TUVDL JU NBZ
IFMQ UP ƷJQ CBDL UP B SFMFWBOU TFDUJPO BOE SFWJFX

%BUB$IBS
5IFTF ƶSTU GFX FYFSDJTFT BSF TUSBJHIUGPSXBSE CVU XJMM JOUSPEVDF
ZPV UP TPNF OFX MJCSBSZ GVODUJPOT BOE SFWJFX TPNF PG XIBU
XFƊWF MFBSOFE TP GBS 4PNF PG UIF GVODUJPOT XF XJMM VTF IFSF
BSF OPU TUBOEBSE JO 1SFMVEF BOE TP IBWF UP CF JNQPSUFE GSPN
B NPEVMF DBMMFE %BUB$IBS :PV NBZ EP TP JO B TPVSDF ƶMF SFD
PNNFOEFE
PS BU UIF 1SFMVEF QSPNQU XJUI UIF TBNF QISBTF
import Data.Char XSJUF UIBU BU UIF UPQ PG ZPVS TPVSDF ƶMF
 5IJT
CSJOHT JOUP TDPQF B CVODI PG OFX TUBOEBSE GVODUJPOT XF DBO
QMBZ XJUI UIBU PQFSBUF PO $IBS BOE 4USJOH UZQFT

 2VFSZ UIF UZQFT PG isUpper BOE toUpper

 (JWFO UIF GPMMPXJOH CFIBWJPST XIJDI XPVME XF VTF UP


XSJUF B GVODUJPO UIBU ƶMUFST BMM UIF VQQFSDBTF MFUUFST PVU
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

PG B String 8SJUF UIBU GVODUJPO TVDI UIBU HJWFO UIF JOQVU


ƌ)C&G-S-Y0 ƍ ZPVS GVODUJPO XJMM SFUVSO ƌ)&--0ƍ

Prelude Data.Char> isUpper 'J'


True
Prelude Data.Char> toUpper 'j'
'J'

 8SJUF B GVODUJPO UIBU XJMM DBQJUBMJ[F UIF ƶSTU MFUUFS PG B


4USJOH BOE SFUVSO UIF FOUJSF 4USJOH 'PS FYBNQMF JG HJWFO
UIF BSHVNFOU ƌKVMJF ƍ JU XJMM SFUVSO ƌ+VMJFƍ

 /PX NBLF B OFX WFSTJPO PG UIBU GVODUJPO UIBU JT SFDVSTJWF


TVDI UIBU JG ZPV HJWF JU UIF JOQVU ƌXPPUƍ JU XJMM IPMMFS CBDL
BU ZPV ƌ8005ƍ 5IF UZQF TJHOBUVSF XPOƊU DIBOHF CVU
ZPV XJMM XBOU UP BEE B CBTF DBTF

 5P EP UIF ƶOBM FYFSDJTF JO UIJT TFDUJPO XFƊMM OFFE BOPUIFS


TUBOEBSE GVODUJPO GPS MJTUT DBMMFE head 2VFSZ UIF UZQF PG
head BOE FYQFSJNFOU XJUI JU UP TFF XIBU JU EPFT /PX XSJUF
B GVODUJPO UIBU XJMM DBQJUBMJ[F UIF ƶSTU MFUUFS PG B 4USJOH
BOE SFUVSO POMZ UIBU MFUUFS BT UIF SFTVMU

 $PPM (PPE XPSL /PX SFXSJUF JU BT B DPNQPTFE GVODUJPO


5IFO GPS GVO SFXSJUF JU QPJOUGSFF
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

$JQIFST

8FƊMM TUJMM CF VTJOH %BUB$IBS GPS UIJT OFYU FYFSDJTF :PV TIPVME
TBWF UIFTF FYFSDJTFT JO B NPEVMF DBMMFE $JQIFS CFDBVTF XFƊMM
CF DPNJOH CBDL UP UIFN JO MBUFS DIBQUFST :PVƊMM CF XSJUJOH B
$BFTBS DJQIFS GPS OPX CVU XFƊMM TVHHFTU TPNF WBSJBUJPOT PO
UIF CBTJD QSPHSBN JO MBUFS DIBQUFST
" $BFTBS DJQIFS JT B TJNQMF TVCTUJUVUJPO DJQIFS JO XIJDI
FBDI MFUUFS JT SFQMBDFE CZ UIF MFUUFS UIBU JT B ƶYFE OVNCFS PG
QMBDFT EPXO UIF BMQIBCFU GSPN JU :PV XJMM ƶOE WBSJBUJPOT PO
UIJT BMM PWFS UIF QMBDF ƈ ZPV DBO TIJǒ MFǒXBSE PS SJHIUXBSE
GPS BOZ OVNCFS PG TQBDFT " SJHIUXBSE TIJǒ PG  NFBOT UIBU
Ɗ"Ɗ XJMM CFDPNF Ɗ%Ɗ BOE Ɗ#Ɗ XJMM CFDPNF Ɗ& Ɗ GPS FYBNQMF *G ZPV
EJE B MFǒXBSE TIJǒ PG  UIFO ƊBƊ XPVME CFDPNF ƊWƊ BOE TP GPSUI
:PVS HPBM JO UIJT FYFSDJTF JT UP XSJUF B CBTJD $BFTBS DJQIFS
UIBU TIJǒT SJHIUXBSE :PV DBO TUBSU CZ IBWJOH UIF OVNCFS PG
TQBDFT UP TIJǒ ƶYFE CVU JUƊT NPSF DIBMMFOHJOH UP XSJUF B DJQIFS
UIBU BMMPXT ZPV UP WBSZ UIF OVNCFS PG TIJǒT TP UIBU ZPV DBO
FODPEF ZPVS TFDSFU NFTTBHFT EJƵFSFOUMZ FBDI UJNF
5IFSF BSF $BFTBS DJQIFST XSJUUFO JO )BTLFMM BMM PWFS UIF
JOUFSOFU CVU UP NBYJNJ[F UIF MJLFMJIPPE UIBU ZPV DBO XSJUF
ZPVST XJUIPVU QFFLJOH BU UIPTF XFƊMM QSPWJEF B DPVQMF PG UJQT
8IFO ZPVST JT XPSLJOH UIF XBZ ZPV XBOU JU UP XF XPVME
FODPVSBHF ZPV UP UIFO MPPL BSPVOE BOE DPNQBSF ZPVS TPMVUJPO
UP PUIFST PVU UIFSF
5IF ƶSTU MJOFT PG ZPVS UFYU ƶMF TIPVME MPPL MJLF UIJT
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

module Cipher where

import Data.Char

%BUB$IBS JODMVEFT UXP GVODUJPOT DBMMFE ord BOE chr UIBU DBO
CF VTFE UP BTTPDJBUF B $IBS XJUI JUT *OU SFQSFTFOUBUJPO JO UIF
6OJDPEF TZTUFN BOE WJDF WFSTB

*Cipher> :t chr
chr :: Int -> Char
*Cipher> :t ord
ord :: Char -> Int

6TJOH UIFTF GVODUJPOT JT PQUJPOBM UIFSF BSF PUIFS XBZT ZPV


DBO QSPDFFE XJUI TIJǒJOH CVU VTJOH chr BOE ord NJHIU TJNQMJGZ
UIF QSPDFTT B CJU
:PV XBOU ZPVS TIJǒ UP XSBQ CBDL BSPVOE UP UIF CFHJOOJOH PG
UIF BMQIBCFU TP UIBU JG ZPV IBWF B SJHIUXBSE TIJǒ PG  GSPN Ɗ[ Ɗ
ZPV FOE VQ CBDL BU ƊDƊ BOE OPU TPNFXIFSF JO UIF WBTU 6OJDPEF
IJOUFSMBOET %FQFOEJOH PO IPX ZPVƊWF TFU UIJOHT VQ UIJT
NJHIU CF B CJU USJDLZ $POTJEFS TUBSUJOH GSPN B CBTF DIBSBDUFS
FH ƊBƊ
BOE VTJOH mod UP FOTVSF ZPVƊSF POMZ TIJǒJOH PWFS UIF
 TUBOEBSE DIBSBDUFST PG UIF &OHMJTI BMQIBCFU
:PV TIPVME JODMVEF BO unCaesar GVODUJPO UIBU XJMM EFDJQIFS
ZPVS UFYU BT XFMM *O B MBUFS DIBQUFS XF XJMM UFTU JU
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

8SJUJOH ZPVS PXO TUBOEBSE GVODUJPOT


#FMPX BSF UIF PVUMJOFT PG TPNF TUBOEBSE GVODUJPOT 5IF HPBM
IFSF JT UP XSJUF ZPVS PXO WFSTJPOT PG UIFTF UP HBJO B EFFQFS
VOEFSTUBOEJOH PG SFDVSTJPO PWFS MJTUT BOE IPX UP NBLF GVOD
UJPOT ƷFYJCMF FOPVHI UP BDDFQU B WBSJFUZ PG JOQVUT :PV DPVME
ƶHVSF PVU IPX UP MPPL VQ UIF BOTXFST CVU ZPV XPOƊU EP UIBU
CFDBVTF ZPV LOPX ZPVƊE POMZ CF DIFBUJOH ZPVSTFMG PVU PG UIF
LOPXMFEHF 3JHIU
-FUƊT MPPL BU BO FYBNQMF PG XIBU XFƊSF BǒFS IFSF 5IF and
GVODUJPO DBO UBLF B MJTU PG #PPM WBMVFT BOE SFUVSOT 5SVF JG BOE
POMZ JG OP WBMVFT JO UIF MJTU BSF 'BMTF )FSFƊT IPX ZPV NJHIU
XSJUF ZPVS PXO WFSTJPO PG JU

-- direct recursion, not using (&&)


myAnd :: [Bool] -> Bool
myAnd [] = True
myAnd (x:xs) = if x == False then False else myAnd xs

-- direct recursion, using (&&)


myAnd :: [Bool] -> Bool
myAnd [] = True
myAnd (x:xs) = x && myAnd xs

/PUF UIBU JG ZPVƊSF VTJOH ()$  PS OFXFS UIF GVODUJPOT and any BOE all IBWF CFFO
BCTUSBDUFE GSPN CFJOH VTBCMF POMZ XJUI MJTUT UP CFJOH VTBCMF XJUI BOZ EBUBUZQF UIBU IBT BO
JOTUBODF PG UIF UZQFDMBTT 'PMEBCMF *U TUJMM XPSLT XJUI MJTUT KVTU UIF TBNF BT JU EJE CFGPSF
1SPDFFE BTTVSFE UIBU XFƊMM DPWFS UIJT MBUFS
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

"OE OPX UIF GVO CFHJOT

 myOr SFUVSOT 5SVF JG BOZ #PPM JO UIF MJTU JT 5SVF

myOr :: [Bool] -> Bool


myOr = undefined

 myAny SFUVSOT 5SVF JG a -> Bool BQQMJFE UP BOZ PG UIF WBMVFT


JO UIF MJTU SFUVSOT 5SVF

myAny :: (a -> Bool) -> [a] -> Bool


myAny = undefined

&YBNQMF GPS WBMJEBUJOH myAny

Prelude> myAny even [1, 3, 5]


False
Prelude> myAny odd [1, 3, 5]
True

 "ǒFS ZPV XSJUF UIF SFDVSTJWF myElem XSJUF BOPUIFS WFSTJPO


UIBU VTFT any
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

-- the built-in version of 'elem' in GHC 7.10


-- and newer has a type that uses Foldable
-- instead of the list type specifically. You
-- can ignore that and write the concrete
-- version that works only for list.

myElem :: Eq a => a -> [a] -> Bool

Prelude> myElem 1 [1..10]


True
Prelude> myElem 1 [2..10]
False

 *NQMFNFOU myReverse

myReverse :: [a] -> [a]


myReverse = undefined

Prelude> myReverse "blah"


"halb"
Prelude> myReverse [1..5]
[5,4,3,2,1]

 squish ƷBUUFOT B MJTU PG MJTUT JOUP B MJTU

squish :: [[a]] -> [a]


squish = undefined
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 squishMap NBQT B GVODUJPO PWFS B MJTU BOE DPODBUFOBUFT UIF


SFTVMUT

squishMap :: (a -> [b]) -> [a] -> [b]


squishMap = undefined

Prelude> squishMap (\x -> [1, x, 3]) [2]


[1,2,3]
Prelude> squishMap (\x -> "WO "++[x]++" HOO ") "123"
"WO 1 HOO WO 2 HOO WO 3 HOO "

 squishAgain ƷBUUFOT B MJTU PG MJTUT JOUP B MJTU 5IJT UJNF SFVTF


UIF squishMap GVODUJPO

squishAgain :: [[a]] -> [a]


squishAgain = undefined

 myMaximumBy UBLFT B DPNQBSJTPO GVODUJPO BOE B MJTU BOE


SFUVSOT UIF HSFBUFTU FMFNFOU PG UIF MJTU CBTFE PO UIF MBTU
WBMVF UIBU UIF DPNQBSJTPO SFUVSOFE GT GPS *G ZPV JNQPSU
maximumBy GSPN Data.List ZPVƊMM TFF UIF UZQF JT

Foldable t => (a -> a -> Ordering) -> t a -> a

SBUIFS UIBO

(a -> a -> Ordering) -> [a] -> a


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

myMaximumBy :: (a -> a -> Ordering) -> [a] -> a


myMaximumBy = undefined

Prelude> let xs = [1, 53, 9001, 10]


Prelude> myMaximumBy compare xs
9001

 myMinimumBy UBLFT B DPNQBSJTPO GVODUJPO BOE B MJTU BOE


SFUVSOT UIF MFBTU FMFNFOU PG UIF MJTU CBTFE PO UIF MBTU WBMVF
UIBU UIF DPNQBSJTPO SFUVSOFE -5 GPS

myMinimumBy :: (a -> a -> Ordering) -> [a] -> a


myMinimumBy = undefined

Prelude> let xs = [1, 53, 9001, 10]


Prelude> myMinimumBy compare xs
1

6TJOH UIF myMinimumBy BOE myMaximumBy GVODUJPOT XSJUF ZPVS


PXO WFSTJPOT PG maximum BOE minimum *G ZPV IBWF ()$
 PS OFXFS ZPVƊMM TFF B UZQF DPOTUSVDUPS UIBU XBOUT B
'PMEBCMF JOTUBODF JOTUFBE PG B MJTU BT IBT CFFO UIF DBTF GPS
NBOZ GVODUJPOT TP GBS
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

myMaximum :: (Ord a) => [a] -> a


myMaximum = undefined

myMinimum :: (Ord a) => [a] -> a


myMinimum = undefined

 %FƶOJUJPOT
 *O UZQF UIFPSZ B 1SPEVDU UZQF JT B UZQF NBEF PG B TFU PG UZQFT
DPNQPVOEFE PWFS FBDI PUIFS *O )BTLFMM XF SFQSFTFOU
QSPEVDUT VTJOH UVQMFT PS EBUB DPOTUSVDUPST XJUI NPSF UIBO
POF BSHVNFOU 5IF ƌDPNQPVOEJOHƍ JT GSPN FBDI UZQF
BSHVNFOU UP UIF EBUB DPOTUSVDUPS SFQSFTFOUJOH B WBMVF UIBU
DPFYJTUT XJUI BMM UIF PUIFS WBMVFT TJNVMUBOFPVTMZ 1SPEVDUT
PG UZQFT SFQSFTFOU B DPOKVODUJPO ƌBOE ƍ PG UIPTF UZQFT *G
ZPV IBWF B QSPEVDU PG #PPM BOE *OU ZPVS UFSNT XJMM FBDI
DPOUBJO B #PPM BOE *OU WBMVF

 *O UZQF UIFPSZ B 4VN UZQF PG UXP UZQFT JT B UZQF XIPTF


UFSNT BSF UFSNT JO FJUIFS UZQF CVU OPU TJNVMUBOFPVTMZ *O
)BTLFMM TVN UZQFT BSF SFQSFTFOUFE VTJOH UIF QJQF | JO B
EBUBUZQF EFƶOJUJPO 4VNT PG UZQFT SFQSFTFOU B EJTKVODUJPO
ƌPS ƍ PG UIPTF UZQFT *G ZPV IBWF B TVN PG #PPM BOE *OU
ZPVS UFSNT XJMM CF FJUIFS B #PPM WBMVF PS BO *OU WBMVF

 $POT JT PSEJOBSJMZ VTFE BT B WFSC UP TJHOJGZ UIBU B MJTU WBMVF


$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

IBT CFFO DSFBUFE CZ DPOTƊJOH B WBMVF POUP UIF IFBE PG


BOPUIFS MJTU WBMVF *O )BTLFMM (:) JT UIF DPOT PQFSBUPS GPS
UIF MJTU UZQF *U JT B EBUB DPOTUSVDUPS EFƶOFE JO UIF MJTU
EBUBUZQF

1 : [2, 3]
-- [a] [b]

[1, 2, 3]
-- [c]

(:) :: a -> [a] -> [a]


-- [d] [e] [f]

B
5IF OVNCFS  UIF WBMVF XF BSF DPOTJOH
C
" MJTU PG UIF OVNCFS  GPMMPXFE CZ UIF OVNCFS 
D
5IF ƶOBM SFTVMU PG DPOTJOH  POUP [2, 3]
E
5IF UZQF WBSJBCMF Ԑ DPSSFTQPOET UP 1 UIF WBMVF XF
DPOTFE POUP UIF MJTU WBMVF
F
5IF ƶSTU PDDVSSFODF PG UIF UZQF [a] JO UIF DPOT PQFS
BUPSƊT UZQF DPSSFTQPOET UP UIF TFDPOE BOE ƶOBM BSHV
NFOU (:) BDDFQUT XIJDI XBT [2, 3]
G
5IF TFDPOE BOE ƶOBM PDDVSSFODF PG UIF UZQF [a] JO UIF
DPOT PQFSBUPSƊT UZQF DPSSFTQPOET UP UIF ƶOBM SFTVMU
[1, 2, 3]
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

 $POT DFMM JT B EBUB DPOTUSVDUPS BOE B QSPEVDU PG UIF UZQFT


a BOE [a] BT EFƶOFE JO UIF MJTU EBUBUZQF #FDBVTF JU SFGFS
FODFT UIF MJTU UZQF DPOTUSVDUPS JUTFMG JO UIF TFDPOE BSHV
NFOU JU BMMPXT GPS OFTUJOH PG NVMUJQMF DPOT DFMMT QPTTJCMZ
JOEFƶOJUFMZ XJUI UIF VTF PG SFDVSTJWF GVODUJPOT GPS SFQSF
TFOUJOH BO JOEFƶOJUF OVNCFS PG WBMVFT JO TFSJFT

data [] a = [] | a : [a]
-- ^ cons operator

-- Defining it ourselves

data List a = Nil | Cons a (List a)

-- Creating a list using our list type

Cons 1 (Cons 2 (Cons 3 Nil))

)FSF (Cons 1 ...) (Cons 2 ...) BOE (Cons 3 Nil) BSF BMM
JOEJWJEVBM DPOT DFMMT JO UIF MJTU [1, 2, 3]

 5IF TQJOF JT B XBZ UP SFGFS UP UIF TUSVDUVSF UIBU HMVFT B


DPMMFDUJPO PG WBMVFT UPHFUIFS *O UIF MJTU EBUBUZQF JU JT
GPSNFE CZ UIF SFDVSTJWF OFTUJOH PG DPOT DFMMT 5IF TQJOF JT
JO FTTFODF UIF TUSVDUVSF PG DPMMFDUJPO UIBU JTOƊU UIF WBMVFT
$)"15&3  5)*4 5)*/( "/% 40.& .03& 456'' 

DPOUBJOFE UIFSFJO 0ǒFO TQJOF XJMM CF VTFE JO SFGFSFODF


UP MJTUT CVU JU BQQMJFT XJUI USFF EBUB TUSVDUVSFT BT XFMM

-- Given the list [1, 2, 3]

1 : --------| The nested cons operators


(2 : -----| here represent the spine.
(3 : --|
[]))

-- Blanking the irrelevant values out

_ : ----------|
(_ : -------|
(_ : ----> Spine
[]))

 'PMMPXVQ SFTPVSDFT


 Data.List EPDVNFOUBUJPO GPS UIF base MJCSBSZ
http://hackage.haskell.org/package/base/docs/Data-List.html

 /JOFUZOJOF )BTLFMM QSPCMFNT


https://wiki.haskell.org/H-99:_Ninety-Nine_Haskell_Problems
$IBQUFS 

'PMEJOH MJTUT

5IF FYQMJDJU UFBDIJOH PG


UIJOLJOH JT OP USJWJBM UBTL
CVU XIP TBJE UIBU UIF
UFBDIJOH PG QSPHSBNNJOH
JT *O PVS UFSNJOPMPHZ
UIF NPSF FYQMJDJUMZ
UIJOLJOH JT UBVHIU UIF
NPSF PG B TDJFOUJTU UIF
QSPHSBNNFS XJMM
CFDPNF

&ETHFS %JKLTUSB


$)"15&3  %"5" 4536$563& 03*(".* 

 'PMET
'PMEJOH JT B DPODFQU UIBU FYUFOET JO VTFGVMOFTT BOE JNQPSUBODF
CFZPOE MJTUT CVU MJTUT BSF PǒFO IPX UIFZ BSF JOUSPEVDFE 'PMET
BT B HFOFSBM DPODFQU BSF DBMMFE DBUBNPSQIJTNT :PVƊSF GBNJM
JBS XJUI UIF SPPU ƌNPSQIJTNƍ GSPN QPMZNPSQIJTN ƌ$BUBƍ
NFBOT ƌEPXOƍ PS ƌBHBJOTUƍ BT JO ƌDBUBDPNCTƍ $BUBNPSQIJTNT
BSF B NFBOT PG EFDPOTUSVDUJOH EBUB *G UIF TQJOF PG B MJTU JT UIF
TUSVDUVSF PG B MJTU UIFO B GPME JT XIBU DBO SFEVDF UIBU TUSVDUVSF
5IJT DIBQUFS JT B UIPSPVHI MPPL BU UIF UPQJD PG GPMEJOH MJTUT
JO )BTLFMM 8F XJMM

Ƒ FYQMBJO XIBU GPMET BSF BOE IPX UIFZ XPSL

Ƒ HP JOUP EFUBJM UIF FWBMVBUJPO QSPDFTTFT PG GPMET

Ƒ XBML UISPVHI UIF QSPDFTT PG XSJUJOH GPMEJOH GVODUJPOT

Ƒ JOUSPEVDF TDBOT GVODUJPOT UIBU BSF SFMBUFE UP GPMET

 #SJOHJOH ZPV JOUP UIF GPME


-FUƊT TUBSU XJUI B RVJDL MPPL BU foldr TIPSU GPS ƌGPME SJHIUƍ 5IJT
JT UIF GPME ZPVƊMM NPTU PǒFO XBOU UP VTF XJUI MJTUT 5IF GPMMPX
JOH UZQF TJHOBUVSF NBZ MPPL B MJUUMF IBJSZ CVU MFUƊT DPNQBSF JU

/PUF UIBU B DBUBNPSQIJTN DBO CSFBL EPXO UIF TUSVDUVSF CVU UIBU TUSVDUVSF NJHIU CF
SFCVJMU TP UP TQFBL EVSJOH FWBMVBUJPO 5IBU JT GPMET DBO SFUVSO MJTUT BT SFTVMUT
$)"15&3  %"5" 4536$563& 03*(".* 

UP XIBU XF LOPX BCPVU NBQQJOH /PUF UIBU UIF UZQF PG foldr


NBZ CF EJƵFSFOU JG ZPV IBWF ()$  PS OFXFS

-- GHC 7.8 and older


foldr :: (a -> b -> b) -> b -> [a] -> b

-- GHC 7.10 and newer


foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b

5IFO MJOFE VQ OFYU UP FBDI PUIFS

foldr :: Foldable t =>


(a -> b -> b) -> b -> t a -> b
foldr :: (a -> b -> b) -> b -> [] a -> b

'PS OPX BMM ZPV OFFE UP LOPX JT UIBU ()$  BCTUSBDUFE
PVU UIF MJTUTQFDJƶD QBSU PG GPMEJOH JOUP B UZQFDMBTT UIBU MFUT ZPV
SFVTF UIF TBNF GPMEJOH GVODUJPOT GPS BOZ EBUBUZQF UIBU DBO CF
GPMEFE Ƈ OPU KVTU MJTUT 8F DBO FWFO SFDPWFS UIF NPSF DPODSFUF
UZQF CFDBVTF XF DBO BMXBZT NBLF B UZQF NPSF DPODSFUF CVU
OFWFS NPSF HFOFSJD

Prelude> :t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
Prelude> :{
*Prelude| let listFoldr = foldr :: (a -> b -> b) ->
*Prelude| b -> [] a -> b
$)"15&3  %"5" 4536$563& 03*(".* 

*Prelude| :}
Prelude> :t listFoldr
listFoldr :: (a -> b -> b) -> b -> [a] -> b

/PX MFUƊT OPUJDF B QBSBMMFM CFUXFFO map BOE foldr

foldr :: (a -> b -> b) -> b -> [a] -> b

-- Remember how map worked?


map :: (a -> b) -> [a] -> [b]
map (+1) 1 : 2 : 3 : []

(+1) 1 : (+1) 2 : (+1) 3 : []

-- Given the list


foldr (+) 0 (1 : 2 : 3 : [])

1 + (2 + (3 + 0))

8IFSF map BQQMJFT B GVODUJPO UP FBDI NFNCFS PG B MJTU BOE


SFUVSOT B MJTU B GPME SFQMBDFT UIF DPOT DPOTUSVDUPST XJUI UIF
GVODUJPO BOE SFEVDFT UIF MJTU

 3FDVSTJWF QBUUFSOT


-FUƊT SFWJTJU sum
$)"15&3  %"5" 4536$563& 03*(".* 

Prelude> sum [1, 5, 10]


16

"T XFƊWF TFFO JU UBLFT B MJTU BEET UIF FMFNFOUT UPHFUIFS


BOE SFUVSOT B TJOHMF SFTVMU :PV NJHIU UIJOL PG JU BT TJNJMBS
UP UIF map GVODUJPOT XFƊWF MPPLFE BU FYDFQU UIBU JUƊT NBQQJOH
(+) PWFS UIF MJTU SFQMBDJOH UIF DPOT PQFSBUPST UIFNTFMWFT BOE
SFUVSOJOH B TJOHMF SFTVMU JOTUFBE PG NBQQJOH GPS FYBNQMF (+1)
JOUP FBDI DPOT DFMM BOE SFUVSOJOH B XIPMF MJTU PG SFTVMUT CBDL
UP VT 5IJT IBT UIF FƵFDU PG CPUI NBQQJOH BO PQFSBUPS PWFS B
MJTU BOE BMTP SFEVDJOH UIF MJTU *O B QSFWJPVT TFDUJPO XF XSPUF
sum JO UFSNT PG SFDVSTJPO

sum :: [Integer] -> Integer


sum [] = 0
sum (x:xs) = x + sum xs

"OE JG XF CSJOH CBDL PVS length GVODUJPO GSPN FBSMJFS

length :: [a] -> Integer


length [] = 0
length (_:xs) = 1 + length xs

%P ZPV TFF TPNF TUSVDUVSBM TJNJMJBSJUZ 8IBU JG ZPV MPPL BU


product BOE concat BT XFMM
$)"15&3  %"5" 4536$563& 03*(".* 

product :: [Integer] -> Integer


product [] = 1
product (x:xs) = x * product xs

concat :: [[a]] -> [a]


concat [] = []
concat (x:xs) = x ++ concat xs

*O FBDI DBTF UIF CBTF DBTF JT UIF JEFOUJUZ GPS UIBU GVODUJPO
4P UIF JEFOUJUZ GPS sum length product BOE concat SFTQFDUJWFMZ
BSF    BOE [] 8IFO XF EP BEEJUJPO BEEJOH [FSP HJWFT VT
UIF TBNF SFTVMU BT PVS JOJUJBM WBMVF 1 + 0 = 1 #VU XIFO XF EP
NVMUJQMJDBUJPO JUƊT NVMUJQMZJOH CZ  UIBU HJWFT VT UIF JEFOUJUZ
2 * 1 = 2 8JUI MJTU DPODBUFOBUJPO UIF JEFOUJUZ JT UIF FNQUZ
MJTU TVDI UIBU [1, 2, 3] ++ [] == [1, 2, 3]
"MTP FBDI PG UIFN IBT B NBJO GVODUJPO XJUI B SFDVSTJWF
QBUUFSO UIBU BTTPDJBUFT UP UIF SJHIU 5IF IFBE PG UIF MJTU HFUT
FWBMVBUFE TFU BTJEF BOE UIFO UIF GVODUJPO NPWFT UP UIF SJHIU
FWBMVBUFT UIF OFYU IFBE BOE TP PO

 'PME SJHIU


8F DBMM foldr UIF ƌSJHIU GPMEƍ CFDBVTF UIF GPME JT SJHIU BTTP
DJBUJWF UIBU JT JU BTTPDJBUFT UP UIF SJHIU 5IJT JT TZOUBDUJDBMMZ
SFƷFDUFE JO B TUSBJHIUGPSXBSE EFƶOJUJPO PG foldr BT XFMM
$)"15&3  %"5" 4536$563& 03*(".* 

foldr :: (a -> b -> b) -> b -> [a] -> b


foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)

5IF TJNJMBSJUJFT CFUXFFO UIJT BOE UIF SFDVSTJWF QBUUFSOT XF


TBX BCPWF TIPVME CF DMFBS 5IF ƌSFTU PG UIF GPME ƍ (foldr f z xs)
JT BO BSHVNFOU UP UIF GVODUJPO f XFƊSF GPMEJOH XJUI 5IF z JT
UIF [FSP PG PVS GPME *U QSPWJEFT B GBMMCBDL WBMVF GPS UIF FNQUZ
MJTU DBTF BOE B TFDPOE BSHVNFOU UP CFHJO PVS GPME XJUI 5IF
[FSP JT PǒFO UIF JEFOUJUZ GPS XIBUFWFS GVODUJPO XFƊSF GPMEJOH
XJUI TVDI BT 0 GPS (+) BOE 1 GPS (*)

)PX GPMES FWBMVBUFT


8FƊSF HPJOH UP SFKJHHFS PVS EFƶOJUJPO PG foldr B MJUUMF CJU *U
XPOƊU DIBOHF UIF TFNBOUJDT CVU JUƊMM NBLF JU FBTJFS UP XSJUF PVU
XIBUƊT IBQQFOJOH

foldr :: (a -> b -> b) -> b -> [a] -> b


foldr f z xs =
case xs of
[] -> z
(x:xs) -> f x (foldr f z xs)

)FSF XF TFF IPX UIF SJHIU GPME BTTPDJBUFT UP UIF SJHIU 5IJT
XJMM SFEVDF KVTU MJLF UIF sum FYBNQMF GSPN FBSMJFS
$)"15&3  %"5" 4536$563& 03*(".* 

-- we're reducing:
foldr (+) 0 [1, 2, 3]

-- First step, what's ``xs'' in our case expression?


foldr (+) 0 [1, 2, 3] =
case [1, 2, 3] of
...

-- What case of the expression matches?


foldr (+) 0 [1, 2, 3] =
case [1, 2, 3] of
[] -> 0
(x:xs) -> f x (foldr f z xs) --<--- this one

-- What are f, x, xs, and z in that


-- branch of the case?
foldr (+) 0 [1, 2, 3] =
case [1, 2, 3] of
[] -> 0
(1 : [2, 3]) -> (+) 1 (foldr (+) 0 [2, 3])

$SJUJDBMMZ XFƊSF HPJOH UP FYQBOE (foldr (+) 0 [2, 3]) POMZ


CFDBVTF (+) JT TUSJDU JO CPUI PG JUT BSHVNFOUT TP JU GPSDFT UIF
OFYU JUFSBUJPO 8F DPVME IBWF B GVODUJPO XIJDI EPFTOƊU DPOUJO
VBMMZ GPSDF UIF SFTU PG UIF GPME *G JU XFSF UP TUPQ PO UIF ƶSTU DBTF
$)"15&3  %"5" 4536$563& 03*(".* 

IFSF UIFO JU XPVMEƊWF SFUVSOFE UIF WBMVF  0OF TVDI GVODUJPO


JT const XIJDI BMXBZT SFUVSOT UIF ƶSTU BSHVNFOU 8FƊMM TIPX
ZPV IPX UIBU CFIBWFT JO B CJU 0VS OFYU SFDVSTJPO JT UIF GPMES

 < >


-- there is (+) 1 implicitly wrapped around this


-- continuation of the recursive fold

foldr (+) 0 [2, 3] =


case [2, 3] of
[] -> 0 -- this didn't match again
(2 : [3]) -> (+) 2 (foldr (+) 0 [3])

(+) JT OPU POMZ TUSJDU JO CPUI PG JUT BSHVNFOUT CVU JUƊT VODPO
EJUJPOBMMZ TP TP XFƊSF HPJOH UP QSPDFFE UP UIF OFYU SFDVSTJPO PG
foldr /PUF UIBU UIF GVODUJPO DBMMT CPVODF CFUXFFO PVS GPME
JOH GVODUJPO f BOE foldr 5IJT CPVODJOH CBDL BOE GPSUI HJWFT
NPSF DPOUSPM UP UIF GPMEJOH GVODUJPO " IZQPUIFUJDBM GPMEJOH
GVODUJPO TVDI BT const XIJDI EPFTOƊU OFFE UIF TFDPOE BSHV
NFOU IBT UIF PQQPSUVOJUZ UP EP MFTT XPSL CZ OPU FWBMVBUJOH JUT
TFDPOE BSHVNFOU XIJDI JT ƌNPSF PG UIF GPMEƍ
$)"15&3  %"5" 4536$563& 03*(".* 

-- there is (+) 1 ((+) 2 ...) implicitly wrapped


-- around this continuation of the recursive fold

-- Next recursion.
foldr (+) 0 [3] =
case [3] of
[] -> 0 -- this didn't match again
(3 : []) -> (+) 3 (foldr (+) 0 [])

8FƊSF HPJOH UP BTL GPS NPSF foldr POF MBTU UJNF BOE UIFO
XFƊMM IJU PVS CBTF DBTF

-- there is (+) 1 ((+) 2 ((+) 3 ...))


-- implicitly wrapped around this continuation
-- of the recursive fold

-- Last recursion, this is the end of the spine.


foldr (+) 0 [] =
case [] of
[] -> 0 --<-- This one finally matches.
-- ignore the other case, didn't happen.

4P POF XBZ UP UIJOL BCPVU UIF XBZ )BTLFMM FWBMVBUFT JT UIBU


JUƊT MJLF B UFYU SFXSJUJOH TZTUFN 0VS FYQSFTTJPO IBT UIVT GBS
SFXSJUUFO JUTFMG GSPN

foldr (+) 0 [1, 2, 3]


$)"15&3  %"5" 4536$563& 03*(".* 

*OUP

(+) 1 ((+) 2 ((+) 3 0))

*G ZPV XBOUFE UP DMFBO JU VQ B CJU XJUIPVU DIBOHJOH IPX JU


FWBMVBUFT ZPV DPVME NBLF JU UIF GPMMPXJOH

1 + (2 + (3 + 0))

+VTU MJLF JO BSJUINFUJD XF FWBMVBUF JOOFSNPTU QBSFOUIFTFT


ƶSTU

1 + (2 + (3 + 0))

1 + (2 + 3)

1 + 5

"OE OPX XFƊSF EPOF XJUI UIF SFTVMU PG 


8F DBO BMTP VTF B USJDL QPQVMBSJ[FE CZ TPNF IFMQGVM VTFST
JO UIF )BTLFMM *3$ DPNNVOJUZ UP TFF IPX UIF GPME BTTPDJBUFT

Prelude> let xs = map show [1..5]


Prelude> :{

*EFB CPSSPXFE GSPN $BMF (JCCBSE GSPN UIF IBTLFMM 'SFFOPEF *3$ DIBOOFM BOE PO
UIF )BTLFMMPSH XJLJ https://wiki.haskell.org/Fold#Examples
$)"15&3  %"5" 4536$563& 03*(".* 

*Prelude| foldr (\x y -> concat ["(",x,"+",y,")"])


*Prelude| "0" xs
*Prelude| :}
"(1+(2+(3+(4+(5+0)))))"

0OF JOJUJBMMZ OPOPCWJPVT BTQFDU PG GPMEJOH JT UIBU JU IBQ


QFOT JO UXP TUBHFT USBWFSTBM BOE GPMEJOH 5SBWFSTBM JT UIF TUBHF
JO XIJDI UIF GPME SFDVSTFT PWFS UIF TQJOF 'PMEJOH SFGFST UP UIF
FWBMVBUJPO PS SFEVDUJPO PG UIF GPMEJOH GVODUJPO BQQMJFE UP UIF
WBMVFT "MM GPMET SFDVSTF PWFS UIF TQJOF JO UIF TBNF EJSFDUJPO
UIF EJƵFSFODF CFUXFFO MFǒ GPMET BOE SJHIU GPMET JT JO UIF BTTP
DJBUJPO PS QBSFOUIFTJ[BUJPO PG UIF GPMEJOH GVODUJPO BOE UIVT
XIJDI EJSFDUJPO UIF GPMEJOH PS SFEVDUJPO QSPDFFET
8JUI foldr UIF SFTU PG PVS GPME JT BO BSHVNFOU UP UIF GVOD
UJPO XFƊSF GPMEJOH XJUI

foldr f z (x:xs) = f x (foldr f z xs)


-- ^--------------^
-- rest of the fold

(JWFO UIJT UXPTUBHF QSPDFTT BOE OPOTUSJDU FWBMVBUJPO JG


ԕ EPFTOƊU FWBMVBUF JUT TFDPOE BSHVNFOU SFTU PG UIF GPME
OP
NPSF PG UIF TQJOF XJMM CF GPSDFE 0OF PG UIF DPOTFRVFODFT PG
UIJT JT UIBU foldr DBO BWPJE FWBMVBUJOH OPU KVTU TPNF PS BMM PG
UIF WBMVFT JO UIF MJTU CVU TPNF PS BMM PG UIF MJTUƊT TQJOF BT XFMM
'PS UIJT SFBTPO foldr DBO CF VTFE XJUI MJTUT UIBU BSF QPUFOUJBMMZ
JOƶOJUF 'PS FYBNQMF DPNQBSF UIF GPMMPXJOH TFUT PG SFTVMUT
$)"15&3  %"5" 4536$563& 03*(".* 

-- (+) will unconditionally evaluate the entire


-- spine and all of the values
Prelude> foldr (+) 0 [1..5]
15

(JWFO UIBU ZPV IBWF UIF GVODUJPO myAny

myAny :: (a -> Bool) -> [a] -> Bool


myAny f xs =
foldr (\x b -> f x || b) False xs

5IF GPMMPXJOH TIPVME XPSL EFTQJUF CFJOH BO JOƶOJUF MJTU

Prelude> myAny even [1..]


True

5IF GPMMPXJOH XJMM OFWFS ƶOJTI FWBMVBUJOH CFDBVTF JUƊT BMXBZT


BO PEE OVNCFS

Prelude> myAny even (repeat 1)

"OPUIFS UFSN XF VTF GPS UIJT OFWFSFOEJOH FWBMVBUJPO JT


CPUUPN PS undefined 5IFSFƊT OP HVBSBOUFF UIBU B GPME PG BO
JOƶOJUF MJTU XJMM ƶOJTI FWBMVBUJOH FWFO JG ZPV VTFE foldr JU PG
UFO EFQFOET PO UIF JOQVU EBUB BOE UIF GPME GVODUJPO -FU VT
DPOTJEFS TPNF NPSF FYBNQMFT XJUI B MFTT JODPOWFOJFOU CPUUPN
$)"15&3  %"5" 4536$563& 03*(".* 

Prelude> let u = undefined

-- here, we give an undefined value


Prelude> foldr (+) 0 [1, 2, 3, 4, u]
*** Exception: Prelude.undefined

Prelude> foldr (+) 0 (take 4 [1, 2, 3, 4, u])


10

-- here, the undefined is part of the spine


Prelude> foldr (+) 0 ([1, 2, 3, 4] ++ u)
*** Exception: Prelude.undefined
Prelude> foldr (+) 0 (take 4 ([1, 2, 3, 4] ++ u))
10

#Z UBLJOH POMZ UIF ƶSTU GPVS FMFNFOUT XF TUPQ UIF SFDVSTJWF


GPMEJOH QSPDFTT BU KVTU UIF ƶSTU GPVS WBMVFT TP PVS BEEJUJPO
GVODUJPO EPFT OPU SVO JOUP CPUUPN BOE UIBU XPSLT XIFUIFS
undefined JT POF PG UIF WBMVFT PS QBSU PG UIF TQJOF
5IF length GVODUJPO CFIBWFT EJƵFSFOUMZ JU FWBMVBUFT UIF
TQJOF VODPOEJUJPOBMMZ CVU OPU UIF WBMVFT

Prelude> length [1, 2, 3, 4, undefined]


5
Prelude> length ([1, 2, 3, 4] ++ undefined)
*** Exception: Prelude.undefined
$)"15&3  %"5" 4536$563& 03*(".* 

)PXFWFS JG XF ESPQ UIF QBSU PG UIF TQJOF UIBU JODMVEFT UIF


CPUUPN CFGPSF XF VTF length XF DBO HFU BO FYQSFTTJPO UIBU
XPSLT

Prelude> length (take 4 ([1, 2, 3, 4] ++ undefined))


4

take JT OPOTUSJDU MJLF FWFSZUIJOH FMTF ZPVƊWF TFFO TP GBS BOE


JO UIJT DBTF JU POMZ SFUVSOT BT NVDI MJTU BT ZPV BTL GPS 5IF EJG
GFSFODF JO XIBU JU EPFT JT JU TUPQT SFUVSOJOH FMFNFOUT PG UIF MJTU
JU XBT HJWFO XIFO JU IJUT UIF MFOHUI MJNJU ZPV HBWF JU $POTJEFS
UIJT

Prelude> length $ take 2 $ take 4 ([1, 2]++undefined)


2

*U EPFTOƊU NBUUFS UIBU take 4 DPVMEƊWF IJU UIF CPUUPN /PUIJOH


GPSDFE JU UP CFDBVTF PG UIF take 2 CFUXFFO JU BOE MFOHUI
/PX UIBU XFƊWF TFFO IPX UIF SFDVSTJWF TFDPOE BSHVNFOU UP
foldrƊT GPMEJOH GVODUJPO XPSLT MFUƊT DPOTJEFS UIF ƶSTU BSHVNFOU

foldr :: (a -> b -> b) -> b -> [a] -> b


foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
-- [1]

5IF ƶSTU BSHVNFOU [1] JOWPMWFT B QBUUFSO NBUDI UIBU JT TUSJDU


CZ EFGBVMU Ƈ UIF f POMZ BQQMJFT UP x JG UIFSF JT BO x WBMVF BOE
$)"15&3  %"5" 4536$563& 03*(".* 

OPU KVTU BO FNQUZ MJTU 5IJT NFBOT UIBU foldr NVTU GPSDF BO
JOJUJBM DPOT DFMM JO PSEFS UP EJTDSJNJOBUF CFUXFFO UIF [] BOE
UIF (x : xs) DBTFT TP UIF ƶSTU DPOT DFMM DBOOPU CF VOEFƶOFE
/PX XFƊSF HPJOH UP USZ TPNFUIJOH VOVTVBM UP EFNPOTUSBUF
UIBU UIF ƶSTU CJU PG UIF TQJOF NVTU CF FWBMVBUFE CZ foldr 8F
IBWF B TPNFXIBU TJMMZ BOPOZNPVT GVODUJPO UIBU XJMM JHOPSF BMM
JUT BSHVNFOUT BOE KVTU SFUVSO B WBMVF PG  8FƊSF VTJOH JU
XJUI foldr CFDBVTF JU XJMM OFWFS GPSDF FWBMVBUJPO PG BOZ PG JUT
BSHVNFOUT TP XF DBO IBWF B CPUUPN BT B WBMVF PS BT QBSU PG
UIF TQJOF BOE JU XJMM OPU GPSDF BO FWBMVBUJPO

Prelude> foldr (\_ _ -> 9001) 0 [1..5]


9001
Prelude> foldr (\_ _ -> 9001) 0 [1, 2, 3, undefined]
9001
Prelude> foldr (\_ _ -> 9001) 0 ([1, 2, 3] ++ undefined)
9001

&WFSZUIJOH JT ƶOF VOMFTT UIF ƶSTU QJFDF PG UIF TQJOF JT CPU


UPN

Prelude> foldr (\_ _ -> 9001) 0 undefined


*** Exception: Prelude.undefined

Prelude> foldr (\_ _ -> 9001) 0 [1, undefined]


9001
Prelude> foldr (\_ _ -> 9001) 0 [undefined, undefined]
$)"15&3  %"5" 4536$563& 03*(".* 

9001

5IF ƶOBM UXP FYBNQMFT XPSL CFDBVTF JU JTOƊU UIF ƶSTU DPOT
DFMM UIBU JT CPUUPN ƈ UIF VOEFƶOFE WBMVFT BSF JOTJEF UIF DPOT
DFMMT OPU JO UIF TQJOF JUTFMG 1VU EJƵFSFOUMZ UIF DPOT DFMMT
DPOUBJO CPUUPN WBMVFT CVU BSF OPU UIFNTFMWFT CPUUPN 8F XJMM
FYQFSJNFOU MBUFS XJUI OPOTUSJDUOFTT BOE TUSJDUOFTT UP TFF IPX
JU BƵFDUT UIF XBZ PVS QSPHSBNT FWBMVBUF
5SBWFSTJOH UIF SFTU PG UIF TQJOF EPFTOƊU PDDVS VOMFTT UIF
GVODUJPO BTLT GPS UIF SFTVMUT PG IBWJOH GPMEFE UIF SFTU PG UIF MJTU
*O UIF GPMMPXJOH FYBNQMFT XF EPOƊU GPSDF USBWFSTBM PG UIF TQJOF
CFDBVTF const KVTU UISPXT BXBZ JUT TFDPOE BSHVNFOU XIJDI JT
UIF SFTU PG UIF GPME

-- reminder:
-- const :: a -> b -> a
-- const x _ = x

Prelude> const 1 2
1
Prelude> const 2 1
2
Prelude> foldr const 0 [1..5]
1
Prelude> foldr const 0 [1, undefined]
1
$)"15&3  %"5" 4536$563& 03*(".* 

Prelude> foldr const 0 ([1, 2] ++ undefined)


1
Prelude> foldr const 0 [undefined, 2]
*** Exception: Prelude.undefined

/PX UIBU XFƊWF TFFO IPX foldr FWBMVBUFT XFƊSF HPJOH UP


MPPL BU foldl CFGPSF XF NPWF PO UP MFBSOJOH IPX UP XSJUF BOE
VTF GPMET

 'PME MFǒ


#FDBVTF PG UIF XBZ MJTUT XPSL GPMET NVTU ƶSTU SFDVSTF PWFS
UIF TQJOF PG UIF MJTU GSPN UIF CFHJOOJOH UP UIF FOE -Fǒ GPMET
USBWFSTF UIF TQJOF JO UIF TBNF EJSFDUJPO BT SJHIU GPMET CVU UIFJS
GPMEJOH QSPDFTT JT MFǒ BTTPDJBUJWF BOE QSPDFFET JO UIF PQQPTJUF
EJSFDUJPO BT UIBU PG foldr
)FSFƊT B TJNQMF EFƶOJUJPO PG foldl /PUF UIBU UP TFF UIF TBNF
UZQF GPS foldl JO ZPVS ()$J 3&1- ZPV XJMM OFFE UP JNQPSU
Data.List GPS UIF TBNF SFBTPOT BT XJUI foldr

-- again, different type in GHC 7.10 and newer.

foldl :: (b -> a -> b) -> b -> [a] -> b


foldl f acc [] = acc
foldl f acc (x:xs) = foldl f (f acc x) xs
$)"15&3  %"5" 4536$563& 03*(".* 

foldl :: (b -> a -> b) -> b -> [a] -> b

-- Given the list


foldl (+) 0 (1 : 2 : 3 : [])

-- foldl associates like so


((0 + 1) + 2) + 3

8F DBO BMTP VTF UIF TBNF USJDL XF VTFE UP TFF UIF BTTPDJB
UJWJUZ PG foldr UP TFF UIF BTTPDJBUJWJUZ PG foldl

Prelude> let f = (\x y -> concat ["(",x,"+",y,")"])

Prelude> foldl f "0" (map show [1..5])


"(((((0+1)+2)+3)+4)+5)"

8F DBO TFF GSPN UIJT UIBU foldl CFHJOT JUT SFEVDUJPO QSPDFTT
CZ BEEJOH UIF acc BDDVNVMBUPS
WBMVF UP UIF IFBE PG UIF MJTU
XIFSFBT foldr IBE BEEFE JU UP UIF ƶOBM FMFNFOU PG UIF MJTU ƶSTU
8F DBO BMTP VTF GVODUJPOT DBMMFE TDBOT UP TFF IPX GPMET FWBM
VBUF 4DBOT BSF TJNJMBS UP GPMET CVU SFUVSO B MJTU PG BMM UIF JOUFS
NFEJBUF TUBHFT PG UIF GPME 8F DBO DPNQBSF scanr BOE scanl UP
UIFJS BDDPNQBOZJOH GPMET UP TFF UIF EJƵFSFODF JO FWBMVBUJPO

Prelude> foldr (+) 0 [1..5]


15
Prelude> scanr (+) 0 [1..5]
$)"15&3  %"5" 4536$563& 03*(".* 

[15,14,12,9,5,0]

Prelude> foldl (+) 0 [1..5]


15
Prelude> scanl (+) 0 [1..5]
[0,1,3,6,10,15]

5IF SFMBUJPOTIJQ CFUXFFO UIF TDBOT BOE GPMET BSF BT GPMMPXT

last (scanl f z xs) = foldl f z xs


head (scanr f z xs) = foldr f z xs

&BDI GPME XJMM SFUVSO UIF TBNF SFTVMU GPS UIJT PQFSBUJPO CVU
XF DBO TFF GSPN UIF TDBOT UIBU UIFZ BSSJWF BU UIBU SFTVMU JO B
EJƵFSFOU PSEFS EVF UP UIF EJƵFSFOU BTTPDJBUJWJUZ 8FƊMM UBML
NPSF BCPVU TDBOT MBUFS

"TTPDJBUJWJUZ BOE GPMEJOH


/FYU XFƊMM UBLF B DMPTFS MPPL BU TPNF PG UIF FƵFDUT PG UIF BTTP
DJBUJWJUZ PG foldl "T XFƊWF TBJE CPUI GPMET USBWFSTF UIF TQJOF
JO UIF TBNF EJSFDUJPO 8IBUƊT EJƵFSFOU JT UIF BTTPDJBUJWJUZ PG
UIF FWBMVBUJPO
5IF GVOEBNFOUBM XBZ UP UIJOL BCPVU FWBMVBUJPO JO )BTLFMM
JT BT TVCTUJUVUJPO 8IFO XF VTF B SJHIU GPME PO B MJTU XJUI UIF
GVODUJPO ԕ BOE TUBSU WBMVF ԩ XFƊSF JO B TFOTF SFQMBDJOH UIF
DPOT DPOTUSVDUPST XJUI PVS GPMEJOH GVODUJPO BOE UIF FNQUZ MJTU
DPOTUSVDUPS XJUI PVS TUBSU WBMVF ԩ
$)"15&3  %"5" 4536$563& 03*(".* 

[1..3] == 1 : 2 : 3 : []

foldr f z [1, 2, 3]
1 `f` (foldr f z [2, 3])
1 `f` (2 `f` (foldr f z [3]))
1 `f` (2 `f` (3 `f` (foldr f z [])))
1 `f` (2 `f` (3 `f` z))

'VSUIFSNPSF MB[Z FWBMVBUJPO MFUT PVS GVODUJPOT SBUIFS UIBO


UIF BNCJFOU TFNBOUJDT PG UIF MBOHVBHF EJDUBUF XIBU PSEFS
UIJOHT HFU FWBMVBUFE JO #FDBVTF PG UIJT UIF QBSFOUIFTFT BSF SFBM
*O UIF BCPWF UIF 3 `f` z QBJSJOH HFUT FWBMVBUFE ƶSTU CFDBVTF
JUƊT JO UIF JOOFSNPTU QBSFOUIFTFT 3JHIU GPMET IBWF UP USBWFSTF
UIF MJTU PVUTJEFJO CVU UIF GPMEJOH JUTFMG TUBSUT GSPN UIF FOE PG
UIF MJTU
*UƊT IBSE UP TFF UIJT XJUI BSJUINFUJD GVODUJPOT UIBU BSF BT
TPDJBUJWF TVDI BT BEEJUJPO CVU JUƊT BO JNQPSUBOU QPJOU UP VO
EFSTUBOE TP XFƊMM SVO UISPVHI TPNF EJƵFSFOU FYBNQMFT -FUƊT
TUBSU CZ VTJOH BO BSJUINFUJD PQFSBUJPO UIBU JTOƊU BTTPDJBUJWF

Prelude> foldr (^) 2 [1..3]


1
Prelude> foldl (^) 2 [1..3]
64

5IJT UJNF XF DBO TFF DMFBSMZ UIBU XF HPU EJƵFSFOU SFTVMUT BOE
$)"15&3  %"5" 4536$563& 03*(".* 

UIBU EJƵFSFODF SFTVMUT GSPN UIF XBZ UIF GVODUJPOT BTTPDJBUF


)FSFƊT B CSFBLEPXO

-- if you want to follow along,


-- use paper and not the REPL.
foldr (^) 2 [1..3]
(1 ^ (2 ^ (3 ^ 2)))
(1 ^ (2 ^ 9))
1 ^ 512
1

$POUSBTU UIBU XJUI UIJT

foldl (^) 2 [1..3]


((2 ^ 1) ^ 2) ^ 3
(2 ^ 2) ^ 3
4 ^ 3
64

*O UIJT OFYU TFU PG DPNQBSJTPOT XF XJMM EFNPOTUSBUF UIF


FƵFDU PG BTTPDJBUJWJUZ PO BSHVNFOU PSEFS CZ GPMEJOH UIF MJTU
JOUP B OFX MJTU MJLF UIJT

Prelude> foldr (:) [] [1..3]


[1,2,3]
Prelude> foldl (flip (:)) [] [1..3]
[3,2,1]
$)"15&3  %"5" 4536$563& 03*(".* 

8F NVTU VTF flip XJUI foldl -FUƊT FYBNJOF XIZ


+VTU MJLF B SJHIU GPME B MFǒ GPME DBOOPU QFSGPSN NBHJD BOE HP
UP UIF FOE PG UIF MJTU JOTUBOUMZ JU NVTU TUBSU GSPN UIF CFHJOOJOH
PG UIF MJTU )PXFWFS UIF QBSFOUIFTFT EJDUBUF IPX PVS DPEF
FWBMVBUFT 5IF UZQF PG UIF BSHVNFOU UP UIF GPMEJOH GVODUJPO
DIBOHFT JO BEEJUJPO UP UIF BTTPDJBUJWJUZ

foldr :: (a -> b -> b) -> b -> [a] -> b


-- [1] [2] [3]
foldl :: (b -> a -> b) -> b -> [a] -> b
-- [4] [5] [6]

 5IF QBSBNFUFS PG UZQF Ԑ SFQSFTFOUT POF PG UIF MJTU FMFNFOU


BSHVNFOUT UIF GPMEJOH GVODUJPO PG foldr JT BQQMJFE UP

 5IF QBSBNFUFS PG UZQF ԑ XJMM FJUIFS CF UIF TUBSU WBMVF PS


UIF SFTVMU PG UIF GPME BDDVNVMBUFE TP GBS EFQFOEJOH PO
IPX GBS ZPV BSF JOUP UIF GPME

 5IF ƶOBM SFTVMU PG IBWJOH DPNCJOFE UIF MJTU FMFNFOU BOE


UIF TUBSU WBMVF PS GPME TP GBS UP DPNQVUF UIF GPME

 5IF TUBSU WBMVF PS GPME BDDVNVMBUFE TP GBS JT UIF ƶSTU BS


HVNFOU UP foldlƊT GPMEJOH GVODUJPO

 5IF MJTU FMFNFOU JT UIF TFDPOE BSHVNFOU UP foldlƊT GPMEJOH


GVODUJPO
$)"15&3  %"5" 4536$563& 03*(".* 

 5IF ƶOBM SFTVMU PG foldlƊT GPME GVODUJPO JT PG UZQF ԑ KVTU MJLF


UIBU PG foldr

5IF UZQF PG (:) SFRVJSFT UIBU B WBMVF CF UIF ƶSTU BSHVNFOU


BOE B MJTU CF UIF TFDPOE BSHVNFOU

(:) :: a -> [a] -> [a]

4P UIF WBMVF JT QSFQFOEFE PS ƌDPOTFE POUP ƍ UIF GSPOU PG


UIBU MJTU
*O UIF GPMMPXJOH FYBNQMFT UIF UJMEF NFBOT ƌJT FRVJWBMFOU PS
FRVBM UPƍ *G XF XSJUF B SJHIU GPME UIBU IBT UIF DPOT DPOTUSVDUPS
BT PVS ԕ BOE UIF FNQUZ MJTU BT PVS ԩ XF HFU

-- foldr f z [1, 2, 3]
-- f ~ (:); z ~ []
-- Run it in your REPL. It'll return True.
foldr (:) [] (1 : 2 : 3 : []) == 1 : (2 : (3 : []))

5IF DPOTJOH QSPDFTT GPS foldr NBUDIFT UIF UZQF TJHOBUVSF


GPS (:) *U BMTP SFQSPEVDFT UIF TBNF MJTU CFDBVTF XFƊSF SFQMBDJOH
UIF DPOT DPOTUSVDUPST XJUI DPOT DPOTUSVDUPST BOE UIF OVMM MJTU
XJUI OVMM MJTU )PXFWFS GPS JU UP CF JEFOUJDBM JU BMTP IBT UP CF
SJHIU BTTPDJBUJWF
%PJOH UIF TBNF XJUI foldl EPFT OPU QSPEVDF UIF TBNF SFTVMU
8IFO VTJOH foldl UIF SFTVMU XFƊWF BDDVNVMBUFE TP GBS JT UIF
ƶSTU BSHVNFOU JOTUFBE PG UIF MJTU FMFNFOU 5IJT JT PQQPTJUF PG
$)"15&3  %"5" 4536$563& 03*(".* 

XIBU (:) FYQFDUT JG XFƊSF BDDVNVMBUJOH B MJTU 5SZJOH UP GPME


UIF JEFOUJUZ PG UIF MJTU BT BCPWF CVU XJUI foldl XPVME HJWF VT B
UZQF FSSPS CFDBVTF UIF SFDPOTUSVDUJOH QSPDFTT GPS foldl XPVME
MPPL MJLF UIJT

foldl f z [1, 2, 3]
-- f ~ (:); z ~ []
-- (((z `f` 1) `f` 2) `f` 3)
((([] : 1) : 2) : 3)

5IBU XPOƊU XPSL CFDBVTF UIF ԩ JT BO FNQUZ MJTU BOE UIF ԕ JT


DPOT TP XF IBWF UIF PSEFS PG BSHVNFOUT CBDLXBSET GPS DPOT
&OUFS flip XIPTF KPC JT UP UBLF CBDLXBSET BSHVNFOUT BOE UVSO
UIBU GSPXO VQTJEF EPXO *U XJMM ƷJQ FBDI TFU PG BSHVNFOUT
BSPVOE GPS VT MJLF UIJT

foldl f z [1, 2, 3]
-- f ~ (flip (:)); z ~ []
-- (((z `f` 1) `f` 2) `f` 3)
f = flip (:)
((([] `f` 1) `f` 2) `f` 3)
(([1] `f` 2) `f` 3)
([2, 1] `f` 3)
[3, 2, 1]
$)"15&3  %"5" 4536$563& 03*(".* 

&WFO XIFO XFƊWF TBUJTƶFE UIF UZQFT CZ ƷJQQJOH UIJOHT BSPVOE


UIF MFǒBTTPDJBUJOH OBUVSF PG foldl MFBET UP B EJƵFSFOU SFTVMU
GSPN UIBU PG foldr
'PS UIF OFYU TFU PG DPNQBSJTPOT XFƊSF HPJOH UP VTF B GVOD
UJPO DBMMFE const UIBU UBLFT UXP BSHVNFOUT BOE BMXBZT SFUVSOT
UIF ƶSTU POF 8IFO XF GPME const PWFS B MJTU JU XJMM UBLF BT JUT
ƶSTU QBJS PG BSHVNFOUT UIF acc WBMVF BOE B WBMVF GSPN UIF MJTU
ƈ XIJDI WBMVF JU UBLFT ƶSTU EFQFOET PO XIJDI UZQF PG GPME JU JT
8FƊMM TIPX ZPV IPX JU FWBMVBUFT GPS UIF ƶSTU FYBNQMF

Prelude> foldr const 0 [1..5]


(const 1 _)
1

4JODF const EPFTOƊU FWBMVBUF JUT TFDPOE BSHVNFOU UIF SFTU PG


UIF GPME JT OFWFS FWBMVBUFE 5IF VOEFSTDPSF SFQSFTFOUT UIF SFTU
PG UIF VOFWBMVBUFE GPME /PX MFUƊT MPPL BU UIF FƵFDU PG ƷJQQJOH
UIF BSHVNFOUT 5IF 0 SFTVMU JT CFDBVTF [FSP JT PVS BDDVNVMBUPS
WBMVF IFSF TP JUƊT UIF ƶSTU PS MBTU
WBMVF PG UIF MJTU

Prelude> foldr (flip const) 0 [1..5]


0

/FYU MFUƊT MPPL BU XIBU IBQQFOT XIFO XF VTF UIF TBNF GVOD
UJPOT CVU UIJT UJNF XJUI foldl 5BLF B GFX NPNFOUT UP VOEFS
TUBOE UIF FWBMVBUJPO QSPDFTT UIBU MFBET UP UIFTF SFTVMUT
$)"15&3  %"5" 4536$563& 03*(".* 

Prelude> foldl (flip const) 0 [1..5]


5
Prelude> foldl const 0 [1..5]
0

5IJT JT UIF FƵFDU PG MFǒ BTTPDJBUJWJUZ 5IF TQJOF USBWFSTBM


IBQQFOT JO UIF TBNF PSEFS JO B MFǒ PS SJHIU GPME ƈ JU NVTU
CFDBVTF PG UIF XBZ MJTUT BSF EFƶOFE *G ZPVS GPMEJOH GVODUJPO
JTOƊU DPNNVUBUJWF B MFǒ GPME DBO MFBE UP B EJƵFSFOU SFTVMU UIBO
B SJHIU GPME PG UIF TBNF

&YFSDJTFT 6OEFSTUBOEJOH 'PMET


 foldr (*) 1 [1..5]

XJMM SFUVSO UIF TBNF SFTVMU BT XIJDI PG UIF GPMMPXJOH

B
flip (*) 1 [1..5]
C
foldl (flip (*)) 1 [1..5]
D
foldl (*) 1 [1..5]

 8SJUF PVU UIF FWBMVBUJPO TUFQT GPS

foldl (flip (*)) 1 [1..3]

 0OF EJƵFSFODF CFUXFFO foldr BOE foldl JT

B
foldr CVU OPU foldl USBWFSTFT UIF TQJOF PG B MJTU GSPN
SJHIU UP MFǒ
$)"15&3  %"5" 4536$563& 03*(".* 

C
foldr CVU OPU foldl BMXBZT GPSDFT UIF SFTU PG UIF GPME
D
foldr CVU OPU foldl BTTPDJBUFT UP UIF SJHIU
E
foldr CVU OPU foldl JT SFDVSTJWF

 'PMET BSF DBUBNPSQIJTNT XIJDI NFBOT UIFZ BSF HFOFSBMMZ


VTFE UP

B
SFEVDF TUSVDUVSF
C
FYQBOE TUSVDUVSF
D
SFOEFS ZPV DBUBUPOJD
E
HFOFSBUF JOƶOJUF EBUB TUSVDUVSFT

 5IF GPMMPXJOH BSF TJNQMF GPMET WFSZ TJNJMBS UP XIBU ZPVƊWF


BMSFBEZ TFFO CVU FBDI IBT BU MFBTU POF FSSPS 1MFBTF ƶY
UIFN BOE UFTU JO ZPVS 3&1-

B
foldr (++) ["woot", "WOOT", "woot"]

C
foldr max [] "fear is the little death"

D
foldr and True [False, True]

E
5IJT POF JT NPSF TVCUMF UIBO UIF QSFWJPVT $BO JU FWFS
SFUVSO B EJƵFSFOU BOTXFS

foldr (||) True [False, True]

F
foldl ((++) . show) "" [1..5]

G
foldr const 'a' [1..5]
$)"15&3  %"5" 4536$563& 03*(".* 

H
foldr const 0 "tacos"

I
foldl (flip const) 0 "burritos"

J
foldl (flip const) 'z' [1..5]

6ODPOEJUJPOBM TQJOF SFDVSTJPO


"O JNQPSUBOU EJƵFSFODF CFUXFFO foldr BOE foldl JT UIBU B MFǒ
GPME IBT UIF TVDDFTTJWF TUFQT PG UIF GPME BT JUT ƶSTU BSHVNFOU
5IF OFYU SFDVSTJPO PG UIF TQJOF JTOƊU JOUFSNFEJBUFE CZ UIF
GPMEJOH GVODUJPO BT JU JT JO foldr XIJDI BMTP NFBOT SFDVSTJPO PG
UIF TQJOF JT VODPOEJUJPOBM )BWJOH B GVODUJPO UIBU EPFTOƊU GPSDF
FWBMVBUJPO PG FJUIFS PG JUT BSHVNFOUT XPOƊU DIBOHF BOZUIJOH
-FUƊT SFWJFX const

Prelude> const 1 undefined


1
Prelude> (flip const) 1 undefined
*** Exception: Prelude.undefined
Prelude> (flip const) undefined 1
1

/PX DPNQBSF

Prelude> foldr const 0 ([1..5] ++ undefined)


1
Prelude> foldr (flip const) 0 ([1..5] ++ undefined)
*** Exception: Prelude.undefined
$)"15&3  %"5" 4536$563& 03*(".* 

Prelude> foldl const 0 ([1..5] ++ undefined)


*** Exception: Prelude.undefined
Prelude> foldl (flip const) 0 ([1..5] ++ undefined)
*** Exception: Prelude.undefined

)PXFWFS XIJMF foldl VODPOEJUJPOBMMZ FWBMVBUFT UIF TQJOF


ZPV DBO TUJMM TFMFDUJWFMZ FWBMVBUF UIF WBMVFT JO UIF MJTU

Prelude> foldl (\_ _ -> 5) 0 ([1..5] ++ undefined)


*** Exception: Prelude.undefined
-- error because bottom is part of the spine
-- and foldl must evaluate the spine

Prelude> foldl (\_ _ -> 5) 0 ([1..5] ++ [undefined])


5
-- this is OK because here bottom is a value

5IJT GFBUVSF NFBOT UIBU foldl JT HFOFSBMMZ JOBQQSPQSJBUF


XJUI MJTUT UIBU BSF PS DPVME CF JOƶOJUF CVU UIF DPNCJOBUJPO PG
UIF GPSDFE TQJOF FWBMVBUJPO XJUI OPOTUSJDUOFTT NFBOT UIBU JU JT
BMTP VTVBMMZ JOBQQSPQSJBUF FWFO GPS MPOH MJTUT BT UIF GPSDFE FWBM
VBUJPO PG UIF TQJOF BƵFDUT QFSGPSNBODF OFHBUJWFMZ #FDBVTF
foldl NVTU FWBMVBUF JUT XIPMF TQJOF CFGPSF JU TUBSUT FWBMVBUJOH
WBMVFT JO FBDI DFMM JU BDDVNVMBUFT B QJMF PG VOFWBMVBUFE WBMVFT
BT JU USBWFSTFT UIF TQJOF
$)"15&3  %"5" 4536$563& 03*(".* 

*O NPTU DBTFT XIFO ZPV OFFE B MFǒ GPME ZPV TIPVME VTF
foldl' 5IJT GVODUJPO DBMMFE ƌGPMEMQSJNF ƍ XPSLT UIF TBNF
FYDFQU JU JT TUSJDU *O PUIFS XPSET JU GPSDFT FWBMVBUJPO PG UIF
WBMVFT JOTJEF DPOT DFMMT BT JU USBWFSTFT UIF TQJOF SBUIFS UIBO
BDDVNVMBUJOH VOFWBMVBUFE FYQSFTTJPOT GPS FBDI FMFNFOU PG
UIF MJTU 5IF TUSJDU FWBMVBUJPO IFSF NFBOT JU IBT MFTT OFHBUJWF
FƵFDU PO QFSGPSNBODF PWFS MPOH MJTUT

 )PX UP XSJUF GPME GVODUJPOT


8IFO XF XSJUF GPMET XF CFHJO CZ UIJOLJOH BCPVU XIBU PVS
TUBSU WBMVF GPS UIF GPME JT 5IJT JT VTVBMMZ UIF identity GPS UIF
GVODUJPO 4P XIFO XF TVN UIF FMFNFOUT PG B MJTU UIF JEFOUJUZ
PG TVNNBUJPO JT  8IFO XF NVMUJQMZ UIF FMFNFOUT PG UIF MJTU
UIF JEFOUJUZ JT  5IJT TUBSU WBMVF JT BMTP PVS GBMMCBDL JO DBTF UIF
MJTU JT FNQUZ
/FYU XF DPOTJEFS PVS BSHVNFOUT " GPMEJOH GVODUJPO UBLFT
UXP BSHVNFOUT a BOE b XIFSF a JT HPJOH UP BMXBZT CF POF PG
UIF FMFNFOUT JO UIF MJTU BOE b JT FJUIFS UIF TUBSU WBMVF PS UIF
WBMVF BDDVNVMBUFE BT UIF MJTU JT CFJOH QSPDFTTFE
-FUƊT TBZ XF XBOU UP XSJUF B GVODUJPO UP UBLF UIF ƶSTU UISFF
MFUUFST PG FBDI String WBMVF JO B MJTU PG TUSJOHT BOE DPODBUFOBUF
UIBU SFTVMU JOUP B ƶOBM String 5IF UZQF PG UIF SJHIU GPME GPS MJTUT
JT

foldr :: (a -> b -> b) -> b -> [a] -> b


$)"15&3  %"5" 4536$563& 03*(".* 

'JSTU XFƊMM TFU VQ UIF CFHJOOJOHT PG PVS FYQSFTTJPO

foldr (\ a b -> undefined) []


["Pizza", "Apple", "Banana"]

8F VTFE BO FNQUZ MJTU BT UIF TUBSU WBMVF CVU TJODF XF QMBO UP


SFUVSO B String BT PVS SFTVMU XF DPVME CF B MJUUMF NPSF FYQMJDJU
BCPVU PVS JOUFOU UP CVJME B String BOE NBLF B TNBMM TZOUBDUJD
DIBOHF

foldr (\ a b -> undefined) ""


["Pizza", "Apple", "Banana"]

0G DPVSTF CFDBVTF B String JT B MJTU UIFTF BSF BDUVBMMZ UIF


TBNF WBMVF

Prelude> "" == []
True

#VU "" TJHOBMT JOUFOU XJUI SFTQFDU UP UIF UZQFT JOWPMWFE

Prelude> :t ""
"" :: [Char]
Prelude> :t []
[] :: [t]

.PWJOH BMPOH XF OFYU XBOU UP XPSL PO UIF GVODUJPO 8F


BMSFBEZ LOPX IPX UP UBLF UIF ƶSTU UISFF FMFNFOUT GSPN B MJTU
BOE XF DBO SFVTF UIJT GPS String
$)"15&3  %"5" 4536$563& 03*(".* 

foldr (\ a b -> take 3 a) ""


["Pizza", "Apple", "Banana"]

/PX UIJT XJMM BMSFBEZ UZQFDIFDL BOE XPSL CVU JU EPFTOƊU


NBUDI UIF TFNBOUJDT XF BTLFE GPS

Prelude> let pab = ["Pizza", "Apple", "Banana"]


Prelude> foldr (\ a b -> take 3 a) "" pab
"Piz"
Prelude> foldl (\ b a -> take 3 a) "" pab
"Ban"

8FƊSF POMZ HFUUJOH UIF ƶSTU UISFF MFUUFST PG UIF ƶSTU PS UIF
MBTU TUSJOH EFQFOEJOH PO XIFUIFS XF EJE B SJHIU PS MFǒ GPME
/PUF UIF BSHVNFOU OBNJOH PSEFS EVF UP UIF EJƵFSFODF JO UIF
UZQFT PG foldr BOE foldl

foldr :: (a -> b -> b) -> b -> [a] -> b

foldl :: (b -> a -> b) -> b -> [a] -> b

5IF QSPCMFN IFSF JT UIBU SJHIU OPX XFƊSF OPU BDUVBMMZ GPME
JOH UIF MJTU 8FƊSF KVTU NBQQJOH PVS take 3 PWFS UIF MJTU BOE
TFMFDUJOH UIF ƶSTU PS MBTU SFTVMU

Prelude> map (take 3) pab


["Piz","App","Ban"]
$)"15&3  %"5" 4536$563& 03*(".* 

Prelude> head $ map (take 3) pab


"Piz"
Prelude> last $ map (take 3) pab
"Ban"

4P MFU VT NBLF UIJT B QSPQFS GPME BOE BDUVBMMZ BDDVNVMBUF


UIF SFTVMU CZ NBLJOH VTF PG UIF b BSHVNFOU 3FNFNCFS UIF b
JT ZPVS TUBSU WBMVF 5FDIOJDBMMZ XF DPVME KVTU VTF concat PO UIF
SFTVMU PG IBWJOH NBQQFE take 3 PWFS UIF MJTU PS JUT SFWFSTF JG
XF XBOU UP TJNVMBUF foldl


Prelude> concat $ map (take 3) pab


"PizAppBan"
Prelude> concat $ map (take 3) (reverse pab)
"BanAppPiz"

#VU XF OFFE BO FYDVTF UP QMBZ XJUI foldr BOE foldl TP XFƊMM


QSFUFOE OPOF PG UIJT IBQQFOFE

Prelude> foldr (\ a b -> take 3 a ++ b) "" pab


"PizAppBan"
Prelude> foldl (\ b a -> take 3 a ++ b) "" pab
"BanAppPiz"

)FSF XF DPODBUFOBUFE UIF SFTVMU PG IBWJOH UBLFO UISFF FM


FNFOUT GSPN UIF TUSJOH WBMVF JO PVS JOQVU MJTU POUP UIF GSPOU
PG PVS TUSJOH XFƊSF BDDVNVMBUJOH *G XF XBOU UP CF FYQMJDJU XF
DBO BTTFSU UZQFT GPS UIF WBMVFT
$)"15&3  %"5" 4536$563& 03*(".* 

Prelude> :{
*Prelude| let f a b = take 3
*Prelude| (a :: String) ++
*Prelude| (b :: String)
*Prelude| :}
Prelude> foldr f "" pab
"PizAppBan"

*G XF BTTFSU TPNFUIJOH UIBU JTOƊU USVF UIF UZQFDIFDLFS GXBDLT


VT

Prelude> :{
*Prelude| let f a b = take 3 (a :: String)
*Prelude| ++ (b :: [String])
*Prelude| :}

<interactive>:12:42:
Couldn't match type ‘Char’ with ‘[Char]’
Expected type: [String]
Actual type: [Char]
In the second argument of ‘(++)’,
namely ‘(b :: [String])’
In the expression:
take 3 (a :: String) ++ (b :: [String])

5IJT DBO CF VTFGVM GPS DIFDLJOH UIBU ZPVS NFOUBM NPEFM PG


UIF DPEF JT BDDVSBUF
$)"15&3  %"5" 4536$563& 03*(".* 

&YFSDJTFT %BUBCBTF 1SPDFTTJOH


8SJUF UIF GPMMPXJOH GVODUJPOT GPS QSPDFTTJOH UIJT EBUB

import Data.Time

data DatabaseItem = DbString String


| DbNumber Integer
| DbDate UTCTime
deriving (Eq, Ord, Show)

theDatabase :: [DatabaseItem]
theDatabase =
[ DbDate (UTCTime
(fromGregorian 1911 5 1)
(secondsToDiffTime 34123))
, DbNumber 9001
, DbString "Hello, world!"
, DbDate (UTCTime
(fromGregorian 1921 5 1)
(secondsToDiffTime 34123))
]

 8SJUF B GVODUJPO UIBU ƶMUFST GPS DbDate WBMVFT BOE SFUVSOT


B MJTU PG UIF UTCTime WBMVFT JOTJEF UIFN
$)"15&3  %"5" 4536$563& 03*(".* 

filterDbDate :: [DatabaseItem] -> [UTCTime]


filterDbDate = undefined

 8SJUF B GVODUJPO UIBU ƶMUFST GPS DbNumber WBMVFT BOE SFUVSOT


B MJTU PG UIF Integer WBMVFT JOTJEF UIFN

filterDbNumber :: [DatabaseItem] -> [Integer]


filterDbNumber = undefined

 8SJUF B GVODUJPO UIBU HFUT UIF NPTU SFDFOU EBUF

mostRecent :: [DatabaseItem] -> UTCTime


mostRecent = undefined

 8SJUF B GVODUJPO UIBU TVNT BMM PG UIF DbNumber WBMVFT

sumDb :: [DatabaseItem] -> Integer


sumDb = undefined

 8SJUF B GVODUJPO UIBU HFUT UIF BWFSBHF PG UIF DbNumber WBM


VFT

-- You'll probably need to use fromIntegral


-- to get from Integer to Double.

avgDb :: [DatabaseItem] -> Double


avgDb = undefined
$)"15&3  %"5" 4536$563& 03*(".* 

 'PMEJOH BOE FWBMVBUJPO


8IBU EJƵFSFOUJBUFT foldr BOE foldl JT BTTPDJBUJWJUZ 5IF SJHIU
BTTPDJBUJWJUZ PG foldr NFBOT UIF GPMEJOH GVODUJPO FWBMVBUFT
GSPN UIF JOOFSNPTU DPOT DFMM UP UIF PVUFSNPTU UIF IFBE
 0O
UIF PUIFS IBOE foldl SFDVSTFT VODPOEJUJPOBMMZ UP UIF FOE PG UIF
MJTU UISPVHI TFMGDBMMT BOE UIFO UIF GPMEJOH GVODUJPO FWBMVBUFT
GSPN UIF PVUFSNPTU DPOT DFMM UP UIF JOOFSNPTU

Prelude> take 3 $ foldr (:) [] ([1, 2, 3] ++ undefined)


[1,2,3]
Prelude> take 3 $ foldl (flip (:)) [] ([1, 2, 3] ++ undefined)
*** Exception: Prelude.undefined

-FUƊT EJWF JOUP PVS const FYBNQMF B MJUUMF NPSF DBSFGVMMZ

foldr const 0 [1..5]

8JUI foldr ZPVƊMM FWBMVBUF const 1 (...) CVU const JHOPSFT


UIF SFTU PG UIF GPME UIBU XPVME IBWF PDDVSSFE GSPN UIF FOE PG
UIF MJTU VQ UP UIF OVNCFS 1 TP UIJT SFUVSOT 1 XJUIPVU IBWJOH
FWBMVBUFE BOZ NPSF PG UIF WBMVFT PS UIF TQJOF 0OF XBZ ZPV
DPVME FYBNJOF UIJT GPS ZPVSTFMG XPVME CF

Prelude> foldr const 0 ([1] ++ undefined)


1
$)"15&3  %"5" 4536$563& 03*(".* 

Prelude> head ([1] ++ undefined)


1
Prelude> tail ([1] ++ undefined)
*** Exception: Prelude.undefined

4JNJMBSMZ GPS foldl

foldl (flip const) 0 [1..5]

)FSF foldl XJMM SFDVSTF UP UIF ƶOBM DPOT DFMM FWBMVBUF (flip
const) (...) 5 JHOPSF UIF SFTU PG UIF GPME UIBU XPVME PDDVS
GSPN UIF CFHJOOJOH VQ UP UIF OVNCFS 5 BOE KVTU SFUVSO 
5IF SFMBUJPOTIJQ CFUXFFO foldr BOE foldl JT TVDI UIBU

foldr f z xs = foldl (flip f) z (reverse xs)

#VU POMZ GPS ƶOJUF MJTUT $POTJEFS

Prelude> foldr const 0 (repeat 0 ++ [1,2,3])


0
Prelude> foldl (flip const) 0 (reverse (repeat 1 ++ [1,2,3]))
^CInterrupted.
-- ^^ bottom.

*G XF ƷJQ PVS GPMEJOH GVODUJPO f BOE SFWFSTF UIF MJTU xs foldr


BOE foldl XJMM SFUVSO UIF TBNF SFTVMU
$)"15&3  %"5" 4536$563& 03*(".* 

Prelude> foldr (:) [] [1..5]


[1,2,3,4,5]
Prelude> foldl (flip (:)) [] [1..5]
[5,4,3,2,1]
Prelude> foldl (flip (:)) [] (reverse [1..5])
[1,2,3,4,5]
Prelude> reverse $ foldl (flip (:)) [] [1..5]
[1,2,3,4,5]

 4VNNBSZ
0LBZ XF QSFTFOUFE B MPU PG NBUFSJBM JO UIJT DIBQUFS :PV NJHIU
CF GFFMJOH B MJUUMF XFBSZ PG GPMET SJHIU OPX 4P XIBUƊT UIF FYFD
VUJWF TVNNBSZ

GPMES

 5IF SFTU PG UIF GPME SFDVSTJWF JOWPDBUJPO PG foldr


JT BO
BSHVNFOU UP UIF GPMEJOH GVODUJPO ZPV QBTTFE UP foldr *U
EPFTOƊU EJSFDUMZ TFMGDBMM BT B UBJMDBMM MJLF foldl :PV DPVME
UIJOL PG JU BT BMUFSOBUJOH CFUXFFO BQQMJDBUJPOT PG foldr BOE
ZPVS GPMEJOH GVODUJPO f 5IF OFYU JOWPDBUJPO PG foldr JT
DPOEJUJPOBM PO f IBWJOH BTLFE GPS NPSF PG UIF SFTVMUT PG
IBWJOH GPMEFE UIF MJTU 5IBU JT

foldr :: (a -> b -> b) -> b -> [a] -> b


-- ^
$)"15&3  %"5" 4536$563& 03*(".* 

5IBU ƉCƊ XFƊSF QPJOUJOH BU JO (a -> b -> b) JT UIF SFTU PG UIF


GPME &WBMVBUJOH UIBU FWBMVBUFT UIF OFYU BQQMJDBUJPO PG
foldr

 "TTPDJBUFT UP UIF SJHIU

 8PSLT XJUI JOƶOJUF MJTUT 8F LOPX UIJT CFDBVTF

Prelude> foldr const 0 [1..]


1

 *T B HPPE EFGBVMU DIPJDF XIFOFWFS ZPV XBOU UP USBOTGPSN


EBUB TUSVDUVSFT CF UIFZ ƶOJUF PS JOƶOJUF

GPMEM

 4FMGDBMMT UBJMDBMM
UISPVHI UIF MJTU POMZ CFHJOOJOH UP
QSPEVDF WBMVFT BǒFS JUƊT SFBDIFE UIF FOE PG UIF MJTU

 "TTPDJBUFT UP UIF MFǒ

 $BOOPU CF VTFE XJUI JOƶOJUF MJTUT 5SZ UIF JOƶOJUF MJTU


FYBNQMF FBSMJFS BOE ZPVS 3&1- XJMM IBOH

 *T OFBSMZ VTFMFTT BOE TIPVME BMNPTU BMXBZT CF SFQMBDFE


XJUI foldl' GPS SFBTPOT XFƊMM FYQMBJO MBUFS XIFO XF UBML
BCPVU XSJUJOH FƸDJFOU )BTLFMM QSPHSBNT
$)"15&3  %"5" 4536$563& 03*(".* 

 4DBOT
4DBOT XIJDI XF IBWF NFOUJPOFE BCPWF XPSL TJNJMBSMZ UP
NBQT BOE BMTP UP GPMET -JLF GPMET UIFZ BDDVNVMBUF WBMVFT
JOTUFBE PG LFFQJOH UIF MJTUƊT JOEJWJEVBM WBMVFT TFQBSBUF -JLF
NBQT UIFZ SFUVSO B MJTU PG SFTVMUT *O UIJT DBTF UIF MJTU PG SFTVMUT
TIPXT UIF JOUFSNFEJBUF TUBHFT PG FWBMVBUJPO UIBU JT UIF WBMVFT
UIBU BDDVNVMBUF BT UIF GVODUJPO JT EPJOH JUT XPSL
4DBOT BSF OPU VTFE BT GSFRVFOUMZ BT GPMET BOE PODF ZPV
VOEFSTUBOE UIF CBTJD NFDIBOJDT PG GPMEJOH UIFSF JTOƊU B XIPMF
MPU OFX UP VOEFSTUBOE 4UJMM JU JT VTFGVM UP LOPX BCPVU UIFN
BOE HFU BO JEFB PG XIZ ZPV NJHIU OFFE UIFN
'JSTU MFUƊT UBLF B MPPL BU UIF UZQFT 8FƊMM EP B EJSFDU DPN
QBSJTPO PG UIF UZQFT PG GPMET BOE TDBOT TP UIF EJƵFSFODF JT
DMFBS

foldr :: (a -> b -> b) -> b -> [a] -> b


scanr :: (a -> b -> b) -> b -> [a] -> [b]

foldl :: (b -> a -> b) -> b -> [a] -> b


scanl :: (b -> a -> b) -> b -> [a] -> [b]

5IF QSJNBSZ EJƵFSFODF JT UIBU UIF ƶOBM SFTVMU JT B MJTU GPMET


DBO SFUVSO B MJTU BT B SFTVMU BT XFMM CVU UIFZ EPOƊU