SlideShare una empresa de Scribd logo
1 de 72
Descargar para leer sin conexión
yield とreturn の話
bleis-tift
July 27, 2014
自己紹介
id:bleis-tift / @bleis
なごやではたらくゆるふわ F#er
静的型付きの関数型言語が好き
話すこと
第一部:コンピュテーション式
第二部:yield と return の違い ∼考察編∼
第三部:yield と return の違い ∼実装編∼
第四部:あるべき論とまとめ
コンピュテーション式を使う側の話ではなく、
作る側の話をします。
第一部:コンピュテーション式
コンピュテーション式とは
通常の F#の文法を拡張し、カスタマイズポイ
ントを提供した式
F#の文法に似た文法に、独自の処理を差し込
める
.
F#の文法
..
.
let someFunc a b =
let x = f a
let y = g b
x + y
.
コンピュテーション式
..
.
let someFunc a b = builder {
let! x = f a
let! y = g b
return x + y
}
コンピュテーション式でできることの例
option に対する match のネストを取り除く
状態変数の受け渡しを隠す
非同期処理における関数のネストを取り除く
などなど
ただし今回はここら辺はすっ飛ばすので注意
実現方法
F#では、コンピュテーション式は単なる式変
形の規則群によって実現
特定の interface を実装するなどの必要がない
式を変形した結果がコンパイル可能であるかど
うかが重要
.
.
コンピュテーション式の文法
変換規則
通常の文法
では、変換規則を見ていきましょう!
表記
ゴシック体 F#コード。例えば、fun x -> x
明朝体 F#コードの中で別の何かに置き換わ
る部分。例えば、cexpr
イタリック F#コードに関わらない部分(変換に
関わる部分)。例えば、T(e, C)
変換規則(最外部)
最初はコンピュテーション式の一番外側の部分
です。
.
. builder-expr { cexpr }
これは、次のように変換されます。
.
. let b = builder-expr in {| cexpr |}
b はフレッシュな変数です。
builder-expr
単なる式(別名「ビルダー」)
ビルダー自体は 1 つのコンピュテーション式
につき 1 回しか評価されない
ビルダーの型に変換で呼び出されるメソッド
を定義する
メソッドはすべてインスタンスメソッド
{| ... |}
括弧の中に含まれる式をコア言語に変換する
{| cexpr |} であれば、cexpr を変換する
どう変換するかは、以降の変換規則参照
cexpr
変換対象となる一番外側のコンピュテーショ
ン式
これ以外のコンピュテーション式は、ce と
表現
cexpr は必要があれば Delay 変換、Quote 変
換、Run 変換が行われる
変換規則の表現
変換規則は、T 表記によって記述する
.
T 表記
..
.T(e, C)
e:変換されるコンピュテーション式
C:変換済みのコンテキスト情報
e にマッチする変換規則を探し、変換していく
{| cexpr |}のT 表記による表現(T 表現)
.
{| cexpr |} の T 表現
..
. {| cexpr |} ≡ T(cexpr, λv.v)
λv.v の部分は、無名関数
ドット以前が引数
ドット以降が本体
最終的に、v に変換された式がやってくるの
で、それをそのまま返す
関数適用は実行時ではなく、
コンパイル時に行われる
return の変換規則
.
return の変換規則
..
. T(return e, C) = C(b.Return(e))
cexpr が return 42 だった場合の変換は、
.
return の変換例
..
.
T(return 42, λv.v)
−→(λv.v)(b.Return(42))
−→b.Return(42)
できた!
let の変換規則
.
変換規則
..
.
T(return e, C) = C(b.Return(e))
T(let p = e in ce, C) = T(ce, λv.C(let p = e in v))
.
let の変換例
..
.
T(let x = 42 in return x, λv1.v1)
−→T(return x, λv2.(λv1.v1)(let x = 42 in v2))
−→(λv2.(λv1.v1)(let x = 42 in v2))(b.Return(x))
−→(λv1.v1)(let x = 42 in b.Return(x))
−→let x = 42 in b.Return(x)
if の変換規則
.
変換規則
..
.
{| cexpr |} ≡ T(cexpr, λv.v)
T(return e, C) = C(b.Return(e))
T(if e then ce1 else ce2, C) = C(if e then {| ce1 |} else {| ce2 |})
T(if e then ce, C) = C(if e then {| ce |} else b.Zero())
.
if の変換例
..
.
T(if c then return 42, λv1.v1)
−→(λv1.v1)(if c then {| return 42 |} else b.Zero())
−→(λv1.v1)(if c then T(return 42, λv2.v2) else b.Zero())
−→(λv1.v1)(if c then (λv2.v2)(b.Return(42)) else b.Zero())
−→(λv1.v1)(if c then b.Return(42) else b.Zero())
−→if c then b.Return(42) else b.Zero()
ce1; ce2 の変換規則
.
変換規則
..
.
{| cexpr |} ≡ T(cexpr, λv.v)
T(return e, C) = C(b.Return(e))
T(ce1; ce2, C) = C(b.Combine({| ce1 |},b.Delay(fun () -> {| ce2 |})))
.
ce1; ce2 の変換例
..
.
T(return 10; return 20, λv1.v1)
−→(λv1.v1)(b.Combine({| return 10 |},b.Delay(fun () -> {| return 20 |})))
−→(λv1.v1)
(b.Combine(T(return 10, λv2.v2),b.Delay(fun () -> T(return 20, λv3.v3))))
−→(λv1.v1)
(b.Combine((λv2.v2)(b.Return(10)),b.Delay(fun () -> (λv3.v3)(b.Return(20)))))
−→(λv1.v1)(b.Combine(b.Return(10),b.Delay(fun () -> b.Return(20))))
−→b.Combine(b.Return(10),b.Delay(fun () -> b.Return(20)))
while の変換規則
.
変換規則
..
.
{| cexpr |} ≡ T(cexpr, λv.v)
T(return e, C) = C(b.Return(e))
T(if e then ce, C) = C(if e then {| ce |} else b.Zero())
T(ce1; ce2, C) = C(b.Combine({| ce1 |},b.Delay(fun () -> {| ce2 |})))
T(while e do ce, C) = T(ce, λv.C(b.While(fun () -> e,b.Delay(fun () -> v))))
.
while の変換例
..
.
T (while f() do if g() then return 42 done; return 0, λv1.v1)
−→(λv1.v1)(b.Combine({| while f() do if g() then return 42 |},b.Delay(fun () -> {| return 0 |})))
−→(λv1.v1)(b.Combine(
T (if g() then return 42, λv2.b.While(fun () -> f(),b.Delay(fun () -> v2)))
,b.Delay(fun () -> b.Return(0))))
−→(λv1.v1)(b.Combine(
(λv2.b.While(fun () -> f(),b.Delay(fun () -> v2)))(if g() then b.Return(42) else b.Zero())
,b.Delay(fun () -> b.Return(0))))
−→(λv1.v1)(b.Combine(
b.While(fun () -> f(),b.Delay(fun () -> if g() then b.Return(42) else b.Zero()))
,b.Delay(fun () -> b.Return(0))))
−→b.Combine(b.While(fun () -> f(),b.Delay(fun () -> if g() then b.Return(42) else b.Zero()))
,b.Delay(fun () -> b.Return(0)))
Fのコンピュテーション式の特徴
F#のコンピュテーション式は、
Haskell の do 式
Scala の for 式
C#のクエリ式
などと同じような仕組み
違うのは、コア言語と同等以上の表現力を持ち得
る点(ループ構文や例外処理なども使える)
→ F#のコンピュテーション式は
表現力が豊富!
第二部:yieldとreturnの違い
∼考察編∼
yield とreturn の変換規則
.
変換規則
..
.
T(yield e, C) = C(b.Yield(e))
T(return e, C) = C(b.Return(e))
メソッドが違うだけ・・・
今回の主題:
なぜコード上での意味が同じ
変換規則を持つものがあるのか?
yield とreturn を使い分ける?
yieldっぽいものには yield を使い、returnっぽ
いものには return を使う・・・?
コレクションっぽいものには yield を使い、そ
うでないっぽいものには return を使う・・・?
っぽいって何!
曖昧な判断基準は避けたい
yield とreturn の違いを考える
辞書を引いてみる
yield 生み出す。produce/provide
return 戻す。give back
return はその後の処理を実行しないようにすべき
モナドの return?知りませんなぁ
yield とreturn の違い
.
yield
..
.
list {
yield 1
printfn done
}
.
return
..
.
list {
return 1
printfn done
}
doneが出力されるべきかどうか
Cではどうか?
return
IET
yield return
yield break
クエリ式
select
目指すのは、IETの yield return と yield break の
ようなもの
seq 式
return に非対応
C#での yield break に相当する操作が困難
よし、seq をコンピュテーション式で再実装して
みよう!
第三部:yieldとreturnの違い
∼実装編∼
実装する上での問題点
yield も return も、変換規則が同じ・・・
実装案1
return が処理を打ち切る、という点に注目し
てみる
return したらそのコンピュテーション式を抜
け、値を返す必要がある
Return メソッドで返したい値を含む例外を投
げ、Run で捕捉すればいい!
例外による実装
.
ビルダー
..
.
type ReturnExn'T(xs: 'T seq) =
inherit System.Exception()
member this.Value = xs
type SeqBuilder'T() =
member this.Yield(x: 'T) = Seq.singleton x
member this.Return(x: 'T) =
raise (ReturnExn(Seq.singleton x))
member this.Combine(xs: 'T seq, cont: unit - 'T seq) =
Seq.append xs (cont ())
member this.Delay(f: unit - 'T seq) = f
member this.Run(f: unit - 'T seq) =
try f () with
| :? ReturnExn'T as e - e.Value
let seq2'T = SeqBuilder'T() // 型関数
例外による実装
.
使用例
..
.
 seq2 { yield 1; yield 2 };;
val it : seqint = seq [1; 2]
 seq2 { return 1; return 2 };;
val it : seqint = seq [1]
おぉ!
例外による実装
Scala の一部の return や、break でも例外を
使っている
分かりやすいように見える
だがしかし!
例外による実装の問題点
.
ダメな例
..
.
 seq2 { yield 1; return 2; return 3 };;
val it : seqint = seq [2]
yield が C#の yield return、return が C#の yield break
だとすると
.
C#でやる
..
.
IEnumerableint F() {
yield return 1;
yield break 2;
yield break 3; }
これは、1 と 2 を含むシーケンスを返す
改良版
.
Combine でも ReturnExn を捕捉
..
.
type SeqBuilder'T() =
member this.Yield(x: 'T) = Seq.singleton x
member this.Return(x: 'T) =
raise (ReturnExn(Seq.singleton x))
member this.Combine(xs: 'T seq, cont: unit - 'T seq) =
try
Seq.append xs (cont ())
with
| :? ReturnExn'T as e -
raise (ReturnExn(Seq.append xs e.Value))
member this.Delay(f: unit - 'T seq) = f
member this.Run(f: unit - 'T seq) =
try f () with
| :? ReturnExn'T as e - e.Value
let seq2'T = SeqBuilder'T()
例外による実装
try-with を提供する場合は、ReturnExn を捕捉
して reraise する必要がある
結局そんなに分かりやすい実装にはならない
例外をフロー制御に使うことに対する抵抗感
やりたいことは実現できた
実装案2
その後の処理を続ける/続けないが判定でき
ればいい
「その後の処理」を関数として受け取るメ
ソッドでその関数を呼び出すか判定を入れる
状態変数による実装
.
ビルダー
..
.
type SeqBuilder() =
let mutable isExit = false
member this.Yield(x) = Seq.singleton x
member this.Return(x) =
isExit - true
Seq.singleton x
member this.Combine(xs, cont) =
if isExit then xs else Seq.append xs (cont ())
member this.Delay(f) = f
member this.Run(f) =
let res = f ()
isExit - false
res
let seq2 = SeqBuilder()
状態変数による実装
.
使用例
..
.
 seq2 { yield 1; yield 2 };;
val it : seqint = seq [1; 2]
 seq2 { return 1; return 2 };;
val it : seqint = seq [1]
 seq2 { yield 1; return 2; return 3 };;
val it : seqint = seq [1; 2]
おぉ!
状態変数による実装
単純
分かりやすいように見える
だがしかし!
状態変数による実装の問題点
ビルダーが状態を持っている
マルチスレッド等で同時に同じビルダーのイ
ンスタンス(seq2)を使うと・・・
.
.
Thread A
seq2 {
yield 1
; // Combine
yield 2 // oops!
} // Run
val it : seqint = seq [1]
seq2.isExit
false
true
false
Thread B
seq2 {
return 10
} // Run
改良版
.
ビルダー
..
.
type SeqBuilder() =
(* 省略 *)
let seq2 () = SeqBuilder()
.
使用例
..
.
 seq2 () { yield 1; yield 2 };;
val it : seqint = seq [1; 2]
 seq2 () { return 1; return 2 };;
val it : seqint = seq [1]
 seq2 () { yield 1; return 2; return 3 };;
val it : seqint = seq [1; 2]
状態変数による実装
ビルダーのインスタンスを毎回作る
ユーザがインスタンスを共有することは禁止
できない
毎回関数呼び出しするのは面倒
実用には耐えない・・・
実装案3
状態変数による実装は、ビルダーのインスタ
ンスに保持しているのが問題
引数で持ちまわせばいいじゃない!
内部で状態を引数で引き回し、Run ではがす
Combine で状態が Break だったら後続処理を実行
しない
状態引数による実装
.
ビルダー
..
.
type FlowControl = Break | Continue
type SeqBuilder() =
member this.Yield(x) = Seq.singleton x, Continue
member this.Return(x) = Seq.singleton x, Break
member this.Combine((xs, st), cont) =
match st with
| Break - xs, Break
| Continue -
let ys, st = cont ()
Seq.append xs ys, st
member this.Delay(f) = f
member this.Run(f) = f () | fst
let seq2 = SeqBuilder()
状態引数による実装
.
使用例
..
.
 seq2 { yield 1; yield 2 };;
val it : seqint = seq [1; 2]
 seq2 { return 1; return 2 };;
val it : seqint = seq [1]
 seq2 { yield 1; return 2; return 3 };;
val it : seqint = seq [1; 2]
おぉ!
状態引数による実装
yield と return の対称性が明確になった
通常の実装よりもかなり複雑
いいのでは?
yield とreturn の実装比較
.
例外による実装
..
.
member this.Yield(x: 'T) = Seq.singleton x
member this.Return(x: 'T) =
raise (ReturnExn(Seq.singleton x))
.
状態変数による実装
..
.
member this.Yield(x) = Seq.singleton x
member this.Return(x) =
isExit - true
Seq.singleton x
.
状態引数による実装
..
.
member this.Yield(x) = Seq.singleton x, Continue
member this.Return(x) = Seq.singleton x, Break
実装案4
例外による実装では、処理を打ち切るために
例外を使った
これは、継続を捨てることと同義
yield の場合は継続を呼び出す
return の場合は継続を捨てる
継続渡しによる実装
.
ビルダー
..
.
type SeqBuilder() =
member this.Yield(x) = fun k - k (Seq.singleton x)
member this.Return(x) = fun _ - Seq.singleton x
member this.Combine(f, cont) =
fun k - f (fun xs - cont () k | Seq.append xs)
member this.Delay(f) = f
member this.Run(f) = f () id
let seq2 = SeqBuilder()
.
使用例
..
.
 seq2 { yield 1; yield 2 };;
val it : seqint = seq [1; 2]
 seq2 { return 1; return 2 };;
val it : seqint = seq [1]
 seq2 { yield 1; return 2; return 3 };;
val it : seqint = seq [1; 2]
継続渡しによる実装
yield と return の対称性が明確
コードは短いが、複雑(Bind を実装してない
詐欺)
これは状態引数版もだけど・・・
実装の速度比較
各実装で 10 万回 yield してみた
ビルダー 時間
return しない実装 20.5ms
例外による実装 20.5ms
状態変数による実装 20.7ms
状態引数による実装 21.2ms
継続による実装 22.6ms
seq 式 1.18ms
実装法による差は小さいが、
そもそも独自のビルダーは遅い
第四部:あるべき論とまとめ
ここまで
コンピュテーション式は表現力が豊富
yield と return は変換規則は同じだが、意味は
違う
標準の seq 式は return に対応していない→再
実装
シーケンス用の yield と return に別の意味を持
たせる複数の実装
例外による実装
状態変数による実装(実用には耐えない)
状態引数による実装
継続による実装
各ライブラリでの実装状況
seq/list/option のいずれかに対するコンピュ
テーション式が return をどう扱うか
対象ライブラリ
FSharpx
ExtCore
FSharpPlus
Basis.Core
2014 年 7 月 21 日時点
各ライブラリでの実装状況
.
検証用コード例
..
.
let xs = [30; 10; 15; 21; -1; 50]
builder {
let i = ref 0
while !i  xs.Length do
if xs.[!i] = -1 then
return false
incr i
return true
}
コンパイルできるか
false 的なものが返るか
各ライブラリでの実装状況
.
検証用コード例展開
..
.
let b = builder
b.Run(
b.Delay(fun () -
let i = ref 0
b.Combine(
b.While(
(fun () - !i  xs.Length),
b.Delay(fun () -
b.Combine(
(if xs.[!i] = -1 then b.Return(false)
else b.Zero()),
b.Delay(fun () - incr i; b.Zero())))),
b.Delay(fun () - b.Return(true)))))
FSharpx
コンパイルできない
FSharpx
Combine の型が駄目
.
FSharpx の Combine のシグネチャ
..
.'a option * ('a - 'b option) - 'b option
.
エラー箇所の展開
..
.
// 'a option * ('a - 'b option) - 'b option
b.Combine(
// bool option
(if xs.[!i] = -1 then b.Return(false) else b.Zero()),
// unit - 'a option
b.Delay(fun () - incr i; b.Zero()))
.
正しいシグネチャ
..
.'a option * (unit - 'a option) - 'a option
ExtCore
コンパイルできない
ExtCore
Zero の実装が駄目
.
ExtCore の Zero の実装
..
.
member inline __.Zero () : unit option =
Some () // TODO : Should this be None?
コメント・・・
FSharpPlus
コンパイルできない
While をそもそも提供していない
それはそれでアリな選択肢。潔い
Basis.Core
コンパイルできた
falseっぽいものが返った
各ライブラリでの実装状況
比較になりませんでした!
yield とreturn の違い再考
コンピュテーション式を正しく実装できてい
るライブラリの少なさ
yield/return 以前の問題
本当に意味上の違いを与えるべき?
F#のコンピュテーション式の表現力を活かすな
ら与えるべき
Bind と Return くらいしか提供しないなら不要
(FSharpPlus はこちら)
コンピュテーション式再考
Yield や Return が継続を受け取ればよかった?
効率を考えると、コンパイル時に解決したほう
がいい
現状のままでも実現可能
この柔軟性を活用しない手はないのでは?
方針の提案
ライブラリの性質によって、何を実装するかを分
けて考える
モナド/モナドプラス程度の提供でとどめる
場合
より汎用的な計算も行えるようにする場合
モナド以外にコンピュテーション式を使う
場合
モナド/モナドプラス提供程度の場合
モナド提供程度
Bind/Return は必須(定義より)
ReturnFrom もあると便利
場合によっては、Run を別で提供
モナドに包まれた値を取り出すコンピュテーショ
ン式
モナドプラス提供程度
モナド用のメソッドに加え、Zero と Combine
Zero は mzero、Combine は mplus に対応
Combine の変換規則により、Delay も必要
member this.Delay(f) = f ()
より汎用的なライブラリの場合
機能別にモジュールを分ける
Bind/Return 程度を提供するビルダー用モ
ジュール
Combine も使える高級なビルダー用モジュール
Combine は mplus に対応するものではなく、
継続を受け取る版を採用する
必然的に、Delay/Run の実装も必要
member this.Delay(f) = f
member this.Run(f) = f ()
Zero もあった方がいい
else なしの if が使えるようになる
モナド以外の場合
できるだけやめておいた方が・・・
Combine を提供する場合、yield と return を実
装し分ける
カスタムオペレータを使うことも考慮に入
れる
今後の課題
FSharpx/ExtCore にバグ報告
機能別にモジュールを分けたコンピュテー
ション式ライブラリの作成
実装したビルダー(特に状態引数による実装
と、継続による実装)の意味的な正しさの
検証
提案した方針の啓蒙
おわり

Más contenido relacionado

La actualidad más candente

「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム信之 岩永
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介Takeo Imai
 
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】Hiro H.
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
グラフ構造のデータモデルをPower BIで可視化してみた
グラフ構造のデータモデルをPower BIで可視化してみたグラフ構造のデータモデルをPower BIで可視化してみた
グラフ構造のデータモデルをPower BIで可視化してみたCData Software Japan
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
 
ホモトピー型理論入門
ホモトピー型理論入門ホモトピー型理論入門
ホモトピー型理論入門k h
 
ナレッジグラフとオントロジー
ナレッジグラフとオントロジーナレッジグラフとオントロジー
ナレッジグラフとオントロジーUniversity of Tsukuba
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
Boost.Preprocessorでプログラミングしましょう
Boost.PreprocessorでプログラミングしましょうBoost.Preprocessorでプログラミングしましょう
Boost.Preprocessorでプログラミングしましょうdigitalghost
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについてmametter
 

La actualidad más candente (20)

「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介
 
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
グラフ構造のデータモデルをPower BIで可視化してみた
グラフ構造のデータモデルをPower BIで可視化してみたグラフ構造のデータモデルをPower BIで可視化してみた
グラフ構造のデータモデルをPower BIで可視化してみた
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
ホモトピー型理論入門
ホモトピー型理論入門ホモトピー型理論入門
ホモトピー型理論入門
 
ナレッジグラフとオントロジー
ナレッジグラフとオントロジーナレッジグラフとオントロジー
ナレッジグラフとオントロジー
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
Boost.Preprocessorでプログラミングしましょう
Boost.PreprocessorでプログラミングしましょうBoost.Preprocessorでプログラミングしましょう
Boost.Preprocessorでプログラミングしましょう
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
 

Destacado

F#の基礎(嘘)
F#の基礎(嘘)F#の基礎(嘘)
F#の基礎(嘘)bleis tift
 
F#事例発表
F#事例発表F#事例発表
F#事例発表bleis tift
 
F#の基礎(?)
F#の基礎(?)F#の基礎(?)
F#の基礎(?)bleis tift
 
解説?FSharp.Quotations.Compiler
解説?FSharp.Quotations.Compiler解説?FSharp.Quotations.Compiler
解説?FSharp.Quotations.Compilerbleis tift
 
.NET系開発者から見たJava
.NET系開発者から見たJava.NET系開発者から見たJava
.NET系開発者から見たJavableis tift
 
ぼくのかんがえたさいきょうのLL
ぼくのかんがえたさいきょうのLLぼくのかんがえたさいきょうのLL
ぼくのかんがえたさいきょうのLLbleis tift
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
関数型言語のすすめ
関数型言語のすすめ関数型言語のすすめ
関数型言語のすすめbleis tift
 
C#(VB)プログラマのためのF#入門
C#(VB)プログラマのためのF#入門C#(VB)プログラマのためのF#入門
C#(VB)プログラマのためのF#入門bleis tift
 
Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指してbleis tift
 
SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~bleis tift
 
輪るビングドラム.NET
輪るビングドラム.NET輪るビングドラム.NET
輪るビングドラム.NETbleis tift
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented ProgrammingScott Wlaschin
 
仕事で使うF#
仕事で使うF#仕事で使うF#
仕事で使うF#bleis tift
 

Destacado (16)

F#の基礎(嘘)
F#の基礎(嘘)F#の基礎(嘘)
F#の基礎(嘘)
 
F#事例発表
F#事例発表F#事例発表
F#事例発表
 
F#の基礎(?)
F#の基礎(?)F#の基礎(?)
F#の基礎(?)
 
解説?FSharp.Quotations.Compiler
解説?FSharp.Quotations.Compiler解説?FSharp.Quotations.Compiler
解説?FSharp.Quotations.Compiler
 
.NET系開発者から見たJava
.NET系開発者から見たJava.NET系開発者から見たJava
.NET系開発者から見たJava
 
ぼくのかんがえたさいきょうのLL
ぼくのかんがえたさいきょうのLLぼくのかんがえたさいきょうのLL
ぼくのかんがえたさいきょうのLL
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
関数型言語のすすめ
関数型言語のすすめ関数型言語のすすめ
関数型言語のすすめ
 
C#(VB)プログラマのためのF#入門
C#(VB)プログラマのためのF#入門C#(VB)プログラマのためのF#入門
C#(VB)プログラマのためのF#入門
 
Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指して
 
自分戦略
自分戦略自分戦略
自分戦略
 
Ruby everywhere
Ruby everywhereRuby everywhere
Ruby everywhere
 
SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~
 
輪るビングドラム.NET
輪るビングドラム.NET輪るビングドラム.NET
輪るビングドラム.NET
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented Programming
 
仕事で使うF#
仕事で使うF#仕事で使うF#
仕事で使うF#
 

Similar a yieldとreturnの話

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 
言語処理系入門€6
言語処理系入門€6言語処理系入門€6
言語処理系入門€6Kenta Hattori
 
言語処理系入門€9
言語処理系入門€9言語処理系入門€9
言語処理系入門€9Kenta Hattori
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4Kenta Hattori
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5Kenta Hattori
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットTaisuke Oe
 
モナドをつくろう
モナドをつくろうモナドをつくろう
モナドをつくろうdico_leque
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
言語処理系入門3
言語処理系入門3言語処理系入門3
言語処理系入門3Kenta Hattori
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜ericsagnes
 
私を SKI に連れてって
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてってSusisu
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„和弘 井之上
 
言語処理系入門€8
言語処理系入門€8言語処理系入門€8
言語処理系入門€8Kenta Hattori
 
F#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングF#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングsatoshimurakumo
 

Similar a yieldとreturnの話 (20)

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
言語処理系入門€6
言語処理系入門€6言語処理系入門€6
言語処理系入門€6
 
言語処理系入門€9
言語処理系入門€9言語処理系入門€9
言語処理系入門€9
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
モナドをつくろう
モナドをつくろうモナドをつくろう
モナドをつくろう
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
言語処理系入門3
言語処理系入門3言語処理系入門3
言語処理系入門3
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
 
私を SKI に連れてって
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてって
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
 
言語処理系入門€8
言語処理系入門€8言語処理系入門€8
言語処理系入門€8
 
F#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングF#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミング
 

Más de bleis tift

PCさえあればいい。
PCさえあればいい。PCさえあればいい。
PCさえあればいい。bleis tift
 
No more Legacy documents
No more Legacy documentsNo more Legacy documents
No more Legacy documentsbleis tift
 
効果の低いテストの話
効果の低いテストの話効果の低いテストの話
効果の低いテストの話bleis tift
 
テストの自動化を考える前に
テストの自動化を考える前にテストの自動化を考える前に
テストの自動化を考える前にbleis tift
 
札束でExcelを殴る
札束でExcelを殴る札束でExcelを殴る
札束でExcelを殴るbleis tift
 
yield and return (poor English ver)
yield and return (poor English ver)yield and return (poor English ver)
yield and return (poor English ver)bleis tift
 
現実(えくせる)と戦う話
現実(えくせる)と戦う話現実(えくせる)と戦う話
現実(えくせる)と戦う話bleis tift
 
ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)
ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)
ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)bleis tift
 
async/await不要論
async/await不要論async/await不要論
async/await不要論bleis tift
 
VBAを書きたくない話(Excel-DNAの紹介)
VBAを書きたくない話(Excel-DNAの紹介)VBAを書きたくない話(Excel-DNAの紹介)
VBAを書きたくない話(Excel-DNAの紹介)bleis tift
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScriptbleis tift
 
F#で始めるスマートフォンアプリ
F#で始めるスマートフォンアプリF#で始めるスマートフォンアプリ
F#で始めるスマートフォンアプリbleis tift
 
SCMBC闇LT資料
SCMBC闇LT資料SCMBC闇LT資料
SCMBC闇LT資料bleis tift
 
SCMBC Git入門セッション発表資料
SCMBC Git入門セッション発表資料SCMBC Git入門セッション発表資料
SCMBC Git入門セッション発表資料bleis tift
 
CIのその先へ
CIのその先へCIのその先へ
CIのその先へbleis tift
 

Más de bleis tift (17)

PCさえあればいい。
PCさえあればいい。PCさえあればいい。
PCさえあればいい。
 
No more Legacy documents
No more Legacy documentsNo more Legacy documents
No more Legacy documents
 
効果の低いテストの話
効果の低いテストの話効果の低いテストの話
効果の低いテストの話
 
テストの自動化を考える前に
テストの自動化を考える前にテストの自動化を考える前に
テストの自動化を考える前に
 
札束でExcelを殴る
札束でExcelを殴る札束でExcelを殴る
札束でExcelを殴る
 
yield and return (poor English ver)
yield and return (poor English ver)yield and return (poor English ver)
yield and return (poor English ver)
 
現実(えくせる)と戦う話
現実(えくせる)と戦う話現実(えくせる)と戦う話
現実(えくせる)と戦う話
 
ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)
ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)
ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 
VBAを書きたくない話(Excel-DNAの紹介)
VBAを書きたくない話(Excel-DNAの紹介)VBAを書きたくない話(Excel-DNAの紹介)
VBAを書きたくない話(Excel-DNAの紹介)
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScript
 
F#で始めるスマートフォンアプリ
F#で始めるスマートフォンアプリF#で始めるスマートフォンアプリ
F#で始めるスマートフォンアプリ
 
SCMBC闇LT資料
SCMBC闇LT資料SCMBC闇LT資料
SCMBC闇LT資料
 
SCMBC Git入門セッション発表資料
SCMBC Git入門セッション発表資料SCMBC Git入門セッション発表資料
SCMBC Git入門セッション発表資料
 
SCM Boot Camp
SCM Boot CampSCM Boot Camp
SCM Boot Camp
 
Vim再入門
Vim再入門Vim再入門
Vim再入門
 
CIのその先へ
CIのその先へCIのその先へ
CIのその先へ
 

Último

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 

Último (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 

yieldとreturnの話