Van laarhoven lens

Naoki Aoyama
Naoki AoyamaSoftware Developer
Lens の基本と基礎2017/02/26 Scala Matsuri 2017 - day 2
お前誰だよ?
Naoki Aoyama
マーベリック株式会社
アドテク系Scala エンジニア
コミッター
Twitter: , GitHub:
Monocle
@AoiroAoino @aoiroaoino
Lens ってご存知ですか?
Scala でLens を使うモチベーション
ネストした構造に対するcopy メソッドのネスト地獄
様々なデータを共通のインターフェースで操作できる
非侵入的に外側から追加できる
特定のアーキテクチャに依存しない概念
汎用的に使える
などなど
Van laarhoven lens
Lens って何?
getter/setter を抽象的にしたもの
purely functional reference
実は
余状態コモナド余代数
(Costate Comonad Coalgebra)
getter/setter ってなんだっけ?
(広く一般的な意味で)オブジェクト指向言語におい
て、あるfield の値を取得するメソッドがgetter で、field
に値をセットするのがsetter。(広く一般的な意味で)
クラスのメソッドとして定義され、getFoo、setFoo と名
付けられる事が多い、おなじみの例のアレ。
getter/setter 再考
特定のclass に依存しない、汎用的な関数と捉えてみる
getter の仕事とは
オブジェクトからある値を取り出す
素直にシグネチャとして表してみると…
オブジェクトS からある値A を取り出す
S => A
// getter
def get[S, A]: S => A
setter の仕事とは
オブジェクトの一部をある値に変更する
素直にシグネチャとして表してみると…
オブジェクトS の一部をある値A に変更する
S => A => S
// setter
def set[S, A]: S => A => S
あるオブジェクトS の各field に対して前述のような
getter/setter が存在した時、それらを使って汎用的な
get/set メソッドの提供を考える。
↓↓↓
その仕組みを実現するものをLens と呼ぶ。
get/set Lens
class Lens[S, A](
getter: S => A,
setter: S => A => S
) {
def get(s: S): A = getter(s)
def set(s: S, a: A): S = setter(s)(a)
def modify(s: S, f: A => A): S = set(s, f(get(s)))
}
get/set Lens
getter/setter をコンストラクタの引数として与える。
class Lens[S, A](
getter: S => A,
setter: S => A => S
) {
Lens の値を定義する
case class User(id: Int, name: String)
// User#id 対 Lens
val _id = new Lens[User, Int](
_.id, // getter
user => newId => user.copy(id = newId) // setter
)
// User#name 対 Lens
val _name = new Lens[User, String](
_.name, // getter
user => newName => user.copy(name = newName) // setter
)
使い方
val user1 = User(100, "John Doe")
_id.get(user1)
// res: Int = 100
_name.get(user1)
// res: String = John Doe
_name.set(user1, "Naoki Aoyama")
// res: User = User(100,Naoki Aoyama)
_name.modify(user1, _.toUpperCase)
// res: User = User(100,JOHN DOE)
Lens Laws
Lens には満たすべき法則がある。
get/set
set(s, get(s)) == s
set/get
get(set(s, a)) == a
set/set
set(set(s, a1), a2) == set(s, a2)
ネストしたデータが対象の時は?
ネストした構造に対するcopy メソッドのネスト地獄を
どう解決するか。
Lens の合成を考える
class Lens[S, A](getter: S => A, setter: S => A => S) {
def get(s: S): A = getter(s)
def set(s: S, a: A): S = setter(s)(a)
def modify(s: S, f: A => A): S = set(s, f(get(s)))
def compose[B](other: Lens[A, B]): Lens[S, B] = new Lens(
s => other.get(this.get(s)), // getter
s => b => this.set(s, other.set(this.get(s), b)) //setter
)
}
Lens の合成を考える
def compose[B](other: Lens[A, B]): Lens[S, B] = new Lens(
s => other.get(this.get(s)), // getter
s => b => this.set(s, other.set(this.get(s), b)) //setter
)
試してみよう
case class Message(user: User, body: String)
// Message#id 対 Lens
val _body = ...
// Message#user 対 Lens
val _user: Lens[Message, User] = new Lens(
_.user,
message => newUser => message.copy(user = newUser)
)
Before
val message = Message(User(100, "John Doe"), "Hello")
message.user // res: User = User(100,John Doe)
message.user.name // res: String = John Doe
message.copy(
user = user.copy(
name = "aoino"
)
) // res: Message = Message(User(100,aoino), Hello)
message.copy(
user = user.copy(
name = message.user.name.toUpperCase
)
) // res: Message = Message(User(100,JOHN DOE),Hello)
A er
val message = Message(User(100, "John Doe"), "Hello")
_user.get(message)
// res: User = User(100,John Doe)
(_user compose _name).get(message)
// res: String = John Doe
(_user compose _name).set(message, "aoino")
// res: Message = Message(User(100,aoino),Hello)
(_user compose _name).modify(message, _.toUpperCase)
// res: Message = Message(User(100,JOHN DOE),Hello)
ここまでのまとめ
Lens の基本的な概念を完全に理解した
Lens の種類
Lens にはコンセプトや実装に応じていくつか種類がある
get/set lens
get/modify lens
Iso lens
Store Comonad Lens
van Laarhoven lens
and so on ...
van Laarhoven Lens
van Laarhoven Lens とは?
2009 年7 月にTwan van Laarhoven さんが書いた の
アイディアが元になったLens で、Haskell の やScala
の のコンセプトの基礎になってる。
blog
lens
Monocle
型のイメージは以下の通り。
type Lens[F[_]: Functor, S, A] = S => (A => F[A]) => F[S]
実際に定義すると
abstract class Lens[F[_]: Functor, S, A] {
def run(s: S)(f: A => F[A]): F[S]
}
type Lens s a = forall f. Functor f => (a -> f a) -> s -> f s
さて、閑話休題
traverse 関数はご存知ですか?
def traverse[G[_]: Applicative, A, B](fa: F[A])(f: A => G[B]): G[F[B]]
例えば、F をList、G をOption とすると、traverse 関数は
リスト内の値にf を適用し、全てSome だった場合には
f の適用結果をSome に包んで返し
一つでもNone の場合はNone を返します。
def isEven(v: Int): Option[Int] = if (v % 2 == 0) Some(v) else None
List(2, 4, 5).traverse(isEven)
// res: Option[List[Int]] = None
List(2, 4, 6).traverse(isEven)
// res: Option[List[Int]] = Some(List(2, 4, 6))
※ 上記コードはScalaz を使用しています。
閑話休題おわり
さて、まずはvan Laarhoven lens を理解する為に
getter/setter を再考してみましょう。
setter の再考
setter の再考
冒頭に出てきたsetter の型は以下の通り。
def setter: S => A => S
これはmodify メソッドの特殊形と考えられる。
なので、modify のsignature を取り入れて
def setter: S => (A => A) => S
と、改めて定義する。
この型に見覚えない?
trait Functor[F[_]] {
// F[A] => (A => B) => F[B]
def map[A, B](fa: F[A])(f: A => B): F[B]
}
つまり、我々はset/modify をするのに各field に対する
Functor#map が欲しいのだ。
しかし、Functor のinstance をclass のfield 毎にそれぞれ
定義することは現実的ではない...
Functor#map はTraverse#traverse で定義できる
trait Traverse[F[_]] extends Functor[F] {
// F[A] => (A => G[B]) => G[F[B]]
def traverse[G[_]: Applicative, A, B](fa: F[A])(f: A => G[B]): G[F[B
type Id[A] = A
// Id Applicative instance 自明
implicit def idApplicative[A] = new Applicative[Id] { ... }
// F[A] => (A => Id[B]) => Id[F[B]]
def map[A, B](fa: F[A])(f: A => B): F[B] =
traverse[Id, A, B](fa)(f)
}
つまり、このtraverse の部分を同等な関数に置き換える
ことで、Functor#map のような関数を得られる。この
F[A], F[B] をS と置いてSetter という名前をつけよう。
type Setter[S, A] = Lens[Id, S, A]
このSetter[S, A] を用いてset/modify メソッドが作れる。
// Setter[S, A] => S => (A => A) => S
def modify[S, A](setter: Setter[S, A])(s: S)(f: A => A): S =
setter.run(s)(f)
// Setter[S, A] => S => A => S
def set[S, A](setter: Setter[S, A])(s: S)(a: A): S =
setter.run(s)(_ => a)
getter の再考
getter の再考
冒頭に出てきたgetter の型は以下の通り。
def getter: S => A
取得するだけでなく、関数を適用した結果を返すように
def getter: S => (A => A) => A
と、改めて定義する。
この型に見覚えない?
trait Foldable[F[_]] {
// F[A] => (A => B) => B
def foldMap[A, B](fa: F[A])(f: A => B)(implicit mb: Monoid[B]): B
}
つまり、我々はget をするのに各field に対する
Foldable#foldMap が欲しいのだ。
しかし、Foldable のinstance をclass のfield 毎にそれぞ
れ定義することは現実的ではない...
Foldable#foldMap はTraverse#traverse で定義できる
trait Traverse[F[_]] extends Functor[F] {
// F[A] => (A => G[B]) => G[F[B]]
def traverse[G[_]: Applicative, A, B](fa: F[A])(f: A => G[B]): G[F[B
// Const Applicative instance 自明
case class Const[A, B](runConst: A)
implicit def monoidApplicative[A](A: Monoid[A]) =
new Applicative[({type λ[X] = Const[A, X]})#λ] { ... }
// F[A] => (A => B) => B
def foldMap[A, B](fa: F[A])(f: A => B)(implicit mb: Monoid[B]): B =
traverse[({type λ[X] = Const[B, X]})#λ, A, Nothing](fa)(f)
}
Setter と同様にtraverse の部分を同等な関数に置き換え
ることで、Foldable#foldMap のような関数を得られる。
このF[A] をS と置いてGetter という名前をつけよう。
type Getter[S, A] = Lens[({type F[X] = Const[A, X]})#F, S, A]
このGetter[S, A] を用いてget メソッドが作れる。
// Getter[S, A] => S => A
def get[S, A](getter: Getter[S, A])(s: S): A =
getter.run(s)(a => Const(a)).getConst
試しにUser#name に対するLens を定義してみる。
def _name[F[_]: Functor] = new Lens[F, User, String] {
def run(user: User)(f: String => F[String]): F[User] =
Functor[F].map(f(user.name))(n => user.copy(name = n))
}
本当に動くか試してみよう!!
さて、我々は似たようなsignature を持つGetter/Setter を
手に入れた。これらを並べて見てみよう。
type Setter[S, A] = S => (A => Id[A]) => Id[S]
type Getter[S, A] = S => (A => Const[A, A]) => Const[A, S]
Const とId の部分をFunctor のinstance を要求する型変
数に置き換えられそう。
これでvan Laarhoven lens の定義を理解できましたね?
type Lens[F[_]: Functor, S, A] = S => (A => F[A]) => F[S]
type Lens s a = forall f. Functor f => (a -> f a) -> s -> f s
しかし、ここで一つ疑問が湧きませんか?
Q: van Laarhoven lens はうまく合成できるのだろうか?
Getter もSetter も中身はtraverse と同等の関数ですね。
なので、代表してtraverse の合成を見てみましょう。
しかし、Scala でのtraverse の(関数合成の意味での)
compose は辛いので、Haskell で試します...
f にId/Const が入ります。構造のネストする順番と合成
の順序が一致し、左から右へと辿れますね。
traverse
:: (Applicative f, Traversable t) =>
(a -> f b) -> t a -> f (t b)
traverse . traverse
:: (Applicative f, Traversable t, Traversable t1) =>
(a -> f b) -> t (t1 a) -> f (t (t1 b))
traverse . traverse . traverse
:: (Applicative f, Traversable t, Traversable t1, Traversable t2) =>
(a -> f b) -> t (t1 (t2 a)) -> f (t (t1 (t2 b)))
おやおや?このHaskell の関数合成に使う(.) 演算子が、
Scala やJava などの(.) 演算子に見えませんか?
ちなみに、Haskell でvan Laarhoven Lens の合成はこう書
ける。
ghci> set (_2 . _1) 42 ("hello",("world","!!!"))
("hello",(42,"!!!"))
A: 合成もできる!
まとめ
Lens の基本を完全に理解した
Lens には種類がある
van Laarhoven lens をちょっと理解した
1 of 64

Recommended

Ekmett勉強会発表資料 by
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
16.7K views77 slides
今から始める Lens/Prism by
今から始める Lens/Prism今から始める Lens/Prism
今から始める Lens/PrismNaoki Aoyama
8.6K views85 slides
Ekmett勉強会発表資料 by
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
948 views68 slides
C++コミュニティーの中心でC++をDISる by
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
12.4K views66 slides
C++11概要 ライブラリ編 by
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
3K views46 slides
Pfi Seminar 2010 1 7 by
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Preferred Networks
3.4K views60 slides

More Related Content

What's hot

Emcjp item21 by
Emcjp item21Emcjp item21
Emcjp item21MITSUNARI Shigeo
2.3K views12 slides
Map by
MapMap
Mapkikairoya
10.2K views41 slides
モナドハンズオン前座 by
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
5.7K views60 slides
yieldとreturnの話 by
yieldとreturnの話yieldとreturnの話
yieldとreturnの話bleis tift
7.4K views72 slides
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜 by
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
5.2K views29 slides
C++ Template Meta Programming の紹介@社内勉強会 by
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
9.4K views59 slides

What's hot(20)

Map by kikairoya
MapMap
Map
kikairoya10.2K views
モナドハンズオン前座 by bleis tift
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
bleis tift5.7K views
yieldとreturnの話 by bleis tift
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
bleis tift7.4K views
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜 by 勝成 鈴江
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江5.2K views
C++ Template Meta Programming の紹介@社内勉強会 by Akihiko Matuura
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura9.4K views
これからの「言語」の話をしよう ―― 未来を生きるためのツール by Nobuhisa Koizumi
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi1.3K views
すごいH 第12章モノイド by Shinta Hatatani
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
Shinta Hatatani2.2K views
モナドがいっぱい! by Kenta Sato
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!
Kenta Sato3.5K views
クロージャデザインパターン by Moriharu Ohzu
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu19.6K views
Javaとかc#とか最近の言語使いのためのc++入門 by potimarimo
Javaとかc#とか最近の言語使いのためのc++入門Javaとかc#とか最近の言語使いのためのc++入門
Javaとかc#とか最近の言語使いのためのc++入門
potimarimo7.5K views
すごいHaskell楽しく学ぼう-第12章モノイド- by Hiromasa Ohashi
すごいHaskell楽しく学ぼう-第12章モノイド-すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-
Hiromasa Ohashi1.6K views
20141128 iOSチーム勉強会 My Sweet Swift by necocen
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
necocen2.2K views
関数プログラミング入門 by Hideyuki Tanaka
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka21.8K views
C++0x 言語の未来を語る by Akira Takahashi
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
Akira Takahashi1.7K views
C++0x in programming competition by yak1ex
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex1.8K views
C++でHello worldを書いてみた by firewood
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
firewood6.8K views
関数型プログラミング入門 with OCaml by Haruka Oikawa
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa12.4K views
C++ ポインタ ブートキャンプ by Kohsuke Yuasa
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa11K views

Viewers also liked

Preparing for distributed system failures using akka #ScalaMatsuri by
Preparing for distributed system failures using akka #ScalaMatsuriPreparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuriTIS Inc.
6.4K views68 slides
Reducing Boilerplate and Combining Effects: A Monad Transformer Example by
Reducing Boilerplate and Combining Effects: A Monad Transformer ExampleReducing Boilerplate and Combining Effects: A Monad Transformer Example
Reducing Boilerplate and Combining Effects: A Monad Transformer ExampleConnie Chen
2.5K views25 slides
Scala Matsuri 2017 by
Scala Matsuri 2017Scala Matsuri 2017
Scala Matsuri 2017Yoshitaka Fujii
2.1K views66 slides
Akka-chan's Survival Guide for the Streaming World by
Akka-chan's Survival Guide for the Streaming WorldAkka-chan's Survival Guide for the Streaming World
Akka-chan's Survival Guide for the Streaming WorldKonrad Malawski
5.4K views136 slides
Make your programs Free by
Make your programs FreeMake your programs Free
Make your programs FreePawel Szulc
3.9K views149 slides
Scala Warrior and type-safe front-end development with Scala.js by
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jstakezoe
9.3K views49 slides

Viewers also liked(20)

Preparing for distributed system failures using akka #ScalaMatsuri by TIS Inc.
Preparing for distributed system failures using akka #ScalaMatsuriPreparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuri
TIS Inc.6.4K views
Reducing Boilerplate and Combining Effects: A Monad Transformer Example by Connie Chen
Reducing Boilerplate and Combining Effects: A Monad Transformer ExampleReducing Boilerplate and Combining Effects: A Monad Transformer Example
Reducing Boilerplate and Combining Effects: A Monad Transformer Example
Connie Chen2.5K views
Akka-chan's Survival Guide for the Streaming World by Konrad Malawski
Akka-chan's Survival Guide for the Streaming WorldAkka-chan's Survival Guide for the Streaming World
Akka-chan's Survival Guide for the Streaming World
Konrad Malawski5.4K views
Make your programs Free by Pawel Szulc
Make your programs FreeMake your programs Free
Make your programs Free
Pawel Szulc3.9K views
Scala Warrior and type-safe front-end development with Scala.js by takezoe
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.js
takezoe9.3K views
Akka Cluster and Auto-scaling by Ikuo Matsumura
Akka Cluster and Auto-scalingAkka Cluster and Auto-scaling
Akka Cluster and Auto-scaling
Ikuo Matsumura2.9K views
Going bananas with recursion schemes for fixed point data types by Pawel Szulc
Going bananas with recursion schemes for fixed point data typesGoing bananas with recursion schemes for fixed point data types
Going bananas with recursion schemes for fixed point data types
Pawel Szulc2.2K views
Deadly Code! (seriously) Blocking & Hyper Context Switching Pattern by chibochibo
Deadly Code! (seriously) Blocking & Hyper Context Switching PatternDeadly Code! (seriously) Blocking & Hyper Context Switching Pattern
Deadly Code! (seriously) Blocking & Hyper Context Switching Pattern
chibochibo1.6K views
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver) by Eugene Yokota
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
Eugene Yokota1.4K views
ConoHa blockchain スマート宅配ボックス by tmatsuura
ConoHa  blockchain  スマート宅配ボックス ConoHa  blockchain  スマート宅配ボックス
ConoHa blockchain スマート宅配ボックス
tmatsuura2.3K views
Big Data Analytics Tokyo by Adam Gibson
Big Data Analytics TokyoBig Data Analytics Tokyo
Big Data Analytics Tokyo
Adam Gibson1K views
Reactive integrations with Akka Streams by Konrad Malawski
Reactive integrations with Akka StreamsReactive integrations with Akka Streams
Reactive integrations with Akka Streams
Konrad Malawski1.9K views
7 key recipes for data engineering by univalence
7 key recipes for data engineering7 key recipes for data engineering
7 key recipes for data engineering
univalence 3.2K views
そのマネジメントの課題、TAにも解決できますよ。 by Manabu Murakami
そのマネジメントの課題、TAにも解決できますよ。そのマネジメントの課題、TAにも解決できますよ。
そのマネジメントの課題、TAにも解決できますよ。
Manabu Murakami2.8K views
Sbtのマルチプロジェクトはいいぞ by Yoshitaka Fujii
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
Sbtのマルチプロジェクトはいいぞ
Yoshitaka Fujii1.4K views
How Scala code is expressed in the JVM by Koichi Sakata
How Scala code is expressed in the JVMHow Scala code is expressed in the JVM
How Scala code is expressed in the JVM
Koichi Sakata8.3K views

Similar to Van laarhoven lens

MP in Scala by
MP in ScalaMP in Scala
MP in ScalaKent Ohashi
890 views30 slides
Essential Scala 第5章 シーケンス処理 by
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Takuya Tsuchida
356 views114 slides
eZ Publish勉強会9月〜テンプレート言語〜 by
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜ericsagnes
2K views61 slides
AuxパターンをDottyで解決する by
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決するTaisuke Oe
2.4K views18 slides
Go言語のスライスを理解しよう by
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しようYasutaka Kawamoto
31.3K views60 slides
From Java To Clojure by
From Java To ClojureFrom Java To Clojure
From Java To ClojureKent Ohashi
2.2K views38 slides

Similar to Van laarhoven lens(20)

Essential Scala 第5章 シーケンス処理 by Takuya Tsuchida
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理
Takuya Tsuchida356 views
eZ Publish勉強会9月〜テンプレート言語〜 by ericsagnes
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes2K views
AuxパターンをDottyで解決する by Taisuke Oe
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決する
Taisuke Oe2.4K views
Go言語のスライスを理解しよう by Yasutaka Kawamoto
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
Yasutaka Kawamoto31.3K views
From Java To Clojure by Kent Ohashi
From Java To ClojureFrom Java To Clojure
From Java To Clojure
Kent Ohashi2.2K views
Boost.B-tree introduction by Takayuki Goto
Boost.B-tree introductionBoost.B-tree introduction
Boost.B-tree introduction
Takayuki Goto2.3K views
What Dotty fixes @ Scala関西サミット by Taisuke Oe
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
Taisuke Oe4.9K views
F#によるFunctional Programming入門 by bleis tift
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
bleis tift3.6K views
とあるプロジェクトのつらみなコード by Yuya Taki
とあるプロジェクトのつらみなコードとあるプロジェクトのつらみなコード
とあるプロジェクトのつらみなコード
Yuya Taki531 views
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„ by 和弘 井之上
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
和弘 井之上176 views
JavaScript経験者のためのGo言語入門 by Shohei Arai
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
Shohei Arai908 views
Ⅰ. Rの基礎 2017 by wada, kazumi
Ⅰ. Rの基礎 2017Ⅰ. Rの基礎 2017
Ⅰ. Rの基礎 2017
wada, kazumi389 views
  by a-hisame
  
 
a-hisame1.4K views
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】 by Tomoharu ASAMI
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
Tomoharu ASAMI311 views
怠惰なRubyistへの道 fukuoka rubykaigi01 by nagachika t
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
nagachika t865 views

Recently uploaded

onewedge_companyguide1 by
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1ONEWEDGE1
81 views22 slides
概要.pdf by
概要.pdf概要.pdf
概要.pdfTaira Shimizu
6 views1 slide
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私修治 松浦
211 views36 slides
ウォーターフォール開発で生 産性を測る指標 by
ウォーターフォール開発で生 産性を測る指標ウォーターフォール開発で生 産性を測る指標
ウォーターフォール開発で生 産性を測る指標Kouhei Aoyagi
58 views13 slides
Najah Matsuo Self Introduction by
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self IntroductionNajahMatsuo
16 views29 slides
システム概要.pdf by
システム概要.pdfシステム概要.pdf
システム概要.pdfTaira Shimizu
44 views1 slide

Recently uploaded(6)

onewedge_companyguide1 by ONEWEDGE1
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1
ONEWEDGE181 views
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by 修治 松浦
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
修治 松浦211 views
ウォーターフォール開発で生 産性を測る指標 by Kouhei Aoyagi
ウォーターフォール開発で生 産性を測る指標ウォーターフォール開発で生 産性を測る指標
ウォーターフォール開発で生 産性を測る指標
Kouhei Aoyagi58 views
Najah Matsuo Self Introduction by NajahMatsuo
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self Introduction
NajahMatsuo16 views

Van laarhoven lens