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
ÐFS %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