Suche senden
Hochladen
Livesense tech night immutable-js at a glance
•
5 gefällt mir
•
1,805 views
Yuta Shimakawa
Folgen
immutable-jsのListの実装について
Weniger lesen
Mehr lesen
Ingenieurwesen
Melden
Teilen
Melden
Teilen
1 von 47
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
Collectionを使いこなす
Collectionを使いこなす
Recruit Lifestyle Co., Ltd.
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
blackenedgold
Haskell で CLI
Haskell で CLI
Nobutada Matsubara
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato
関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
New Generation Build System "Fly"
New Generation Build System "Fly"
deepblue will
Sml#探検隊
Sml#探検隊
Hiroki Mizuno
Empfohlen
Collectionを使いこなす
Collectionを使いこなす
Recruit Lifestyle Co., Ltd.
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
blackenedgold
Haskell で CLI
Haskell で CLI
Nobutada Matsubara
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato
関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
New Generation Build System "Fly"
New Generation Build System "Fly"
deepblue will
Sml#探検隊
Sml#探検隊
Hiroki Mizuno
ゼロから始めるScala文法 (再)
ゼロから始めるScala文法 (再)
Suguru Hamazaki
篠崎Lt20141215
篠崎Lt20141215
Toshiki Shinozaki
リストモナドを作ってみた
リストモナドを作ってみた
Atsushi Kanehara
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
Nagi Teramo
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装
__nakamichi__
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Tsuyoshi Yamamoto
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Kazunari Hara
fanscala1 2 scalaの基本
fanscala1 2 scalaの基本
Toshiki Shinozaki
型についてあれこれ
型についてあれこれ
Yuta Shimakawa
Trait in scala
Trait in scala
Yuta Shimakawa
Web workers¶llel.js html5勉強会lt大会
Web workers¶llel.js html5勉強会lt大会
Yuta Shimakawa
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
Yuta Shimakawa
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
Yuta Shimakawa
タスクボード始めました(仮)++ アジャイルサムライ他流試合
タスクボード始めました(仮)++ アジャイルサムライ他流試合
Yuta Shimakawa
Technology update
Technology update
jumus jumbuck
Review of work in progress November 2012
Review of work in progress November 2012
Peter Missen
2011.02.05 run’oプレゼン
2011.02.05 run’oプレゼン
大祐 伊東
Akaka
Akaka
Ali Mudin
20110808azumaism
20110808azumaism
Kohsuke Shinkuma
「合併反対」所収 球団合併の要因に関する一考察
「合併反対」所収 球団合併の要因に関する一考察
Kohsuke Shinkuma
Review of work in progress October 2012 Part 1
Review of work in progress October 2012 Part 1
Peter Missen
Wordpress Security
Wordpress Security
Peter Bui
Weitere ähnliche Inhalte
Was ist angesagt?
ゼロから始めるScala文法 (再)
ゼロから始めるScala文法 (再)
Suguru Hamazaki
篠崎Lt20141215
篠崎Lt20141215
Toshiki Shinozaki
リストモナドを作ってみた
リストモナドを作ってみた
Atsushi Kanehara
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
Nagi Teramo
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装
__nakamichi__
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Tsuyoshi Yamamoto
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Kazunari Hara
fanscala1 2 scalaの基本
fanscala1 2 scalaの基本
Toshiki Shinozaki
Was ist angesagt?
(8)
ゼロから始めるScala文法 (再)
ゼロから始めるScala文法 (再)
篠崎Lt20141215
篠崎Lt20141215
リストモナドを作ってみた
リストモナドを作ってみた
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
fanscala1 2 scalaの基本
fanscala1 2 scalaの基本
Andere mochten auch
型についてあれこれ
型についてあれこれ
Yuta Shimakawa
Trait in scala
Trait in scala
Yuta Shimakawa
Web workers¶llel.js html5勉強会lt大会
Web workers¶llel.js html5勉強会lt大会
Yuta Shimakawa
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
Yuta Shimakawa
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
Yuta Shimakawa
タスクボード始めました(仮)++ アジャイルサムライ他流試合
タスクボード始めました(仮)++ アジャイルサムライ他流試合
Yuta Shimakawa
Technology update
Technology update
jumus jumbuck
Review of work in progress November 2012
Review of work in progress November 2012
Peter Missen
2011.02.05 run’oプレゼン
2011.02.05 run’oプレゼン
大祐 伊東
Akaka
Akaka
Ali Mudin
20110808azumaism
20110808azumaism
Kohsuke Shinkuma
「合併反対」所収 球団合併の要因に関する一考察
「合併反対」所収 球団合併の要因に関する一考察
Kohsuke Shinkuma
Review of work in progress October 2012 Part 1
Review of work in progress October 2012 Part 1
Peter Missen
Wordpress Security
Wordpress Security
Peter Bui
The Solar System
The Solar System
Hk Sarawgi
Technology update
Technology update
jumus jumbuck
Heal from within
Heal from within
vickimartino
Andere mochten auch
(17)
型についてあれこれ
型についてあれこれ
Trait in scala
Trait in scala
Web workers¶llel.js html5勉強会lt大会
Web workers¶llel.js html5勉強会lt大会
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
タスクボード始めました(仮)++ アジャイルサムライ他流試合
タスクボード始めました(仮)++ アジャイルサムライ他流試合
Technology update
Technology update
Review of work in progress November 2012
Review of work in progress November 2012
2011.02.05 run’oプレゼン
2011.02.05 run’oプレゼン
Akaka
Akaka
20110808azumaism
20110808azumaism
「合併反対」所収 球団合併の要因に関する一考察
「合併反対」所収 球団合併の要因に関する一考察
Review of work in progress October 2012 Part 1
Review of work in progress October 2012 Part 1
Wordpress Security
Wordpress Security
The Solar System
The Solar System
Technology update
Technology update
Heal from within
Heal from within
Ähnlich wie Livesense tech night immutable-js at a glance
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
Go と Couchbase で microservices を作るには?
Go と Couchbase で microservices を作るには?
Yusuke Komatsu
What is Metasepi?
What is Metasepi?
Kiwamu Okabe
HashTable と HashDos
HashTable と HashDos
Yuya Takeyama
scala.collection 再入門 (改)
scala.collection 再入門 (改)
Ryuichi ITO
Testman
Testman
makoto tsuyuki
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Koji Ishimoto
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリング
TanUkkii
今さら始めるCoffeeScript
今さら始めるCoffeeScript
Ashitaba YOSHIOKA
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
Swiftおさらい
Swiftおさらい
Hidenori Takeshita
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
Toshio Ehara
test
test
a1yama1123
2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会
Takatoshi Murakami
Map
Map
kikairoya
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
Jun Nogata
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
schoowebcampus
Ruby 同好会宣言
Ruby 同好会宣言
Yuya Takeyama
Project lambda
Project lambda
Appresso Engineering Team
Ähnlich wie Livesense tech night immutable-js at a glance
(20)
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Go と Couchbase で microservices を作るには?
Go と Couchbase で microservices を作るには?
What is Metasepi?
What is Metasepi?
HashTable と HashDos
HashTable と HashDos
scala.collection 再入門 (改)
scala.collection 再入門 (改)
Testman
Testman
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリング
今さら始めるCoffeeScript
今さら始めるCoffeeScript
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
Swiftおさらい
Swiftおさらい
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
test
test
2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会
Map
Map
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
Ruby 同好会宣言
Ruby 同好会宣言
Project lambda
Project lambda
Livesense tech night immutable-js at a glance
1.
Immutable @ JavaScript
2.
var me =
{ name: "Yuta Shimakawa", tw: "@banana_umai", qiita: "bananaumai", github: "bananaumai" };
3.
4.
ではございません
5.
6.
at a glance...
7.
8.
不変データ Seq List Map OrderedMap Set OrderedSet Record
9.
var list1 =
Immutable.List.of(1, 2); var list2 = list1.push(3, 4, 5); var list3 = list2.unshift(0); var list4 = list1.concat(list2, list3); assert(list1.size === 2); assert(list2.size === 5); assert(list3.size === 6); assert(list4.size === 13); assert(list4.get(0) === 1); https://github.com/facebook/immutable-js/
10.
JSオブジェクトとの 相互変換
11.
var map1 =
Immutable.Map({a:1, b:2, c:3, d:4}); var map2 = Immutable.Map({c:10, a:20, t:30}); var obj = {d:100, o:200, g:300}; var map3 = map1.merge(map2, obj); // Map { a: 20, b: 2, c: 10, d: 100, t: 30, o: 200, g: 300 } https://github.com/facebook/immutable-js/ var deep = Immutable.Map( { a: 1, b: 2, c: Immutable.List.of(3, 4, 5) }); deep.toObject() // { a: 1, b: 2, c: List [ 3, 4, 5 ] } deep.toArray() // [ 1, 2, List [ 3, 4, 5 ] ] deep.toJS() // { a: 1, b: 2, c: [ 3, 4, 5 ] } JSON.stringify(deep) // '{"a":1,"b":2,"c":[3,4,5]}'
12.
入れ子データ
13.
var nested =
Immutable.fromJS({a:{b:{c:[3,4,5]}}}); // Map { a: Map { b: Map { c: List [ 3, 4, 5 ] } } } var nested2 = nested.mergeDeep({a:{b:{d:6}}}); // Map { a: Map { b: Map { c: List [ 3, 4, 5 ], d: 6 } } } var nested3 = nested2.updateIn(['a', 'b', 'd'], value => value + 1); // Map { a: Map { b: Map { c: List [ 3, 4, 5 ], d: 7 } } } var nested4 = nested3.updateIn(['a', 'b', 'c'], list => list.push(6)); // Map { a: Map { b: Map { c: List [ 3, 4, 5, 6 ], d: 7 } } } https://github.com/facebook/immutable-js/
14.
遅延評価(Seq)
15.
var oddSquares =
Immutable.Seq.of(1,2,3,4,5,6,7,8) .filter(x => x % 2) .map(x => x * x); // not computed here! oddSquares.get(1); // 9 https://github.com/facebook/immutable-js/
16.
同等性
17.
var map1 =
Immutable.Map({a:1, b:1, c:1}); var map2 = Immutable.Map({a:1, b:1, c:1}); assert(map1 !== map2); assert(Immutable.is(map1, map2) === true); https://github.com/facebook/immutable-js/
18.
JSで不変データ
19.
Immutableなリストを 素朴に実装してみた
20.
cloneによる実装
21.
var _ =
require('lodash'); function iPush(arr, val) { var arr2 = _.clone(arr); arr2.push(val); return arr2; } var arr = []; for (var i = 0; i < 100000; i++) { arr = iPush(arr, i); } https://gist.github.com/bananaumai/cc2f4d90662aa823ce9e
22.
…は cloneのコストが膨大
23.
Linked Listを実装
24.
var LinkedList =
{}; LinkedList.prototype = { head: function() { return this._head; }, tail: function() { return this._tail; }, push: function(val) { return new NonEmptyList(val, this); }, forEach: function(fnc) { fnc(this._head); if (this._tail instanceof NonEmptyList) { this._tail.forEach(fnc); } } }; var EmptyList = function() { this._head = null; this._tail = null; }; EmptyList.prototype = Object.create(LinkedList.prototype); EmptyList.prototype.constructor = EmptyList; https://gist.github.com/bananaumai/164b24b264e0f917007c var NonEmptyList = function(head, tail) { this._head = head; this._tail = tail; }; NonEmptyList.prototype = Object.create(LinkedList.prototype); NonEmptyList.prototype.constructor = NonEmptyList; LinkedList.of = function() { var _create = function(vals, list) { if (vals.length === 0) return list; var head = vals.shift(); return _create(vals, new NonEmptyList(head, list)) }; return _create( Array.prototype.slice.call(arguments).reverse(), new EmptyList() ); };
25.
var list =
LinkedList.of(); for (var i = 0; i < 100000; i++) { list = list.push(i); } https://gist.github.com/bananaumai/164b24b264e0f917007c
26.
…は (&pushはそれなりに速いけど・・・) 末尾再帰最適化 されないので難しい (&Object.ArrayのAPIの実現しようとすると・・・)
27.
immutable-jsのアプローチ
28.
Trie http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%82%A4%E6%9C%A8
29.
(def list [0
1 2 3 4 5])
30.
ClojureやScalaが採用 しているアプローチ
31.
32.
Immutable.Listの実装
33.
文字列のキーの代わりに 添字の数値をbitに変換、 パーティショニング
34.
var list =
Immutable.List.of(1,…,1000); list.get(887); http://hypirion.com/musings/understanding-persistent-vector-pt-2#f1n
35.
実際は5bitずつ分割するので ↓ O(Log32N)
36.
実際は32通り http://hypirion.com/musings/understanding-persistent-vector-pt-1
37.
var list1 =
Immutable.List.of(1,2,3,4,5,6,7,8); var list2 = list1.set(5, "beef"); list1 list2 http://hypirion.com/musings/understanding-persistent-vector-pt-1
38.
要素のpush var list1 =
Immutable.List.of(…); var list2 = list.push(…);
39.
最右のリーフノードに空きがある場合 http://hypirion.com/musings/understanding-persistent-vector-pt-1
40.
最右のリーフノードに空きがない場合 http://hypirion.com/musings/understanding-persistent-vector-pt-1
41.
rootから伸びるすべてのリーフが埋まっている場合 http://hypirion.com/musings/understanding-persistent-vector-pt-1
42.
要素のpop var list1 =
Immutable.List.of(…); var list2 = list.pop();
43.
最右のリーフノードが2つ以上の要素を持つ場合 http://hypirion.com/musings/understanding-persistent-vector-pt-1
44.
最右のリーフノードが1つの要素を持つ場合 http://hypirion.com/musings/understanding-persistent-vector-pt-1
45.
削除後rootノードが1つの要素だけをもつ場合 http://hypirion.com/musings/understanding-persistent-vector-pt-1
46.
簡単なまとめ
47.
Trieによるリストの表現 O(Log32N)のアクセス 最小限のコピー
Jetzt herunterladen