You are on page 1of 23

6QH/ U_2/m+2V PT2`iBQMb

S`HH2H S`Q;`KKBM; BM a+H


oBFiQ` EmM+F
6mM+iBQMH T`Q;`KKBM; M/ +QHH2+iBQMb

q2 ?p2 b22M QT2`iBQM,


KT, TTHv 7mM+iBQM iQ 2+? 2H2K2Mi

! List(1,3,8).map(x => x*x) == List(1, 9, 64)

q2 MQr +QMbB/2`,
7QH/, +QK#BM2 2H2K2Mib rBi?  ;Bp2M QT2`iBQM

! List(1,3,8).fold(100)((s,x) => s + x) == 112


6QH/, K2MBM; M/ T`QT2`iB2b

6QH/ iF2b KQM; Qi?2`b  #BM`v QT2`iBQM- #mi p`BMib /Bz2`,

! r?2i?2` i?2v iF2 M BMBiBH 2H2K2Mi Q` bbmK2 MQM@2KTiv HBbi


! BM r?B+? Q`/2` i?2v +QK#BM2 QT2`iBQMb Q7 +QHH2+iBQM

List(1,3,8).foldLeft(100)((s,x) => s - x) == ((100 - 1) - 3) - 8 == 88


List(1,3,8).foldRight(100)((s,x) => s - x) == 1 - (3 - (8-100)) == -94
List(1,3,8).reduceLeft((s,x) => s - x) == (1 - 3) - 8 == -10
List(1,3,8).reduceRight((s,x) => s - x) == 1 - (3 - 8) == 6
hQ 2M#H2 T`HH2H QT2`iBQMb- r2 HQQF i bbQ+BiBp2 QT2`iBQMb

! //BiBQM- bi`BM; +QM+i2MiBQM U#mi MQi KBMmbV


bbQ+BiBp2 QT2`iBQM

PT2`iBQM f: (A,A) => A Bb bbQ+BiBp2 Bz 7Q` 2p2`v t, v, x,

7(t, 7(v, x)) = 7(7(t, v), x)

A7 r2 r`Bi2 7(, #) BM BM}t 7Q`K b  ⊗ #- bbQ+BiBpBiv #2+QK2b

t ⊗ (v ⊗ x) = (t ⊗ v) ⊗ x

*QMb2[m2M+2, +QMbB/2` irQ 2tT`2bbBQMb rBi? bK2 HBbi Q7 QT2`M/b


+QMM2+i2/ rBi? ⊗- #mi /Bz2`2Mi T`2Mi?2b2bX h?2M i?2b2 2tT`2bbBQMb
2pHmi2 iQ i?2 bK2 `2bmHi- 7Q` 2tKTH2,

(t ⊗ v) ⊗ (x ⊗ r) = (t ⊗ (v ⊗ x)) ⊗ r = ((t ⊗ v) ⊗ x) ⊗ r
h`22b 7Q` 2tT`2bbBQMb

1+? 2tT`2bbBQM #mBHi 7`QK pHm2b +QMM2+i2/ rBi? ⊗ +M #2 `2T`2b2Mi2/ b


 i`22

! H2p2b `2 i?2 pHm2b


! MQ/2b `2 ⊗

t ⊗ (v ⊗ x), ƒ
x ƒ
y z

(t ⊗ v) ⊗ (x ⊗ r), ƒ
ƒ ƒ
x y z w
6QH/BM; U`2/m+BM;V i`22b

>Qr /Q r2 +QKTmi2 i?2 pHm2 Q7 bm+? M 2tT`2bbBQM i`22\

sealed abstract class Tree[A]


case class Leaf[A](value: A) extends Tree[A]
case class Node[A](left: Tree[A], right: Tree[A]) extends Tree[A]

_2bmHi Q7 2pHmiBM; i?2 2tT`2bbBQM Bb ;Bp2M #v  `2/m+2 Q7 i?Bb i`22X


q?i Bb Bib Ub2[m2MiBHV /2}MBiBQM\
6QH/BM; U`2/m+BM;V i`22b

>Qr /Q r2 +QKTmi2 i?2 pHm2 Q7 bm+? M 2tT`2bbBQM i`22\

sealed abstract class Tree[A]


case class Leaf[A](value: A) extends Tree[A]
case class Node[A](left: Tree[A], right: Tree[A]) extends Tree[A]

_2bmHi Q7 2pHmiBM; i?2 2tT`2bbBQM Bb ;Bp2M #v  `2/m+2 Q7 i?Bb i`22X


q?i Bb Bib Ub2[m2MiBHV /2}MBiBQM\

def reduce[A](t: Tree[A], f : (A,A) => A): A = t match {


case Leaf(v) => v
case Node(l, r) => f(reduce[A](l, f), reduce[A](r, f)) // Node -> f
}

q2 +M i?BMF Q7 reduce b `2TH+BM; i?2 +QMbi`m+iQ` Node rBi? ;Bp2M f


_mMMBM; `2/m+2

6Q` MQM@bbQ+BiBp2 QT2`iBQM- i?2 `2bmHi /2T2M/b QM bi`m+im`2 Q7 i?2 i`22,

def tree = Node(Leaf(1), Node(Leaf(3), Leaf(8)))


def fMinus = (x:Int,y:Int) => x - y
def res = reduce[Int](tree, fMinus) // 6
S`HH2H `2/m+2 Q7  i`22

>Qr iQ KF2 i?i i`22 `2/m+2 T`HH2H\


S`HH2H `2/m+2 Q7  i`22

>Qr iQ KF2 i?i i`22 `2/m+2 T`HH2H\

def reduce[A](t: Tree[A], f : (A,A) => A): A = t match {


case Leaf(v) => v
case Node(l, r) => {
val (lV, rV) = parallel(reduce[A](l, f), reduce[A](r, f))
f(lV, rV)
}
}
S`HH2H `2/m+2 Q7  i`22

>Qr iQ KF2 i?i i`22 `2/m+2 T`HH2H\

def reduce[A](t: Tree[A], f : (A,A) => A): A = t match {


case Leaf(v) => v
case Node(l, r) => {
val (lV, rV) = parallel(reduce[A](l, f), reduce[A](r, f))
f(lV, rV)
}
}

q?i Bb i?2 /2Ti? +QKTH2tBiv Q7 bm+? `2/m+2\


S`HH2H `2/m+2 Q7  i`22

>Qr iQ KF2 i?i i`22 `2/m+2 T`HH2H\

def reduce[A](t: Tree[A], f : (A,A) => A): A = t match {


case Leaf(v) => v
case Node(l, r) => {
val (lV, rV) = parallel(reduce[A](l, f), reduce[A](r, f))
f(lV, rV)
}
}

q?i Bb i?2 /2Ti? +QKTH2tBiv Q7 bm+? `2/m+2\


Mbr2`, ?2B;?i Q7 i?2 i`22
bbQ+BiBpBiv bii2/ b i`22 `2/m+iBQM

>Qr +M r2 `2bii2 bbQ+BiBpBiv Q7 bm+? i`22b\

t ⊗ (v ⊗ x) = (t ⊗ v) ⊗ x
bbQ+BiBpBiv bii2/ b i`22 `2/m+iBQM

>Qr +M r2 `2bii2 bbQ+BiBpBiv Q7 bm+? i`22b\

t ⊗ (v ⊗ x) = (t ⊗ v) ⊗ x

ƒ ƒ
x ƒ ƒ z
4
y z x y

A7 7 /2MQi2b ⊕- BM a+H r2 +M r`Bi2 i?Bb HbQ b,

reduce(Node(Leaf(x), Node(Leaf(y), Leaf(z))), f) ==


reduce(Node(Node(Leaf(x), Leaf(y)), Leaf(z)), f)
P`/2` Q7 2H2K2Mib BM  i`22

P#b2`p2, +M mb2  HBbi iQ /2b+`B#2 i?2 Q`/2`BM; Q7 2H2K2Mib Q7  i`22

def toList[A](t: Tree[A]): List[A] = t match {


case Leaf(v) => List(v)
case Node(l, r) => toList[A](l) ++ toList[A](r) }
P`/2` Q7 2H2K2Mib BM  i`22

P#b2`p2, +M mb2  HBbi iQ /2b+`B#2 i?2 Q`/2`BM; Q7 2H2K2Mib Q7  i`22

def toList[A](t: Tree[A]): List[A] = t match {


case Leaf(v) => List(v)
case Node(l, r) => toList[A](l) ++ toList[A](r) }

amTTQb2 r2 HbQ ?p2 i`22 KT,

def map[A,B](t: Tree[A], f : A => B): Tree[B] = t match {


case Leaf(v) => Leaf(f(v))
case Node(l, r) => Node(map[A,B](l, f), map[A,B](r, f)) }

*M vQm 2tT`2bb toList mbBM; map M/ reduce\


P`/2` Q7 2H2K2Mib BM  i`22

P#b2`p2, +M mb2  HBbi iQ /2b+`B#2 i?2 Q`/2`BM; Q7 2H2K2Mib Q7  i`22

def toList[A](t: Tree[A]): List[A] = t match {


case Leaf(v) => List(v)
case Node(l, r) => toList[A](l) ++ toList[A](r) }

amTTQb2 r2 HbQ ?p2 i`22 KT,

def map[A,B](t: Tree[A], f : A => B): Tree[B] = t match {


case Leaf(v) => Leaf(f(v))
case Node(l, r) => Node(map[A,B](l, f), map[A,B](r, f)) }

*M vQm 2tT`2bb toList mbBM; map M/ reduce\


toList(t) == reduce(map(t, List(_)), _ ++ _)
*QMb2[m2M+2 bii2/ b i`22 `2/m+iBQM

*QMb2[m2M+2 Q7 bbQ+BiBpBiv, +QMbB/2` irQ 2tT`2bbBQMb rBi? bK2 HBbi Q7


QT2`M/b +QMM2+i2/ rBi? ⊗- #mi /Bz2`2Mi T`2Mi?2b2bX h?2M i?2b2
2tT`2bbBQMb 2pHmi2 iQ i?2 bK2 `2bmHiX
1tT`2bb i?Bb +QMb2[m2M+2 BM a+H mbBM; 7mM+iBQMb r2 ?p2 /2}M2/ bQ 7`X
*QMb2[m2M+2 bii2/ b i`22 `2/m+iBQM

*QMb2[m2M+2 Q7 bbQ+BiBpBiv, +QMbB/2` irQ 2tT`2bbBQMb rBi? bK2 HBbi Q7


QT2`M/b +QMM2+i2/ rBi? ⊗- #mi /Bz2`2Mi T`2Mi?2b2bX h?2M i?2b2
2tT`2bbBQMb 2pHmi2 iQ i?2 bK2 `2bmHiX
1tT`2bb i?Bb +QMb2[m2M+2 BM a+H mbBM; 7mM+iBQMb r2 ?p2 /2}M2/ bQ 7`X

*QMb2[m2M+2 Ua+HV, B7 f : (A,A)=>A Bb bbQ+BiBp2- t1:Tree[A] M/


t2:Tree[A] M/ B7 toList(t1)==toList(t2)- i?2M,

reduce(t1, f)==reduce(t2, f)
*QMb2[m2M+2 bii2/ b i`22 `2/m+iBQM

*QMb2[m2M+2 Q7 bbQ+BiBpBiv, +QMbB/2` irQ 2tT`2bbBQMb rBi? bK2 HBbi Q7


QT2`M/b +QMM2+i2/ rBi? ⊗- #mi /Bz2`2Mi T`2Mi?2b2bX h?2M i?2b2
2tT`2bbBQMb 2pHmi2 iQ i?2 bK2 `2bmHiX
1tT`2bb i?Bb +QMb2[m2M+2 BM a+H mbBM; 7mM+iBQMb r2 ?p2 /2}M2/ bQ 7`X

*QMb2[m2M+2 Ua+HV, B7 f : (A,A)=>A Bb bbQ+BiBp2- t1:Tree[A] M/


t2:Tree[A] M/ B7 toList(t1)==toList(t2)- i?2M,

reduce(t1, f)==reduce(t2, f)

*M r2 T`Qp2 i?i i?Bb 7+i 7QHHQrb 7`QK bbQ+BiBpBiv\


1tTHMiBQM Q7 i?2 +QMb2[m2M+2

AMimBiBQM, ;Bp2M  i`22- mb2 i`22 `QiiBQM mMiBH Bi #2+QK2b HBbi@HBF2X


bbQ+BiBpBiv Hr bvb i`22 `QiiBQM T`2b2`p2b i?2 `2bmHi,
ƒ ƒ
ƒ z x ƒ

x y y z

1tKTH2 mb2,

ƒ ƒ
x ƒ
ƒ ƒ ⇒ ƒ
y
x y p q p q

TTHvBM; `QiiBQM iQ i`22 T`2b2`p2b toList b r2HH b i?2 pHm2 Q7 reduceX


toList(t1)==toList(t2) ⇒ `QiiBQMb +M #`BM; t1-t2 iQ bK2 i`22
hQr`/b  `2/m+iBQM 7Q` ``vb

q2 ?p2 b22M `2/m+iBQM QM i`22bX


P7i2M r2 rQ`F rBi? +QHH2+iBQMb r?2`2 r2 QMHv FMQr i?2 Q`/2`BM; M/ MQi
i?2 i`22 bi`m+im`2X
>Qr +M r2 /Q `2/m+iBQM BM +b2 Q7- 2X;X- ``vb\

! +QMp2`i Bi BMiQ  #HM+2/ i`22


! /Q i`22 `2/m+iBQM

"2+mb2 Q7 bbQ+BiBpBiv- r2 +M +?QQb2 Mv i`22 i?i T`2b2`p2b i?2 Q`/2`
Q7 2H2K2Mib Q7 i?2 Q`B;BMH +QHH2+iBQM
h`22 `2/m+iBQM `2TH+2b Node +QMbi`m+iQ` rBi? f- bQ r2 +M Dmbi mb2 f
/B`2+iHv BMbi2/ Q7 #mBH/BM; i`22 MQ/2bX
q?2M i?2 b2;K2Mi Bb bKHH- Bi Bb 7bi2` iQ T`Q+2bb Bi b2[m2MiBHHv
S`HH2H ``v `2/m+2

def reduceSeg[A](inp: Array[A], left: Int, right: Int, f: (A,A) => A): A = {
if (right - left < threshold) {
var res= inp(left); var i= left+1
while (i < right) { res= f(res, inp(i)); i= i+1 }
res
} else {
val mid = left + (right - left)/2
val (a1,a2) = parallel(reduceSeg(inp, left, mid, f),
reduceSeg(inp, mid, right, f))
f(a1,a2)
}
}
def reduce[A](inp: Array[A], f: (A,A) => A): A =
reduceSeg(inp, 0, inp.length, f)

You might also like