Scalaの限定継続の応用と基本      in 高橋メソッド     水島 宏太     (@kmizu)
限定継続について話します
その前に
継続って何?
「これから行われる残りの計算 をパッケージ化したもの」
抽象的
わからない
必要なのは具体例
call/cc
説明しづらい
「ファーストクラスreturn」
void foo() {  Continuation<Void> c =`return`;  bar(c);  println("foo end");}void bar(Continuation<Void> c) {  for(int i = ...
"foo end"はどこにいった?
void foo() {  Continuation<Void> c =`return`;  bar(c);  println("foo end");}void bar(Continuation<Void> c) {  for(int i = ...
foo()の呼び出し元まで吹っ飛ぶ
例外みたい?
だいぶ違う
static Continuation<Integer> continuation;void main(String[] args) {  Integer result = hoge();  println("result = " + resu...
どうなる?
300200200200200200200200200...
無限ループ
なぜ?
static Continuation<Integer> continuation;void main(String[] args) {  Integer result = hoge();  println("result = " + resu...
一度抜けたメソッドに戻れる
タイムマシーンみたいな
一度呼び出したら返ってこない
これが普通の継続
限定継続
の前に応用例
の前に応用例
何の役に立つ?
がわからないとやる気がでない
というわけで応用例
ふつうの継続と同じ分野
利用側のコードだけ説明
実装の説明は難しい
Generator
C#のyieldとか
Pythonのジェネレータ
val x1: Iterator[Int] = make[Int]{yields =>  yields(1)  println("X")  yields(2)  println("Y")  yields(3)}while(x1.hasNext)...
----1X----2Y----3
yieldでStop the world
nextで再開
使う方は難しくない
Amb
非決定計算
実際にはただの総当り
block {  val x = amb(1, 2, 3)  val y = amb(4, 5)  printf("(%d, %d)%n", x, y)}
(1, 4)(1, 5)(2, 4)(2, 5)(3, 4)(3, 5)
Goto
継続は元々はgotoの形式化
reset { var sum = 0; var i = 0 val LOOP = label // gotoのためのラベルを作成    sum += i    i += 1    if(i <= 100) goto(LOOP) // goto...
他にも色々
話を戻して限定継続
色々方式がある
shift/reset
control/prompt
Scalaはshift/resetを採用
普通の継続との違いは?
戻れる範囲を制限
呼び出したら「返って来る」
これだけだとよくわからない
コード例
val answer = reset {  val x = shift { k: (Int => Int) =>    println("A")    println("k(10) = " + k(10))    println("B")   ...
Ax = 10k(10) = 20Banswer = 8
何故こうなる?
resetは継続の範囲を制限
shiftは少しめんどう
val x = shift { k: (Int => Int) =>   println("A")   println("k(10) = " + k(10))   println("B")   8 }
kが継続
型はInt => Int
Intを渡すとIntが「返って来る」
println("A")println("k(10) = " + k(10))println("B")8が評価される
その後が問題
shiftの呼び出し元に「返らない」
resetの呼び出し元に「返る」
ここがわかりにくい点
ところで
println("k(10) = " + k(10))
k(10)で何が起こってる?
shiftの呼び出し元に「返る」
println("x = " + x)x*2
resetを抜けるまでが評価される
最後にkの呼び出し元に「返る」
kの呼び出しの続きが評価される
何度でもkを呼び出せる
非常にややこしい
普通の人にshift/resetは…
中の人が知っていればいい話
でも面白い
宣伝
『オープンソース徹底活用Scala実践プログラミング』     秀和システム
共著で書きました
限定継続の話もあります
わかりにくければdisってください
質問タイム?
Upcoming SlideShare
Loading in …5
×

Scalaの限定継続の応用と基本

3,452 views

Published on

Scalaの限定継続の応用と基本を高橋メソッド風味で説明したプレゼンです。

Published in: Technology, Business
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,452
On SlideShare
0
From Embeds
0
Number of Embeds
26
Actions
Shares
0
Downloads
24
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Scalaの限定継続の応用と基本

  1. 1. Scalaの限定継続の応用と基本 in 高橋メソッド 水島 宏太 (@kmizu)
  2. 2. 限定継続について話します
  3. 3. その前に
  4. 4. 継続って何?
  5. 5. 「これから行われる残りの計算 をパッケージ化したもの」
  6. 6. 抽象的
  7. 7. わからない
  8. 8. 必要なのは具体例
  9. 9. call/cc
  10. 10. 説明しづらい
  11. 11. 「ファーストクラスreturn」
  12. 12. void foo() { Continuation<Void> c =`return`; bar(c); println("foo end");}void bar(Continuation<Void> c) { for(int i = 0; i <= 10; i ++ ) { if(i >= 5) { println("break!"); c.invoke(null); } }}foo() "break!"
  13. 13. "foo end"はどこにいった?
  14. 14. void foo() { Continuation<Void> c =`return`; bar(c); println("foo end");}void bar(Continuation<Void> c) { for(int i = 0; i <= 10; i ++ ) { if(i >= 5) { println("break!"); c.invoke(null); } }}foo() "break!"
  15. 15. foo()の呼び出し元まで吹っ飛ぶ
  16. 16. 例外みたい?
  17. 17. だいぶ違う
  18. 18. static Continuation<Integer> continuation;void main(String[] args) { Integer result = hoge(); println("result = " + result); continuation.invoke(200);}Integer hoge() { println("hoge started"); foo(`return`); println("hoge finished");}Integer foo(Continuation<Integer> escape) { continuation = escape; continuation.invoke(300);return -1;}
  19. 19. どうなる?
  20. 20. 300200200200200200200200200...
  21. 21. 無限ループ
  22. 22. なぜ?
  23. 23. static Continuation<Integer> continuation;void main(String[] args) { Integer result = hoge(); println("result = " + result); continuation.invoke(200);}Integer hoge() { println("hoge started"); foo(`return`); println("hoge finished");}Integer foo(Continuation<Integer> escape) { continuation = escape; continuation.invoke(300); return -1;}
  24. 24. 一度抜けたメソッドに戻れる
  25. 25. タイムマシーンみたいな
  26. 26. 一度呼び出したら返ってこない
  27. 27. これが普通の継続
  28. 28. 限定継続
  29. 29. の前に応用例
  30. 30. の前に応用例
  31. 31. 何の役に立つ?
  32. 32. がわからないとやる気がでない
  33. 33. というわけで応用例
  34. 34. ふつうの継続と同じ分野
  35. 35. 利用側のコードだけ説明
  36. 36. 実装の説明は難しい
  37. 37. Generator
  38. 38. C#のyieldとか
  39. 39. Pythonのジェネレータ
  40. 40. val x1: Iterator[Int] = make[Int]{yields => yields(1) println("X") yields(2) println("Y") yields(3)}while(x1.hasNext) { println("----") println(x1.next)}
  41. 41. ----1X----2Y----3
  42. 42. yieldでStop the world
  43. 43. nextで再開
  44. 44. 使う方は難しくない
  45. 45. Amb
  46. 46. 非決定計算
  47. 47. 実際にはただの総当り
  48. 48. block { val x = amb(1, 2, 3) val y = amb(4, 5) printf("(%d, %d)%n", x, y)}
  49. 49. (1, 4)(1, 5)(2, 4)(2, 5)(3, 4)(3, 5)
  50. 50. Goto
  51. 51. 継続は元々はgotoの形式化
  52. 52. reset { var sum = 0; var i = 0 val LOOP = label // gotoのためのラベルを作成 sum += i i += 1 if(i <= 100) goto(LOOP) // gotoでジャンプ println("1から100までの合計値:" + sum)}
  53. 53. 他にも色々
  54. 54. 話を戻して限定継続
  55. 55. 色々方式がある
  56. 56. shift/reset
  57. 57. control/prompt
  58. 58. Scalaはshift/resetを採用
  59. 59. 普通の継続との違いは?
  60. 60. 戻れる範囲を制限
  61. 61. 呼び出したら「返って来る」
  62. 62. これだけだとよくわからない
  63. 63. コード例
  64. 64. val answer = reset { val x = shift { k: (Int => Int) => println("A") println("k(10) = " + k(10)) println("B") 8 } println("x = " + x);x * 2}println("answer = " + answer)
  65. 65. Ax = 10k(10) = 20Banswer = 8
  66. 66. 何故こうなる?
  67. 67. resetは継続の範囲を制限
  68. 68. shiftは少しめんどう
  69. 69. val x = shift { k: (Int => Int) => println("A") println("k(10) = " + k(10)) println("B") 8 }
  70. 70. kが継続
  71. 71. 型はInt => Int
  72. 72. Intを渡すとIntが「返って来る」
  73. 73. println("A")println("k(10) = " + k(10))println("B")8が評価される
  74. 74. その後が問題
  75. 75. shiftの呼び出し元に「返らない」
  76. 76. resetの呼び出し元に「返る」
  77. 77. ここがわかりにくい点
  78. 78. ところで
  79. 79. println("k(10) = " + k(10))
  80. 80. k(10)で何が起こってる?
  81. 81. shiftの呼び出し元に「返る」
  82. 82. println("x = " + x)x*2
  83. 83. resetを抜けるまでが評価される
  84. 84. 最後にkの呼び出し元に「返る」
  85. 85. kの呼び出しの続きが評価される
  86. 86. 何度でもkを呼び出せる
  87. 87. 非常にややこしい
  88. 88. 普通の人にshift/resetは…
  89. 89. 中の人が知っていればいい話
  90. 90. でも面白い
  91. 91. 宣伝
  92. 92. 『オープンソース徹底活用Scala実践プログラミング』 秀和システム
  93. 93. 共著で書きました
  94. 94. 限定継続の話もあります
  95. 95. わかりにくければdisってください
  96. 96. 質問タイム?

×