package Ġfp . kotlin . example . chapter 1 0 Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġlist 1 Ġ= Ġfun ListOf ( 1 , Ġ 2 , Ġ 3 ) ĊĠĠĠ Ġval Ġlist 2 Ġ= Ġfun ListOf ( 5 , Ġ 1 0 , Ġ 1 5 , Ġ 2 0 ) ĊĊĠĠĠ Ġprintln ( list 1 . me mpty ()) ĠĠ Ġ// Ġ[] ĊĠĠĠ Ġprintln ( list 1 Ġm append Ġlist 2 ) ĠĠĠ Ġ// Ġ[ 1 , Ġ 2 , Ġ 3 , Ġ 5 , Ġ 1 0 , Ġ 1 5 , Ġ 2 0 ] ĊĠĠĠ Ġprintln ( list 1 . f map Ġ{ Ġx Ġ-> Ġx Ġ* Ġ 2 Ġ}) Ġ Ġ// Ġ[ 2 , Ġ 4 , Ġ 6 ] ĊĠĠĠ Ġprintln ( Fun List . pure ( 1 0 )) ĠĠ Ġ// Ġ[ 1 0 ] ĊĊĠĠĠ Ġval Ġlist 3 Ġ= Ġfun ListOf <( Int ) Ġ-> ĠInt >({ Ġx Ġ-> Ġx Ġ* Ġ 2 Ġ}, Ġ{ Ġx Ġ-> Ġx Ġ+ Ġ 1 Ġ}, Ġ{ Ġx Ġ-> Ġx Ġ- Ġ 1 0 Ġ}) ĊĠĠĠ Ġprintln ( list 3 Ġapply Ġlist 1 ) Ġ Ġ// Ġ[ 2 , Ġ 4 , Ġ 6 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ- 9 , Ġ- 8 , Ġ- 7 ] ĊĠĠĠ Ġprintln ( list 3 Ġapply Ġlist 2 ) Ġ Ġ// Ġ[ 1 0 , Ġ 2 0 , Ġ 3 0 , Ġ 4 0 , Ġ 6 , Ġ 1 1 , Ġ 1 6 , Ġ 2 1 , Ġ- 5 , Ġ 0 , Ġ 5 , Ġ 1 0 ] ĊĠĠĠ Ġprintln ( list 1 Ġ_ apply Ġlist 3 ) Ġ Ġ// Ġ[ 2 , Ġ 4 , Ġ 6 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ- 9 , Ġ- 8 , Ġ- 7 ] ĊĠĠĠ Ġprintln ( list 2 Ġ_ apply Ġlist 3 ) Ġ Ġ// Ġ[ 1 0 , Ġ 2 0 , Ġ 3 0 , Ġ 4 0 , Ġ 6 , Ġ 1 1 , Ġ 1 6 , Ġ 2 1 , Ġ- 5 , Ġ 0 , Ġ 5 , Ġ 1 0 ] ĊĊĠĠĠ Ġprintln ( Nil Ġflat Map Ġ{ Ġx Ġ-> Ġfun ListOf ( x ) Ġ}) Ġ Ġ// Ġ[] ĊĠĠĠ Ġprintln ( list 1 Ġflat Map Ġ{ Ġx Ġ-> Ġfun ListOf ( x , Ġ- x ) Ġ}) ĠĠĠ Ġ// Ġ[ 1 , Ġ- 1 , Ġ 2 , Ġ- 2 , Ġ 3 , Ġ- 3 ] ĊĠĠĠ Ġprintln ( fun ListOf ( list 1 , Ġlist 2 ). flatten ()) Ġ Ġ// Ġ[ 1 , Ġ 2 , Ġ 3 , Ġ 5 , Ġ 1 0 , Ġ 1 5 , Ġ 2 0 ] ĊĊĠĠĠ Ġprintln ( fun ListOf ( 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġx Ġ-> Ġfun ListOf ( x Ġto Ġ' a ', Ġx Ġto Ġ' c ') Ġ} ĠĠĠĠ Ġ// Ġ[( 1 , Ġa ), Ġ( 1 , Ġc ), Ġ( 2 , Ġa ), Ġ( 2 , Ġc )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. f map Ġ{ Ġx Ġ-> Ġx . first Ġto Ġx . second . toUpperCase () Ġ} ĠĠĠĠ Ġ// Ġ[( 1 , ĠA ), Ġ( 1 , ĠC ), Ġ( 2 , ĠA ), Ġ( 2 , ĠC )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ._ apply ( fun ListOf <( Pair < Int , ĠChar >) Ġ-> ĠChar >({ Ġx Ġ-> Ġx . second Ġ}, Ġ{ Ġx Ġ-> Ġx . second Ġ+ Ġx . first Ġ})) ĠĠ Ġ// Ġ[ A , ĠB , ĠC , ĠD , ĠA , ĠC , ĠC , ĠE ] Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold Left ( Nil Ġas ĠFun List < Char >) Ġ{ Ġacc , Ġx Ġ-> Ġif Ġ( acc . contains ( x )) Ġacc Ġelse ĠCons ( x , Ġacc ) Ġ} ĠĠĠ Ġ// Ġ[ E , ĠD , ĠC , ĠB , ĠA ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĠĠ Ġ// Ġ[ E , ĠD , ĠC , ĠB , ĠA ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reverse () Ġ Ġ// Ġ[ A , ĠB , ĠC , ĠD , ĠE ] ĊĠĠĠ Ġ) Ċ } Ċ Ċ sealed Ġclass ĠFun List < out ĠT > Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ċ } Ċ Ċ object ĠNil Ġ: ĠFun List < kotlin . Nothing >() Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" []" Ċ } Ċ Ċ data Ġclass ĠCons < out ĠT >( val Ġhead : ĠT , Ġval Ġtail : ĠFun List < T >) Ġ: ĠFun List < T >() Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ"[ ${ fold Left ("") Ġ{ Ġacc , Ġx Ġ-> Ġ"$ acc , Ġ$ x " Ġ}. drop ( 2 )} ]" Ċ } Ċ Ċ fun Ġ< T > Ġfun ListOf ( var arg Ġelements : ĠT ): ĠFun List < T > Ġ= Ġelements . to Fun List () Ċ Ċ private Ġfun Ġ< T > ĠArray < out ĠT >. to Fun List (): ĠFun List < T > Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġthis . isEmpty () Ġ-> ĠNil ĊĠĠĠ Ġelse Ġ-> ĠCons ( this [ 0 ], Ġthis . copyOf Range ( 1 , Ġthis . size ). to Fun List ()) Ċ } Ċ Ċ fun Ġ< T > ĠFun List < T >. me mpty () Ġ= ĠNil Ċ Ċ infix Ġfun Ġ< T > ĠFun List < T >. m append ( other : ĠFun List < T >): ĠFun List < T > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠNil Ġ-> Ġother ĊĠĠĠ Ġis ĠCons Ġ-> ĠCons ( head , Ġtail . m append ( other )) Ċ } Ċ Ċ fun Ġ< T > ĠFun List < Fun List < T >> . flatten (): ĠFun List < T > Ġ= Ġfold Right ( me mpty ()) Ġ{ Ġt , Ġr : ĠFun List < T > Ġ-> Ġt Ġm append Ġr Ġ} Ċ Ċ fun Ġ< T > ĠFun List . Companion . pure ( value : ĠT ): ĠFun List < T > Ġ= ĠCons ( value , ĠNil ) Ċ Ċ infix Ġfun Ġ< T , ĠR > ĠFun List <( T ) Ġ-> ĠR >. apply ( f : ĠFun List < T >): ĠFun List < R > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠNil Ġ-> ĠNil ĊĠĠĠ Ġis ĠCons Ġ-> Ġf . f map ( head ) Ġm append Ġtail . apply ( f ) Ċ } Ċ Ċ infix Ġfun Ġ< T , ĠR > ĠFun List < T > ._ apply ( f : ĠFun List <( T ) Ġ-> ĠR >): ĠFun List < R > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠNil Ġ-> ĠNil ĊĠĠĠ Ġis ĠCons Ġ-> Ġf . f map Ġ{ Ġit ( head ) Ġ} Ġm append Ġtail ._ apply ( f ) Ċ } Ċ Ċ // infix Ġfun Ġ< T , ĠR > ĠFun List < T >. flatMap ( f : Ġ( T ) Ġ-> ĠFun List < R >): ĠFun List < R > Ġ= Ġwhen Ġ( this ) Ġ{ Ċ // ĠĠĠ Ġis ĠNil Ġ-> ĠNil Ċ // ĠĠĠ Ġis ĠCons Ġ-> Ġf ( head ) Ġm append Ġtail . flatMap ( f ) Ċ //} Ċ Ċ infix Ġfun Ġ< T , ĠR > ĠFun List < T >. flatMap ( f : Ġ( T ) Ġ-> ĠFun List < R >): ĠFun List < R > Ġ= Ġfmap ( f ). flatten () Ċ Ċ infix Ġfun Ġ< T , ĠR > ĠFun List < T >. f map ( f : Ġ( T ) Ġ-> ĠR ): ĠFun List < R > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠNil Ġ-> ĠNil ĊĠĠĠ Ġis ĠCons Ġ-> ĠCons ( f ( head ), Ġtail . f map ( f )) Ċ } Ċ Ċ // infix Ġfun Ġ< T , ĠR > ĠFun List < T >. f map ( f : Ġ( T ) Ġ-> ĠR ): ĠFun List < R > Ġ= Ġflat Map Ġ{ Ġx Ġ-> ĠCons ( f ( x ), ĠNil ) Ġ} Ċ Ċ fun Ġ< T , ĠR > ĠFun List < T >. fold Right ( acc : ĠR , Ġf : Ġ( T , ĠR ) Ġ-> ĠR ): ĠR Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠNil Ġ-> Ġacc ĊĠĠĠ Ġis ĠCons Ġ-> Ġf ( head , Ġtail . fold Right ( acc , Ġf )) Ċ } Ċ Ċ tail rec Ġfun Ġ< T , ĠR > ĠFun List < T >. fold Left ( acc : ĠR , Ġf : Ġ( R , ĠT ) Ġ-> ĠR ): ĠR Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠNil Ġ-> Ġacc ĊĠĠĠ Ġis ĠCons Ġ-> Ġtail . fold Left ( f ( acc , Ġhead ), Ġf ) Ċ } Ċ Ċ tail rec Ġfun Ġ< T > ĠFun List < T >. contains ( element : ĠT ): ĠBoolean Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠNil Ġ-> Ġfalse ĊĠĠĠ Ġis ĠCons Ġ-> Ġif Ġ( element Ġ== Ġhead ) Ġtrue Ġelse Ġtail . contains ( element ) Ċ } Ċ Ċ fun Ġ< T > ĠFun List < T >. distinct (): ĠFun List < T > Ġ= ĊĠĠĠ Ġfold Left ( Nil Ġas ĠFun List < T >) Ġ{ Ġacc , Ġx Ġ-> Ġif Ġ( acc . contains ( x )) Ġacc Ġelse ĠCons ( x , Ġacc ) Ġ} Ċ Ċ tail rec Ġfun Ġ< T > ĠFun List < T >. reverse ( acc : ĠFun List < T > Ġ= ĠNil ): ĠFun List < T > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠNil Ġ-> Ġacc ĊĠĠĠ Ġis ĠCons Ġ-> Ġtail . reverse ( Cons ( head , Ġacc )) Ċ } Ċ Ċ fun Ġ< T > ĠFun List < T >. filter ( acc : ĠFun List < T > Ġ= ĠNil , Ġf : Ġ( T ) Ġ-> ĠBoolean ): ĠFun List < T > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ ĠNil Ġ-> Ġacc . reverse () ĊĠĠĠ Ġis ĠCons Ġ-> Ġif Ġ( f ( head )) Ġ{ ĊĠĠĠĠĠĠĠ Ġtail . filter ( Cons ( head , Ġacc ), Ġf ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġtail . filter ( acc , Ġf ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun < T > Ġprint Fun List ( list : ĠFun List < T >) Ġ= Ġprintln ( list . toString By Fold Left ()) Ċ Ċ private Ġfun Ġ< T > ĠFun List < T >. toString By Fold Left (): ĠString Ġ= Ġ"[ ${ fold Left ("") Ġ{ Ġacc , Ġx Ġ-> Ġ"$ acc , Ġ$ x " Ġ}. drop ( 2 )} ]"