4. WHAT IS A FUNCTION?
x eix + e-ix
div(x, y) = cos(x) =
y 2
Takes same Inputs. Produces same Outputs.
No State change (Immutability). No Exceptions
Define behavior not tasks! Enables true composability.
No Side-Effects == Referential Transparency
5. WHAT IS A FIRST CLASS CITIZEN?
A function is a tool like a structure or a primitive might
be.
They encourage reuse and sharing. Thanks to their
composability.
The simplest composition being the classical f o g .
But there are plenty of others... of course.
6. SCALA =?= FP
Yes but mmmh...
> OO kept!
> Best of both worlds
> Imperative permitted
7. IMMUTABILITY
cs casUe(
ae ls sr
frtaeSrn,
isNm:tig
lsNm:tig
ataeSrn,
aeIt
g:n
)
vlnota =Ue(ad" "erla,3)
a oosb sr"ny, ptel" 1
nota.isNm ="oh / BN !
oosbfrtae na" / AG
vlna =nota.oyfrtae="oh,ae=2
a oh oosbcp(isNm Na" g )
8. NO EXCEPTIONS: OPTION
tatUi {
ri tl
dfpren(:tig:It
e asItsSrn) n
}
vliIt=Ui.asIt"" / Wa d yuepc?
a :n tlpren(a) / ht o o xet
tatUi {
ri tl
dfpren(:tig:Oto[n]
e asItsSrn) pinIt
}
vliOto[n]=Ui.asIt"" / = Nn =>BtWY
a :pinIt tlpren(a) / = oe = u H?
vloe
a n =Ui.asIt"" / = Sm() ..Hywe
tlpren(1) / = oe1 . e h
r' tetp?
es h ye
9. EXCEPTIONS. BUT...
tatUi {
ri tl
dfpren(:tig:Ete[xeto,It
e asItsSrn) ihrEcpin n]
}
vli
a =Ui.asIt"" /Lf(ubromtxeto(..)
tlpren(a) /etNmeFraEcpin"."
)
vloe =Ui.asIt"" /Rgh1
a n tlpren(1) /it()
10. USE THE VALUES: MAPPER
vlaep:pinIt =Ui.asItrqetgt"g")
a gOtOto[n] tlpren(eus.e(ae)
vlueOt=aep.a((g:n)= Ue(sm" "n" ae )
a srp gOtmp aeIt > sr"oe, Oe, g)
/mpueteebdvle. ltssewt Ls
/a s h me au.. e' e ih it
vlnosa =Ue(ad" "erla,3)
a ootb sr"ny, ptel" 1
vlna
a oh =Ue(na" "erla,2
sr"oh, ptel" )
vluesLs[sr =Ls(ootb na)
a sr:itUe] itnosa, oh
vlae:itIt
a gsLs[n] =uesmp (:sr = uae)
sr.a( uUe) > .g
vlaeSmlr
a gsipe =uesmp u= uae)
sr.a( > .g
vlaeEeSml
a gsvnipe =uesmp_ae
sr.a(.g)
11. COMPOSABILITY: FLATMAPPER
tatRqet{
ri eus
dfgtkySrn)Oto[tig
e e(e:tig:pinSrn]
}
vlaeau:pinSrn]
a gVleOto[tig =rqetgt"g"
eus.e(ae)
vlaep:pinIt
a gOtOto[n] =Ui.asItaeau)
tlpren(gVle
/ BN !
/ AG
vlaepOtOto[pinIt]=aeau.a(tlpren()
a gOtp:pinOto[n] gVlempUi.asIt_
)
/ BN !!
/ AG !
vlaeOto[n]
a g:pinIt =aeau.lta(tlpren
gVlefaMpUi.asI
t_)
()
/Go,ddû
/od ij
12. ADD CONTROL: FILTER
vlaeau:pinSrn] =rqetgt"g"
a gVleOto[tig eus.e(ae)
vlaep:pinIt
a gOtOto[n] =aeau.lta(tlpren()
gVlefaMpUi.asIt_)
vlalwd =aep.itr_> 1)
a loe gOtfle( = 8
vlna
a oh =alwdmpUe(na" "erla,_)/Nn
loe.a(sr"oh, ptel" ) /oe
vlnota =alwdmpUe(ad" "erla,_)/Sm
a oosb loe.a(sr"ny, ptel" ) /oe
13. PUTTING THE PIECES TOGETHER
dfgtloeUe(eus:eus)Oto[sr ={
e eAlwdsrrqetRqet:pinUe]
vlfrtaep:pinSrn]=rqetgt"isNm"
a isNmOtOto[tig eus.e(frtae)
vllsNmOtOto[tig =rqetgt"atae)
a ataep:pinSrn] eus.e(lsNm"
vlaep:pinIt
a gOtOto[n] =rqetgt"g".lta(t
eus.e(ae)faMpU
i.asIt_)
lpren()
vlalwdgOtOto[n] =aep.itr_> 1)
a loeAep:pinIt gOtfle( = 8
frtaep.lta {frtae=
isNmOtfaMp isNm >
lsNmOtfaMp{lsNm =
ataep.lta atae >
alwdgOtmp{alwdg =
loeAep.a loeAe >
Ue(isNm,lsNm,alwdg)
srfrtae atae loeAe
}
}
}
}
14. FOR COMPREHENSION
dfgtsrcekg:n=Boen(eus:eus)=
e eUe(hcAeIt>ola)rqetRqet
fr{
o
frtae< rqetgt"isNm"
isNm - eus.e(frtae)
lsNm < rqetgt"atae)
atae - eus.e(lsNm"
aetig< rqetgt"g"
gSrn - eus.e(ae)
ae
g < Ui.asItaetig i cekg(g)
- tlpren(gSrn) f hcAeae
}yedUe(isNm,lsNm,ae
il srfrtae atae g)
tp Rqet=MpSrn,Srn]
ye eus a[tig tig
vlalwdoDr :It= Boen
a loeFroa n > ola =(:n)> 2
_It =
vlgtloeUe :Rqet= Oto[sr
a eAlwdsr eus > pinUe] =gtsralwd
eUe(loeF
oDr)_
roa
vlna
a oh =gtloeUe(
eAlwdsr
Mp
a(
"isNm">na"
frtae-"oh,
"atae-"erla,
lsNm">ptel"
"g">2
ae-""
)
)