• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Scalaの限定継続の応用と基本(改訂版)
 

Scalaの限定継続の応用と基本(改訂版)

on

  • 1,728 views

Scalaの限定継続の応用と基本について、高橋メソッド風味で説明したスライドの改訂版です。元のスライドの修正が反映されないため、新しいスライ...

Scalaの限定継続の応用と基本について、高橋メソッド風味で説明したスライドの改訂版です。元のスライドの修正が反映されないため、新しいスライドとした上げ直しました。

Statistics

Views

Total Views
1,728
Views on SlideShare
1,727
Embed Views
1

Actions

Likes
3
Downloads
13
Comments
0

1 Embed 1

http://paper.li 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Scalaの限定継続の応用と基本(改訂版) Scalaの限定継続の応用と基本(改訂版) Presentation Transcript

    • 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 = 0; i <= 10; i ++ ) { if(i >= 5) { println("break!"); c.invoke(null); } }}foo() "break!"
    • "foo end"はどこにいった?
    • 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!"
    • foo()の呼び出し元まで吹っ飛ぶ
    • 例外みたい?
    • だいぶ違う
    • 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;}
    • どうなる?
    • 300200200200200200200200200...
    • 無限ループ
    • なぜ?
    • 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;}
    • 一度抜けたメソッドに戻れる
    • タイムマシーンみたいな
    • 一度呼び出したら返ってこない
    • これが普通の継続
    • 限定継続
    • の前に応用例
    • の前に応用例
    • 何の役に立つ?
    • がわからないとやる気がでない
    • というわけで応用例
    • ふつうの継続と同じ分野
    • 利用側のコードだけ説明
    • 実装の説明は難しい
    • Generator
    • C#のyieldとか
    • Pythonのジェネレータ
    • val x1: Iterator[Int] = make[Int]{yields => yields(1) println("X") yields(2) println("Y") yields(3)}while(x1.hasNext) { println("----") println(x1.next)}
    • ----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でジャンプ println("1から100までの合計値:" + sum)}
    • 他にも色々
    • 話を戻して限定継続
    • 色々方式がある
    • 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") 8 } println("x = " + x);x * 2}println("answer = " + answer)
    • 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ってください
    • 質問タイム?