Continuations Scala Türkiye

217 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
217
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Continuations Scala Türkiye

  1. 1. Continuation Nedir? Ne i¸e yarar? s
  2. 2. Dosya A¸ma-Kapamayı Otomatize Edelim c Diyelim ki Scala da BufferedReader olu¸turup kullandıktan s sonra close i¸ini otomatikle¸tirmek istiyorsunuz s s Higher-order-function lar ile bunu ¸¨zebiliriz. co Yani callback
  3. 3. Dandik implementasyon def withFile(path:String) (callback: BufferedReader => Unit):Unit = { val f = new File(path) val fr = new FileReader(f) val br = new BufferedReader(fr) callback(br) br.close fr.close println("file closed") }
  4. 4. Kullanımı withFile("/tmp/hede"){ br => val lines1 = br.readLine withFile("/tmp/hede2"){ br2 => val lines2 = br2.readLine println(lines1 + " " + lines2) } }
  5. 5. Sorunlar Nested callback. Cok fazla i¸ i¸e yapı olunca okumak zorla¸ıyor ¸ c c s State payla¸acakları i¸in anonim fonksiyon yazıyoruz s c javascript, node.js :(
  6. 6. Hayallerde ya¸ıyor bazı geli¸tiriciler!!! s s Ke¸ke ¸¨yle yazabilseydik s so val file1 = withFile("/tmp/hede") val file2 = withFile("/tmp/hede2") val lines1 = file1.readLine val lines2 = file2.readLine println(lines1 + " " + lines2)
  7. 7. Shift/Reset ile r¨yalar ger¸ek oluyor. u c reset{ val file1 = shift(withFile("/tmp/hede")) val file2 = shift(withFile("/tmp/hede2")) val lines1 = file1.readLine val lines2 = file2.readLine println(lines1 + " " + lines2) }
  8. 8. Peki ama nasıl ??? Continuation Passing Style Dilde yazdı˘ımız t¨m fonksiyonlar callback alsa. g u Aslında javascript/ node.js tayfasının i¸i. s Hesaplamanın devamını callback ile yapsak. Hesaplama bitince callback ¸alı¸sa. c s
  9. 9. CPS - Factorial orne˘i ¨ g @tailrec def fact0(n: Int)(cont: Int => Int): Int = { if (n <= 0) cont(1) else fact0(n-1){x => cont(n * x) } }
  10. 10. Suna ¸evriliyor gibi¸ c fact0(3) Bundan emin de˘ilim!!! g def transFormed = { x0:Int => { x1:Int => { x2:Int => { callback:(Int => Int) => { (x0*(x1*(callback(x2)))) }}}}} transFormed(3)(2)(1)(x=>x)
  11. 11. Ozunde olay Stack kullanmaya gerek yok. Olaylar tailde. Function composition ve currying Daha guzel yazimi @tailrec def fact3(n: Int)(cont: Int => Int): Int = { if (n <= 0) cont(1) else fact3(n-1)(cont compose (n * _) ) }
  12. 12. Ee bu transform ne i¸imize yarıyor s shift etti˘imiz curried function CPS transform oluyor g Reset blogunun sonuna kadar Yani shift sonrasinda kalan Computation i yakalayip Bir CPS fonksiyona ¸eviriyor c Shift ten donen deger ise Continuation in aldigi parametre
  13. 13. Ornek Shift in sonrasi identity function Reset block’undan donen deger ise fact3 un cevabi. val k = reset{ val x = shift(fact3(5)) x } fact3 callback verelim diye kasmadik.
  14. 14. Client in shift ten haberi olmasin Hem callback vermeyecegiz Hem de client shift ile ilgilenmeyecek def withFile2(path:String):BufferedReader@cps[Unit] = { val f = new File(path) val fr = new FileReader(f) val br = new BufferedReader(fr) shift{k:(BufferedReader => Unit) => k(br) br.close fr.close println("file closed") } }
  15. 15. Nasil cagiriyoruz Ayni sekilde reset{ val file1 = withFile2("/tmp/hede") val file2 = withFile2("/tmp/hede2") val lines1 = file1.readLine val lines2 = file2.readLine println(lines1 + " " + lines2) }
  16. 16. CPS annotation Fonksiyonumuzun icinde reset edilmemi¸ shift block u varsa s CPS annotation ile i¸aretliyoruz s D¨n¨¸ tipi contiunation in aldigi tip o us annotated tip te continuation in dondurdugu tip.
  17. 17. Exception lar Exceptionlar da Control Flow a mudahale aslında Continuationlar la kendi exception turevlerimizi yapabiliriz Division By One diye bir exception uyduralim def divByOne(a: Int, b: Int):Double@cps[Unit] = { shift{ k:( Double => Unit) => if(b != 1) k(a/b) else println("division by one") } }
  18. 18. Cagiralim reset{ val x = divByOne(5, 6) val y = divByOne(5, 1) val res = x + y println(res) }
  19. 19. Sorular Ben de cok bilmiyorum =) Nasil yapildigi oldukca karisik. Monadic yapida bir transform var.

×