exercises to accompany introduction to functional ... to accompany introduction to functional...
TRANSCRIPT
![Page 1: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/1.jpg)
1
ExercisestoAccompanyIntroductiontoFunctionalProgrammingHowtoThinkFunctionallyin(Almost)AnyLanguagewithBarryBurdThislistincludesthreekindsofexercises:
• ExercisesmarkedGeneral:Completetheseexerciseswithoutwritingorreadingcodeofanykind,orexplorefeaturesinaprogramminglanguagethatyoumaynothaveseenbefore.
• ExercisesmarkedUsingpseudocode:Completetheseexercisesbyreadingorwritingsimplifiedsyntaxthatdoesn'tbelongtoanyparticularprogramminglanguage,likethesyntaxthatIuseinthecourse.
• ExercisesmarkedInyourprogramminglanguage:Completetheseexercisesbyreadingorwritingcodeinaprogramminglanguageofyourchoice.(Anddon'tforgettotestyourcode!)
Thereareexercisesforalmosteverysectionofthecourse.Forexample,Exercises1.1,1.2and1.3areforthefirstsection(thesectionentitledAboutThisCourse).Exercises2.1,2.2(andsoon)areforthesecondsection(thesectionentitledSolvingaProblemBothWays).Somesolutionsappearattheendofthelistofexercises.Ifyouhavequestions,[email protected],tweetto@allmycode,orpostonFacebookto/allmycode.Havefunandlearnalot!1. AboutThisCourseGeneral
1.1. ThefollowingprogramiswritteninaveryoldversionoftheBASICprogramminglanguage.Incaseyou'rewondering,thepercentsign(%)isBASIC'smodoperator.So,forexample,6 % 3is0and7 % 3is1.Tracethroughtheexecutionoftheprogramtodeterminetheprogram'soutput.GOTOstatementsarebad,andthisexercisewithGOTOstatementsisintentionallyannoying.Sohavefunwithitbutdon'ttakeittooseriously.
10 LET X = 5 25 PRINT X 20 GOTO 90 30 LET X = X + 8 35 PRINT X 35 IF X % 2 = 0 THEN GOTO 60 40 LET X = X * 5 45 PRINT X 50 IF X < 51 THEN GOTO 30
![Page 2: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/2.jpg)
2
60 LET X = X - 1 65 PRINT X 70 IF X % 3 = 0 THEN GOTO 30 85 END 90 LET X = X * 2 95 PRINT X 100 GOTO 40
1.2. TypethecodefromExercise1.1intotheinterpreteratwww.quitebasic.comtofindoutifyourproposedoutputiscorrect.
Inyourprogramminglanguage1.3. Obfuscatedcodeiscodethat'sdifficulttoread.Therearegoodreasonsandbad
reasonsforcreatingobfuscatedcode.Somesoftwaretoolsturnreadablecodeintoobfuscatedcodeinordertokeepthecodefrombeinghacked.Ontheotherhand,someobfuscatedcodeiswrittenforfuntoshowhowstrangethecodecanbe.PeoplepostexamplesofsuchcodeontheInternet.SearchtheInternetforfunexamplesofobfuscatedcode.
2. SolvingaProblemBothWaysPseudocode
2.1. Here'saslightmodificationofthecreditcardcategorizationproblem(calledProblem1inthevideo):Writeimperative-stylepseudocodetodisplaytheitemsintheFoodcategorywhoseamountsare$10ormore.Inyoursolution,don'tusethewordAND.Don'tuseasymbolthatstandsforthewordAND.
2.2. Writefunctional-stylepseudocodetosolvetheprobleminExercise2.1.Inyourprogramminglanguage
2.3. Writeandtestanimperative-styleprogramtosolvethecreditcardcategorizationproblem(calledProblem1inthevideo).
2.4. Writeandtestanimperative-styleprogramtosolvetheprobleminExercise2.1.2.5. Findoutifyourlanguagehasafeaturelikethefilterfunction.Ifitdoes,learnhowto
usethefilterfunctiontosolvethecreditcardcategorizationproblem.3. UsingFilter,MapandFoldPseudocode
3.1. Rewritethefollowingfunctiondefinitionsusinglambdanotation:3.1.1. f(x)=x+13.1.2. f(x)=x
Thisistheidentityfunction–thefunctionthatreturnswhateveryougiveit.3.1.3. nameOf(customer)=customer.name
3.2. Evaluatethefollowinglambdaexpressions:3.2.1. (lx®6*x)(21)3.2.2. (lx®x/2)((lx®x+7)(19))
3.3. Evaluatethefollowingexpressions
![Page 3: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/3.jpg)
3
3.3.1. map(timesTwo,[2,4,5])3.3.2. map(timesTwo,[8])3.3.3. map(timesTwo,[])3.3.4. map(addOne,map(timesTwo,[2,2,4,–3]))3.3.5. map(timesTwo,map(addOne,[2,2,4,–3]))3.3.6. foldFromLeft(plus,7,[3,–89])3.3.7. foldFromLeft(minus,7,[3,–8,9])3.3.8. foldFromRight(minus,7,[3,–8,9])3.3.9. foldFromLeft(minus,7,map(timesTwo,[3,0,8]))
3.4. You'regivenalistofcustomers.Eachcustomerhasanameandanamount.Acustomer'samountisthatcustomer'soutstandingbalance.Writeimperative-stylepseudocodetoprintthesmallestnegativebalance.Forexample,ifJoe'sbalanceis–$10,Ann'sbalanceis–$2,andDonna'sbalanceis$5,print–2.(Assumethatthelisthasatleastonecustomerinit,andthatcustomers'balancesrangebetween–$1000and$1000.)
3.5. Youhaveafunction(calledmax)thatfindsthelargeroftwonumbers.Writefunctional-stylepseudocodetosolvetheprobleminExercise3.4.
Inyourprogramminglanguage3.6. Findoutifyourlanguagehasfeatureslikethemap,foldFromLeftand
foldFromRightfunctions.4. ImperativeandFunctionalProgrammingLanguagesGeneral
4.1. MicrosoftExcelhasaFilterfeature.Youcanfinddocumentationaboutthisfeaturebyvisitinghttps://support.office.com/en-us/article/Filter-data-in-a-range-or-table-01832226-31b5-4568-8806-38c37dcc180e.Readaboutthisfeature,andtryusingitinMicrosoftExcel.
4.2. MicrosoftExcelhasanAggregatefunction,whichbehavesabitlikeourfoldFromLeftandfoldFromRightfunctions.Youcanfinddocumentationaboutthisfunctionbyvisitinghttps://support.office.com/en-us/article/AGGREGATE-function-43b9278e-6aa7-4f17-92b6-e19993fa26df.Readaboutthisfunction,andtryusingitinMicrosoftExcel.
Inyourprogramminglanguage4.3. Findouthowtheexpertsclassifyyourprogramminglanguage.Isitimperative,purely
functional,hybrid,orsomeotherkindoflanguage.4.4. Ifyourlanguagesupportssomefunctionalfeatures,readuponthosefeatures.Finda
fewsimplesampleprogramsonthewebandrunthemtofindouthowtheybehave.4.5. Manylanguagescanbeextendedtoincludefunctionalfeaturesthataren'tofficially
partofthelanguage.Groupsofdeveloperscreatetoolsenablingyoutousetheseadditionalfunctionalfeatures.Findoutifyourprogramminglanguagehassuchextensions.
![Page 4: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/4.jpg)
4
5. PureFunctionsPseudocode
5.1. Whichofthesepseudocodefunctionsarepure?Whicharen'tpure?Why?5.1.1. f(x)=x+x+x5.1.2.
f(x) { x = x + 7 return x }
5.1.3. f(x)=x+current_day_of_the_monthwherecurrent_day_of_the_monthisanumberfrom1to31
5.1.4. f(x) { integer y = 3 return x + y }
5.1.5. f(x) { integer y = random() return x + y - y }
5.1.6. length(the_string_s)=numberofcharactersinthe_string_s5.1.7.
post(message, URL) { add the message to the message board at the URL }
5.2. Whichoftheseexpressionsarereferentiallytransparent?Whicharen't?Why?5.2.1. inputFromKeyboard(x)
Ifyouexecutey = inputFromKeyboard(x),andtheusertypes7,thenthevalueofybecomes7.
5.2.2. 7+65.2.3. f(x)=x+current_day_of_the_month
wherecurrent_day_of_the_monthisanumberfrom1to315.3. RevisityoursolutiontoProblem3.2tomakesurethatnothinginyoursolutionis
mutable.6. SomeBenefitsofPureFunctionsPseudocode
6.1. Usepseudocodetowritetestsforthefollowingtwofunctions.Identifythesetupstep(s)requiredtotesteachfunction.
6.1.1.
mortgage(principle, ratePercent, numYears) {
![Page 5: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/5.jpg)
5
rate = ratePercent / 100 numPayments = numYears * 12 effectiveAnnualRate = rate / 12 payment = principal * (effectiveAnnualRate / (1 - (1 + effectiveAnnualRate)^(-numPayments)))) } Incaseyoucare,my^symbolmeans"tothepowerof."Also,themonthlypaymentona30year,$100000.00mortgagewith5.25%interestis$552.20.
6.1.2. mortgage(principle, numYears) { rate = currentRatePercent / 100 numPayments = numYears * 12 effectiveAnnualRate = rate / 12 payment = principal * (effectiveAnnualRate / (1 - (1 + effectiveAnnualRate)^(-numPayments)))) } ThefunctioninthisexerciseisalmostthesameasthefunctioninExercise6.1.1.Theonlydifferenceisthatthisexercise'sfunctionusesavariable(currentRatePercent)whosevalueissetoutsideofthemortgagefunctionandcanbemodifiedoutsideofthemortgagefunction.
6.2. ThemortgagefunctioninExercise6.1.1mightruncorrectlywhenyoutestitwithparameters100000.00,5.25,30.Doesthismeanthatthefunctionwillruncorrectlywheneveranyonecallsthefunctionwithparameters100000.00,5.25,30?
6.3. ThemortgagefunctioninExercise6.1.2mightruncorrectlywhenyoutestitwithparameters100000.00,30.Doesthismeanthatthefunctionwillruncorrectlywheneveranyonecallsthefunctionwithparameters100000.00,30?
6.4. Definefactorial(n) = 1*2*3*...*n.Here'sapseudocodeprogramtorepeatedlycalculatefactorial(n)andcountthenumberofmultiplicationoperationsdoneduringthecalculation:
loop input n result = 1 count = 0 for i from 2 to n do result = result * i count = count + 1 print result print count
![Page 6: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/6.jpg)
6
Thefactorialfunctionispuresoitcanbememoized.Usememoizationtomakevaluesofcountsmallerforvaluesofnlessthanorequalto100.
Inyourprogramminglanguage
6.5. Writeaprogramthatinputsanintegerthat'slessthanorequalto1000(callitn)andthenusesalooptoadduptheintegers1ton.Theprogramdisplaystheresultingsum.
6.6. ModifytheprogramofExercise6.4sothattheprogramrepeatedlyinputsanewvaluefornandthendisplaysthesumoftheintegers1ton.Theprogramstopsrepeatingwhentheuserenters0forn.Tosolvethisproblem,createanarrayofsize1000(callitthetotalsarray).Put1intototals[1].Thenputthesumof1and2intototals[2].Thenputthesumof1,2and3intototals[3].Andsoon.Whatiftheuserinputs950fornandthen765forn?Don'trecalculatethesumofthenumbers1to765.Inonestep,getthatsumfromthetotalsarray.
7. AvoidingRaceConditionsGeneral
7.1. Ann'sparents,BobandCarol,haveajointbankaccount.BobvisitsanATMmachine.Hecheckshisbalance,whichis$300.SoBobrequestsawithdrawalof$100.Thenthemachine'sscreendisplaysamessagesayingthatBobcan'twithdrawthemoney.Whatwentwrong?
7.2. Describeascenarioinwhichthecreditcardtotalproblem(calledProblem2inthevideo)cansufferfromraceconditions.
Pseudocode7.3. Whatoutputsmayresultfromrunningthefollowingcode?
x = 0 three times do { simultaneously do { x = x + 1 } and { x = x + 1 } } print x
![Page 7: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/7.jpg)
7
8. EfficientParameterPassingGeneral
8.1. InanoldversionoftheFORTRANprogramminglanguage,anynumericliteralsthatwerepassedasparameterswerestoredasvariableswithvaluesbeforetheywerepassed.Whatunwantedconsequencecanthishaveforparameterpassing?
Inyourprogramminglanguage8.2. Therearemanywaysforlanguagestoimplementparameterpassing.You'veprobably
usedparameterpassinginanimperativelanguage,andyouprobablyknowtherulesthatgovernparameterpassinginyourlanguage.Butdoyouknowhowparameterpassingworksunderthehood?Researchthisquestionforthelanguageofyourchoice.
8.3. Aretheredifferentoptionsforpassingparametersinyourprogramminglanguage?Ifso,whichofthemallowyoutomodifythevaluesoftheparametersinthefunctioncall?Whichdon't?
9. LazyEvaluationPseudocode
9.1. Ineachpartofthisproblem,evaluatetheexpressionslazily,andtheneagerly.Ineachcase,aretheresultsdifferent?9.1.1. Inthisproblem,acalltotheprintfunctionreturnsthenumberofvaluesthat
weresuccessfullyprinted.Forexample,print(x, y)mightreturnthenumber2.
x = 7 if x < 5 & (print(x) = 1) print("x is", x)
9.1.2.
if theArray has an element with index 10 & theArray[10] = 0 print("OK")
9.1.3. Inthisproblem,++xbehavesasbothaninstructionandanexpression.Asaninstruction,++xadds1tothevalueofx.Asanexpression,thevalueof++xisthenewlyobtainedvalueofx.Forexample,thecode
x = 7 print(++x) print(x)
displaysthenumbers8 8.Withthatinmind,evaluatethefollowingcodebothlazilyandeagerly.x = 18 if ++x > 19 & print(++x) print("x is", x)
![Page 8: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/8.jpg)
8
print(x)
9.1.4. Inthisproblem,x++isthesameasinProblem9.1.3.
x = 18 if ++x > 18 or print(++x) print("x is",x) print(x)
9.1.5. x=(ifynotEqualTo0then(x/y)elsex+1)9.1.6. firstElementOf([0,3.6.9,12])9.1.7. firstElementOf([0,3,6,9,12,...])9.1.8. sumOfTheNumbersIn([0,3,6,9,12,...])
10. IntroductiontoHigher-OrderFunctionsGeneral
10.1. Letf(x)=x+7,letg(x)=x2andleth(x)=1/x.10.1.1. Findthevalueoff∘g(5).10.1.2. Writeanarithmeticexpressionforthefunctionf∘g.10.1.3. Findthevalueofg∘f(5).10.1.4. Writeanarithmeticexpressionforthefunctiong∘f.10.1.5. Findthevalueofh∘h(5).10.1.6. Findthevalueofg∘f∘h(5).10.1.7. Writeanarithmeticexpressionforthefunctiong∘f∘h.
10.2. Inthevideo,Idescribefunctioncomposition,denotedbythe∘symbol.Iscompositionahigher-orderfunction?Why,orwhynot?
10.3. Ifyou'vetakencalculus,you'veseenthederivative,denotedbyd/dx.Explainwhythederivativeisahigher-orderfunction.
10.4. SymboliclogichastwofunctionsnamedthereExistsandforAll.Hereareexamplesoftheuseofthesetwofunctions:
thereExists(even,[1,3,5])isfalsebecausetherearenoevennumbersinthelist[1,3,5]thereExists(even,[1,2,5])istruebecausethere'sanevennumberinthelist[1,2,5]forAll(even,[1,2,5])isfalsebecausenotallnumbersinthelist[1,2,5]areevenforAll(even,[2,6,10])istruebecauseallnumbersinthelist[1,2,5]areevenArethereExistsandforAllhigher-orderfunctions?Whyorwhynot?
![Page 9: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/9.jpg)
9
11. CurryingGeneral
11.1. Inthevideo,Iusethenotation
filter : function, list → list
todescribetheparametersandresulttimeofthefilterfunction.Usesimilarnotationtodescribeeachofthefollowingfunctions:
11.1.1. DescribethefunctionfinExercise10.1.11.1.2. Describethefunctionf∘ginExercise10.1.111.1.3. Describetheresultofpartiallyapplying2tothefirstargumentinthefunction
add(x, y) = x + y.11.1.4. Describecomposition(denotedbythe∘symbol).11.1.5. DescribetheapplyNTimesfunctionwhichappliesafunctionntimes.For
example,
applyNTimes(x + 1, 3) = ((x + 1) + 1) + 1 applyNTimes(x * 2, 4) = (((x * 2) * 2) * 2) * 2
11.1.6. DescribetheaddFfunction,whichtakestwofunctions,f andg,andreturnsanotherfunctionthatsumsupthereturnvaluesfromfandg.Forexample,
addF(x2, 2*x) = x2 + 2*x
11.1.7. Inthevideo,youstartwithaddand,fromit,youcreatecurryAdd.WhatareyoudoingwhenyougofromaddtocurryAdd?
12. ClosuresPseudocode
12.1. What'stheoutputofthefollowingcode?makeNewFunction(factor) { size = 1 f() = multiplysize by factorandreturnthenewsizevalue return f } increaseA = makeNewFunction(5) print( increaseA() ) print( increaseA() ) increaseB = makeNewFunction(10) print( increaseB() ) print( increaseB() )
![Page 10: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/10.jpg)
10
print( increaseA() )
12.2. What'stheoutputofthefollowingcode?
createGreeting(interjection) { f(name) = interjection"," name"!" return f } formalGreeting = createGreeting("Hello") casualGreeting = createGreeting("Hi") print ( formalGreeting("Mr. Williams") ) print ( formalGreeting("Ms. Polywether") ) print ( casualGreeting("Joe") )
12.3. What'stheoutputofthefollowingcode?delayDisplay(n) { f(message) = waitnsecondsandthendisplaymessage } g = delayDisplay(1) h = delayDisplay(5) h("Goodbye") g("Hello")
13. IntroductiontoListsPseudocode
13.1. Find head(tail([6,9,12,8]))13.2. Find tail(tail(tail([6,9,12,8])))13.3. Find construct(10,tail([21,15]))13.4. Trueorfalse? tail([18,8]) isequalto 813.5. Find concatenate(concatenate([1,3],[1,8]),[0,0])13.6. With x = [3,2,19],find construct(head(x),tail(x))
14. Recursionand15. MoreRecursionExamplesPseudocode
15.1. Showhowtousethereversefunctionfromthevideotofindoutifalistofcharactersisapalindrome.
15.2. Usethereversefunctionfromthevideotodefinealastfunction.Whenappliedtoalist,thelastfunctionreturnsthelastvalueinthelist.
![Page 11: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/11.jpg)
11
last([1,7,5]) = 5 last([2]) = 2
15.3. UsethelastfunctioninExercise15.2towriterecursivecodeforafunctionthatcreatesalistoffactorialsuptoandincludingthenumbergiventoit.Forexample,
factorials[1] = 1 factorials[2] = [1,2] factorials[3] = [1,2,6] factorials[4] = [1,2,6,24]
15.4. Writerecursivecodeforafunctionthatsumsthenumbersinalist.Forexample,
sum([1,3,5])=9 sum([]) = 0
15.5. AfunctionnamedfirstNFromtakesalistandanintegern,andreturnsthefirst
nvaluesfromthelist.Forexample,
firstNFrom([9, 6, 3, 4], 2) = [9, 6] firstNFrom([9, 6, 3, 4], 1) = [9]
WriterecursivecodeforthefirstNFromfunction.(Assumethatnisalwaysgreaterthan0andlessthanorequaltothelengthofthelist.)
15.6. Afunctionnamedalternatestakesalistandreturnsalistcontainingthealternatevaluesfromtheoriginallist.Forexample,
alternates([2,19,81,4]) = [2,81] alternates([1,2,7,5,9]) = [1,7,9] alternates([8]) = [8] alternates([]) = []
Writerecursivecodeforthealternatesfunction.16. ComputationsthatMightFailPseudocode
16.1. FindthevalueofsqrtMaybe(x-10) >>= minus4Maybe >>= reciprocalMaybe >>= plus13Maybewhenx=10.
16.2. FindthevalueofsqrtMaybe(x-1) >>= minus4Maybe >>= reciprocalMaybe >>= plus13Maybewhenx=17.
16.3. FindthevalueofsqrtMaybe(x-10) >>= minus4Maybe >>= reciprocalMaybe >>= plus13Maybewhenx=9.
![Page 12: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/12.jpg)
12
16.4. FindthevalueofreciprocalMaybe(x) >>= sqrtMaybewhenx=1.16.5. FindthevalueofreciprocalMaybe(x) >>= sqrtMaybewhenx=0.16.6. ThedefintionMaybefunctiontakesastringofcharacters(suchasaword)and
returnsthedictionarydefinitionofthatstringofcharacters,ifthereisone.ThelengthMaybefunctiontakesastringofcharacters(suchasawordorgroupofwords)andreturnsthenumberofcharactersinthestring,ifthereisone.(Counttheblankspacesandpunctuationinthestring.)16.6.1. ThedefinitionofhouseisAbuildingwhosepurposeistoregularlyshelterthe
samepersonorpeople.FindthevalueofdefinitionMaybe(x) >>= lengthMaybewhenx="house".
16.6.2. Thenon-wordbxbutwisn'tarealwordsoitdoesn'thaveadefinition.FindthevalueofdefinitionMaybe(x) >>= lengthMaybewhenx="bxbutw".
16.7. Describetheparametertypes,returntype,andruleforapplyingthebindfunctioninExercise16.6.
17. MoreMonadsPseudocode
17.1. Usingthefunctionsdefinedinthevideo,defineafunctionwhoseparameterisapersonandwhoseresultisalistoftheperson'sgreatauntsanduncles.
17.2. Ann'ssmallbusinesshas3employees.Aparticularemployeemayormaynothaveclients.DescribethefunctionsforfindingalltheclientsinAnn'sbusiness.
17.3. It'sParents'AppreciationDayfortheemployeesofAnn'ssmallbusiness.(SeeExercise17.2.)DefineafunctiontocreatealistofparentstoinvitetotheAppreciationDayparty.(Don'tbotherinvitingAnn'sparents.They'renofun!)
17.4. Ifyoutrytoperformacomputation,andthecomputationfails,thewordNothingintheoutputwithnootherexplanationmightbeabitfrustrating.Tofixthis,imagineanewkindofmonadthatIcalltheMaybeAFloatWithMessagemonad.LiketheMaybemonadfromthevideo,theMaybeAFloatWithMessagemonadhasoneoftwothingsinit:
• Ifthecomputationsucceeds,themonadcontainsJustavalue.• Ifthecomputationfails,themonadcontainsErrorBecauseOfvalue.
Forexample,ifyoutrytodivideby2,yougetJust 1/2.Butifyoutrytodivideby0,yougetErrorBecauseOf 0.The0intheresultmightnotbeveryinformative,butit'sprobablybetterthannothing.DescribethedetailsoftheMaybeAFloatWithMessagemonad.
![Page 13: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/13.jpg)
13
SomeSolutions1. AboutThisCourse
1.1. Theoutputis510505857653253243323312. SolvingaProblemBothWays
2.1. for each purchase in purchasesList if purchase.category == Food if purchase.amount >= 10 print purchase
2.2. hasCategoryFood(purchase) = purchase.category == Food tenOrMore(purchase) = purchase.amount >= 10 print(filter(tenOrMore,filter(hasCategoryFood,purchasesList)))
3. UsingFilter,Map,andFold
3.1. Rewritethefollowingfunctiondefinitionsusinglambdanotation:3.1.1. lx®x+13.1.2. lx®x3.1.3. lcustomer®customer.name
3.2. Evaluatethefollowinglambdaexpressions:3.2.1. (lx®6*x)(21)=6*21=1263.2.2. (lx®x/2)((lx®x+7)(19))=(lx®x/2)(19+7)=(lx®x/2)(26)=13
3.3. Evaluatethefollowingexpressions3.3.1. map(timesTwo,[2,4,5])=[4,8,10]3.3.2. map(timesTwo,[8])=[16]3.3.3. map(timesTwo,[])=[]3.3.4. map(addOne,map(timesTwo,[2,2,4,–3]))=
map(addOne,[4,4,8,–6])=[5,5,9,–5]
3.3.5. map(timesTwo,map(addOne,[2,2,4,–3]))map(timesTwo,[3,3,5,–2])=[6,6,10,–4]
3.3.6. foldFromLeft(plus,7,[3,–89])=7+3+(–8)+9=113.3.7. foldFromLeft(minus,7,[3,–8,9])=((7–3)–(–8))–9=33.3.8. foldFromRight(minus,7,[3,–8,9])=3–((–8)–(9–7))=133.3.9. foldFromLeft(minus,7,map(timesTwo,[3,0,8]))=
foldFromLeft(minus,7,[6,0,16])=((7–6)–0)–16=–153.4.
smallestNegativeBalance = -1000 for each customer in customersList if customer.balance < 0 if customer.balance > smallestNegativeBalance
![Page 14: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/14.jpg)
14
smallestNegativeBalance = customer.balance print smallestNegativeBalance
3.5. getBalance(customer) = customer.balance isNegative(number) = number < 0 balancesList = map(getBalance, customersList) negBalancesList = filter(isNegative, balancesList) smallestNegBal = foldFromLeft(max, -1000, negBalancesList) print(smallestNegBal) Withoutnamingsomanyintermediatefunctions:getBalance(customer) = customer.balance isNegative(number) = number < 0 print(foldFromLeft(max, -1000, filter(isNegative, map(getBalance, customersList))))
Withoutnaminganyintermediatefunctions:print(foldFromLeft(max, -1000, filter(lnumber -> number < 0, map(lcustomer -> customer.balance , customersList))))
1. invisibleline2. invisibleline3. invisibleline4. invisibleline
5. PureFunctions5.1.
5.1.1. Thisfunctionispurebecauseitdoesn'tuseanyvalueotherthanitsparameterx,anditdoesn'tmodifyanyvalue(s)declaredoutsideofitself.
5.1.2. Thepurityorimpurityofthisfunctiondependsonthewaytheprogramminglanguagehandlesparameters.Insomelanguages,modifyingaparameter'svaluehasnoeffectontheparameterinthecallingcode.Insuchalanguage,thefollowingcodewoulddisplaythevalue10andthefunctionwouldbepure.
x = 10 y = f(x) print x
Inotherlanguages,modifyingaparameter'svaluechangestheparameterinthecallingcode.Insuchalanguage,thesamecodewoulddisplaythevalue17andthefunctionwouldbeimpure.
5.1.3. Thisfunctionisimpurebecauseitusesanumberthatitobtainsfromthesystemclock,andthesystemclockisn'tinternaltothefunction.
5.1.4. Thisfunctionispure.Itdoesn'tuseanyinformationthatcomesfromoutsideofthefunction.Itdefinesanadditionalvariableybutthatvariableisfullycontainedinsidethefunction.Thisfunctionisequivalenttothex + 3function.
![Page 15: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/15.jpg)
15
5.1.5. Thisfunctionisimpure.Thefunction'sreturnresultdoesn'tdependonthevalueobtainedbycallingrandom()sointhatsense,thefunctiondoesn'treallyuseanoutsidevalue.Butasubsequentcalltorandom()(afterexitingacalltof(x))willbedifferentbecauseonecalltorandom()hasbeen"usedup"bythecalltof(x).So,inasubtlesense,thisfunctionchangessomethingexternaltoit.Sothisfunctionisimpure.
5.1.6. Thisfunctionispure.Itdoesn'tchangeanythingoutsideofitself,andit'sreturnresultdependsonlyontheinputparameter(the_string_s).
5.1.7. Thisfunctionisimpure.ItsexecutionchangeswhateverwebsitetheURLpointsto.
5.2. 5.2.1. Thisexpressionisreferentiallyopaque(theoppositeofreferentially
transparent).IfyoucallinputFromKeyboard(x)twice,thevalueofinputFromKeyboard(x)mightbe7thefirsttimeand123897thesecondtime.
5.2.2. Thisexpressionisreferentiallytransparent.Theexpression7 + 6means13,nomatterwhereitappearsinaprogram.
5.2.3. Thisexpressionisreferentiallyopaque(theoppositeofreferentiallytransparent).Ifyoucallf(x)twice,thevalueoff(x)mightbe7thefirsttimeand31thesecondtime.
5.3. Here'sacopyofoneofmysolutionstoProblem3.2:
getBalance(customer) = customer.balance isNegative(number) = number < 0 balancesList = map(getBalance, customersList) negBalancesList = filter(isNegative, balancesList) smallestNegBal = foldFromLeft(max, -1000, negBalancesList) print(smallestNegBal) Inthissolution,noticethatnoneoftheprogram'svariables(balancesList,negBalancesList,smallestNegBal)havevaluesthatvary.Youdon'thavetothinkoftheexpressionbalancesList = map(getBalance, customersList) asassigningavaluetobalancesList.Instead,youcanthinkofitasthedefinitionofbalancesList.
6. SomeBenefitsofPureFunctions6.1. Testingfunctions:
6.1.1. Thisfunctionispuresothetestrequiresnosetup.
if mortgage(100000.00, 5.25, 30) = 552.20 return "Passed"
![Page 16: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/16.jpg)
16
else return "Failed"
6.1.2. Thisfunctionisn'tpureso,beforethetest,youhavetosetupthevalueofcurrentRatePercent.
currentRatePercent = 5.25 if mortgage(100000.00, 30) = 552.20 return "Passed" else return "Failed" Inthisexample,thesetupinvolvesonlyonestatement.Thesetupforafunctioninareal-lifeapplicationtypicallyinvolvesmanymorestatements.
6.2. ThefunctioninExercise6.1.1ispure,soitalwaysyieldsthesameresultwhenitrunswithparameters100000.00,5.25,30.(I'mignoringthingslikedifferencesinthewaycomputersperformarithmetic,orpeopletrippingoverpowercordswhilethefunctionexecutes.)Soifthefunctionpassesyourtestwithparameters100000.00,5.25,30,theprogramisguaranteedtoruncorrectlywiththoseparameters.
6.3. ThefunctioninExercise6.1.2isn'tpuresoitdoesn'talwaysyeildthesameresultwhenitrunswithparameters100000.00,30.ThefunctionmightbecorrectwhenthecurrentRatePercentis5.25,butnotwhenthecurrentRatePercentis6.00.
6.4. largestKnownFactorial = 1 for n from 1 to 100 do knownFactorials[n] = 1 loop input n count = 0 if n > largestKnownFactorial for i from largestKnownFactorial + 1 to n knownFactorials[i] = knownFactorials[i - 1] * i count = count + 1 largestKnownFactorial = n print knownFactorials[n] print count
Here'saJavaprogramtoimplementthepseudocode:
import java.math.BigInteger; import java.util.Scanner; public class Main { Scanner keyboard = new Scanner(System.in);
![Page 17: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/17.jpg)
17
public static void main(String[] args) { new Main(); } Main() { int n; BigInteger[] knownFactorials = new BigInteger[101]; int largestKnownFactorial = 1; for (n = 1; n <= 100; n++) { knownFactorials[n] = new BigInteger("1"); } for (;;) { System.out.print("n: "); n = keyboard.nextInt(); BigInteger result = new BigInteger("1"); int count = 0; for (int i = 2; i <= n; i++) { result = result.multiply( new BigInteger(Integer.toString(i))); count++; } System.out.println("Without memoization:::Result: " + result + " Count: " + count); count = 0; if (n > largestKnownFactorial) { for (int i = largestKnownFactorial + 1; i <= n; i++) { knownFactorials[i] = knownFactorials[i - 1] .multiply( new BigInteger(Integer.toString(i))); count++; } largestKnownFactorial = n; } System.out.println("With memoization:::Result: " + knownFactorials[n] + " Count: " + count); } } }
7. AvoidingRaceConditions
![Page 18: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/18.jpg)
18
7.1. Bobisavictimofaracecondition.WhileBobwaspreparingtorequest$100,CarolwaswithdrawingmoneyfromthesameaccountatadifferentATMmachine.BythetimeBobcompletedhisrequest,therewasn'tenoughmoneyintheaccounttocoverBob's$100withdrawal.
7.2. DividetheFoodpurchasesintotwothreads(perhapstwocoresonamulti-coreprocessor).ThreadAtotalsuphalfoftheFoodpurchaseswhileThreadBtotalsuptheotherhalf.Thegrandtotalismaintainedinacentrallocationthat'supdatedbybothThreadAandThreadB.Intheend,thegrandtotalisincorrect.Inthefunctionalversionoftheproblem,there'snototalvariable,onlyasumorfoldexpression.Sothecodedoesn'tlenditselftotheupdatingofmutablevariables.
7.3. Thevariablexismutableandtherearetwosimultaneousthreads(callthemThreadAandThreadB).Inascenariothatsuffersfromnoraceconditions,ThreadAexecutesallofitsstatementsandthenThreadBexecutesallofitsstatements.Inthisscenario,thefinalvalueofxis6.Inascenariothatsuffersthemostfromraceconditions,thefollowinghappens: ThreadAgetsthevalueofx,whichis0. ThreadBgetsthevalueofx,whichisstill0. ThreadAadds1to0andassigns1tox. ThreadBadds1to0andassigns1tox. ThreadAgetsthevalueofx,whichis1. ThreadBgetsthevalueofx,whichisstill1. ThreadAadds1to1andassigns2tox. ThreadBadds1to1andassigns2tox. ThreadAgetsthevalueofx,whichis2. ThreadBgetsthevalueofx,whichisstill2. ThreadAadds1to2andassigns3tox. ThreadBadds1to2andassigns3tox.
Theprogramprints3.
8. EfficientParameterPassing8.1. Considerthefollowingpseudocode:
f(2) print 2 print 2 + 2 f(x) { x = x + 1 } InanoldversionofFORTRAN,theoutputofthiscode(writteninFORTRANsyntax)wouldbe3 6,not2 4.
9. LazyEvaluation
![Page 19: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/19.jpg)
19
9.1.1. Withlazyevaluation,thecodedoesn'texecute(print(x) = 1)because,withxnotlessthan5,theifconditioncannotpossiblybetrue.Becausetheentireifconditionisfalse,sothecodedoesn'tprintanything.Witheagerevaluation,thecodeevaluatesbothx < 5and(print(x) = 1).Sothecodeprintsthevalueofx(whichis7).Becausetheteststillmakestheifstatement'sconditionfalse,thecodedoesn'tdisplayx is 7.Note:Inanextreme,counterproductiveversionofeagerevaluation,thecodewouldevaluatetheprint("x is", x)insidethebodyoftheifstatementeventhoughtheifstatement'sconditionisfalse,andthusdisplayx is 7.
9.1.2. AssumethattheArrayhasonly4elements,theArray[0],theArray[1],theArray[2],andtheArray[3].Withlazyevaluation,thecodeneverperformsthetesttheArray[10] = 0andthecalltoprintisn'texecuted.Witheagerevaluation,thecodeperformsthetesttheArray[10] = 0eventhoughtheoutcomeofthattesthasnoeffectonthevalueoftheifstatement'scondition.Insomelanguages,therequestforthevaluetheArray[10]overrunsthespaceallocatedtothearray(whichisn'tgood).Inotherlanguages,therequestfortheArray[10]generatesanerror.
9.1.3. Theexpression++x > 19adds1tox,makingthevalueofxbe19.Sothat++x > 19expressionisfalse.Withlazyevaluation,thecodedoesn'tbothertoexecuteprint(++x).Andbecauseit'sinsidethebodyoftheifstatement,thecodedoesn'texecuteprint("x is", x).Sotheonlyprintingthecodedoesisthefinalprint(x),andtheentireoutputisthenumber19.Witheagerevaluation,thecodeexecutesprint(++x).Executionofthatfunctioncalloutputsthevalue20.Thentheexecutionofthefinalprint(x)outputs20asecondtime.
9.1.4. Theevaluationoftheexpression++x > 18setsthevalueofxto19.So++x > 18istrue.That'senoughtomaketheentireifconditionbetruenomatterwhatcomesafterthewordor.Sothere'snoneedtoevaluateprint(++x).Withlazyevaluation,thecodedoesn'tevaluateprint(++x),sothecallprint("x is",x)displaysx is 19,andthefinalprint(x)calldisplays19again.So,overall,theoutputofthecodeisx is 19 19.Witheagerevaluation,thecodeevaluatesprint(++x)eventhoughthatevaluationdoesn'tchangethevalueoftheentireifstatementcondition.Evaluationofprint(++x)changesthevalueofxto20.andprints20.Thenthecodeexecutestheothertwoprintstatements.So,overalltheoutputofthecodeis20 x is 20 20.
9.1.5. Assumethatyisequalto0.Withlazyevaluation,thecodeignoresthethen (x /y)partandgoesstraighttotheelse xpart.Sotheoveralleffectislikeexecutingx = x + 1.Witheagerevaluation,thecodedoesn'tignorethethen (x /y)partanddividesxby0,whichisn'tagoodthingtodo.Insomelanguages,thisgeneratesanarithmeticerrorandtheprogramcrashes.
![Page 20: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/20.jpg)
20
9.1.6. Withbothlazyandeagerevaluation,thevalueofthisexpressionis0.9.1.7. Withlazyevaluation,thecodefiguresoutwhatfirstElementOfmeansand
looksforonlythefirstelementof[0, 3, 6, 9, 12, ... ]whichis0.Witheagerevaluation,thecodetriestofindallelementsof[0, 3, 6, 9, 12, ... ]andthattakesforever.Sothecodenevergetstolookforthefirstelementofthelist.
9.1.8. Withbothlazyandeagerevaluation,thecodehastofindallnumbersinthelist[0, 3, 6, 9, 12, ... ].Thattakesforever,soinbothcases,thecodenevercomesupwithananswer.
10. IntroductiontoHigher-OrderFunctions
10.1. 10.1.1. f∘g(5)=f(g(5))=f(25)=3210.1.2. f∘g(x)=f(x2)=x2+710.1.3. g∘f(5)=g(12)=14410.1.4. g∘f(x)=g(x+7)=(x+7)210.1.5. h∘h(5)=h(1/5)=1/(1/5)=510.1.6. g∘f∘h(5)=g(f(1/5))=g(1/5+7)=(1/5+7)210.1.7. g∘f∘h(x)=g(f(h(x)))=g(f(1/x))=g(1/x+7)=(1/x+7)2
10.2. Compositionisahigher-orderfunctionbecausecompositiontaketwofunctions(asitsparameters)andreturnsathirdfunctionasitsresult.Forexample,inExercise10.1.2,compositiontakesthefunctionsx2andx+7andcreatesthefunctionx2+7.
10.3. Thederivativetakesafunctionasitsparameterandreturnsanotherfunctionasitsresult.Forexample,d/dxtakesthefunctionx2andreturnsthefunction2xasitsresult.
10.4. ThefunctionthereExiststakes,asitsparametersafunction(suchaseven)andalist(suchas[1,3,5]).Thefirstparameter,even,isafunctionbecauseeventakeanumber(suchas1)andreturnstrueorfalse,dependingonwhetherthenumberisevenornot.Therefore,thereExistsisahigher-orderfunction.Similarly,forAllisahigher-orderfunction.
11. Currying
11.1.1. f:number->number11.1.2. f∘g:number->number11.1.3. Theresultisanewfunctionadd2,withtheformulaadd2(y)=y+2.
add2:number->number11.1.4. Whenyoucomposeonefunctionwithanotherfunction,yougetyetanother
function.∘:function,function->function
11.1.5. TheparameterlistforapplyNTimesisafunction(suchasx + 1)andanumber(suchas3).Theresultisafunction(representedbyanexpressionsuchas((x + 1) + 1) + 1).applyNTimes : function, number -> function
![Page 21: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/21.jpg)
21
11.1.6. TheaddFfunctiontakestwofunctionsasitsparametersandreturnsyetanotherfunctionasitsresult.addF : function, function -> function
11.1.7. Ididn'tfocusonthispointinthevideo,butwhenyougofromaddtocurryAdd,you'reapplyingafunctionthatyoucancallthecurryfunction.Inthisexample,thecurryfunctiontakestheaddfunctionasitsargumentandreturnsthecurryAddfunctionasitsresult.curry : function -> function
12. Closures12.1. Theoutputis
5 25 10 100 125
12.2. TheoutputisHello, Mr. Williams! Hello, Ms. Polywether! Hi, Joe!
12.3. TheoutputisHello(afterwaiting1second)Goodbye(afterwaiting4moreseconds)
13. IntroductiontoListsGeneral
13.1. head(tail([6,9,12,8])) = head([9,12,8]) = 913.2. tail(tail(tail([6,9,12,8]))) = tail(tail([9,12,8]))
= tail([12,8]) = [8] 13.3. construct(10,tail([21,15])) = construct(10,[8]) = [10,8]13.4. falsebecause tail([18,8]) isequalto [8] (thelistwhoseonlyentryisthe
number8)whichisn'tquitethesameasthenumber8.13.5. concatenate(concatenate([1,3],[1,8]),[0,0]) =
concatenate([1,3,1,8],[0,0])=[1,3,1,8,0,0]13.6. With x = [3,2,19],construct(head(x),tail(x)) =
consttruct(3, [2,9]) = [3,2,9] = x
14. Recursionand15. MoreRecursionExamples
15.1. isAPalindrome(aList) = (aList equals reverse(aList))
15.2. last(aList) = head(reverse(aList))
![Page 22: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/22.jpg)
22
15.3. factorials(1) = [1] factorials(n) = concatenate(factorials(n-1),[last(factorials(n-1))*n])
15.4. sum([]) = 0 sum(h::t) = h + sum(t)
15.5. firstNFrom(h::t, 1) = [h] firstNFrom(h::t, n) = construct(h, firstNFrom(t, n-1))
15.6. alternates([]) = [] alternates(h::[]) = [h] alternates(h::t) = h :: (alternates (tail t))
16. ComputationsthatMightFail16.1.
sqrtMaybe(10-10) is Just 0 Binding Just 0 with minus4Maybe yields Just -4 Binding Just -4 with reciprocalMaybe yields Just -1/4 Binding Just -1/4 with plus13Maybe yields Just 12.75
16.2. sqrtMaybe(17-1) is Just 4 Binding Just 4 with minus4Maybe yields Just 0 Binding Just 0 with reciprocalMaybe yields Nothing Binding Nothing with plus13Maybe yields Nothing
16.3. sqrtMaybe(9-10) is Nothing Binding Nothing with minus4Maybe yields Nothing Binding Nothing with reciprocalMaybe yields Nothing Binding Nothing with plus13Maybe yields Nothing
16.4. reciprocalMaybe(1) is Just 1/1 whichis Just 1 Binding Just 1 with sqrtMaybe yields Just 1
16.5. reciprocalMaybe(0) is Nothing Binding Nothing with sqrtMaybe yields Nothing
16.6. 16.6.1.
definitionMaybe("house") is Just "A building whose purpose is to regularly shelter the same person or people."
Binding Just "A building whose purpose is to regularly shelter the same person or people."to lengthMaybe yields Just 75.
![Page 23: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/23.jpg)
23
16.6.2. definitionMaybe("bxbutw") is Nothing BindingNothingtolengthMaybeyieldsNothing.
16.7. bind : Maybe a string, f -> Maybe an integer withf : string -> Maybe an integer Theruleforapplyingthisexercise'sbindisthesameastheruleforthebindinthevideo:"IfyouhaveJust y,applyftoygettingJust f(y)orNothing.IfyouhaveNothing,getNothing."
17. MoreMonads17.1.
parentsOf >>= parentsOf >>= siblingsOf 17.2.
employeesOf : person -> list of people clientsOf : person -> list of people bind : list of people, f -> list of people Theruleforapplyingthisexercise'sbindisthesameastheruleforthebindinthevideo:"Applyftoeachpersoninthelist,andthenflattentheresultinglist."
17.3. employeesOf >>= parentsOf
17.4. Definetwofunctions,sqrtMaybeMessandreciprocalMaybeMess. sqrtMaybeMess(4) is Just 2 sqrtMaybeMess(-4) is ErrorBecauseOf -4 reciprocalMaybeMess(5) is Just 1/5 reciprocalMaybeMess(0) is ErrorBecauseOf 0 Theruleforapplyingbindisasfollows:"IfyouhaveJust y,applyftoygettingJust f(y)orErrorBecauseOf y.IfyouhaveErrorBecauseOf y,getErrorBecauseOf y."So,forexample,intheexpressionsqrtMaybeMess(x-7) >>= minus4MaybeMess >>= reciprocalMaybeMess >>= plus13MaybeMesswithx=23,sqrtMaybeMess(23-7) is Just 4 Binding Just 4 with minus4MaybeMess yields Just 0 Binding Just 0 with reciprocalMaybeMess yields ErrorBecauseOf 0 BindingErrorBecauseOf0withplus13MaybeMessyieldsErrorBecauseOf 0
![Page 24: Exercises to Accompany Introduction to Functional ... to Accompany Introduction to Functional Programming ... Any Language with Barry Burd ... few simple sample programs on the web](https://reader030.vdocuments.site/reader030/viewer/2022021419/5ae18de87f8b9a0d7d8b4ba4/html5/thumbnails/24.jpg)
24
sqrtMaybeMess : float -> MaybeAFloatWithMessage reciprocalMaybeMess : float -> MaybeAFloatWithMessage bind : MaybeAFloatWithMessage, f -> MaybeAFloatWithMessage