SlideShare uma empresa Scribd logo
1 de 96
Baixar para ler offline
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;
}
どうなる?
300
200
200
200
200
200
200
200
200
...
無限ループ
なぜ?
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)
}
----
1
X
----
2
Y
----
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)
A
x = 10
k(10) = 20
B
answer = 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ってください
質問タイム?

Mais conteúdo relacionado

Mais procurados

Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
melpon
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
MITSUNARI Shigeo
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
MITSUNARI Shigeo
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
Akira Takahashi
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 

Mais procurados (20)

emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
llvm入門
llvm入門llvm入門
llvm入門
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
emcjp Item 42
emcjp Item 42emcjp Item 42
emcjp Item 42
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
テーマ「最適化 その2」
テーマ「最適化 その2」テーマ「最適化 その2」
テーマ「最適化 その2」
 

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

Boost9 session
Boost9 sessionBoost9 session
Boost9 session
freedom404
 
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるデジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
Atsushi Tadokoro
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
Koichi Sakata
 

Semelhante a Scalaの限定継続の応用と基本 (20)

競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Actor&stm
Actor&stmActor&stm
Actor&stm
 
X hago2 shortcoding 20110827
X hago2 shortcoding 20110827X hago2 shortcoding 20110827
X hago2 shortcoding 20110827
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 
モナドをつくろう
モナドをつくろうモナドをつくろう
モナドをつくろう
 
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるデジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 

Mais de Kota Mizushima

こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
Kota Mizushima
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力
Kota Mizushima
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足
Kota Mizushima
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
Kota Mizushima
 

Mais de Kota Mizushima (20)

ドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修について
 
kollectionの紹介
kollectionの紹介kollectionの紹介
kollectionの紹介
 
株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状
 
Macros in nemerle
Macros in nemerleMacros in nemerle
Macros in nemerle
 
Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -
 
Introduction to PEG
Introduction to PEGIntroduction to PEG
Introduction to PEG
 
Scalaの現状と今後
Scalaの現状と今後Scalaの現状と今後
Scalaの現状と今後
 
Power of Scala
Power of ScalaPower of Scala
Power of Scala
 
Scala Performance Tuning Tips
Scala Performance Tuning TipsScala Performance Tuning Tips
Scala Performance Tuning Tips
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 
About Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and BorrowingAbout Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and Borrowing
 
Scala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful librariesScala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful libraries
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 

Último

Último (11)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

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