Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ramdaで手軽に関数型言語を始めよう
Search
kaidouji85
May 03, 2016
Technology
0
310
Ramdaで手軽に関数型言語を始めよう
初夏のJavaScript祭2016のLTスライドです。
kaidouji85
May 03, 2016
Tweet
Share
More Decks by kaidouji85
See All by kaidouji85
一発芸!!なんちゃってローカライズ
kaidouji85
0
28
AWSだけでネット対戦できるブラウザゲームを作った話
kaidouji85
0
39
GitHub CopilotでJavaScript開発効率を爆上げする
kaidouji85
0
76
Serverless + Fargate構成で継続的デリバリーの速度を劇的に改善した話
kaidouji85
0
810
サーバーレスアーキテクチャこそ"ヘキサゴナルアーキテクチャ"
kaidouji85
0
71
サーバーレスでターンベース制のネット対戦ゲームを作った話
kaidouji85
0
550
CDKで構築したFargateのデプロイ時間を改善した話
kaidouji85
2
470
ブラウザゲームで視聴者参加型のゲーム配信
kaidouji85
0
280
JSだけでバックエンド環境構築、IaC、自動デプロイまでやってみた話
kaidouji85
0
330
Other Decks in Technology
See All in Technology
エンジニアのキャリアパスと、 その中で自分が大切にしていること
noteinc
3
200
Охота на косуль у древних
ashapiro
0
130
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.8k
貧民的プログラミングのすすめ
kakehashi
PRO
1
120
スクラムというコンフォートゾーンから抜け出そう!プロジェクト全体に目を向けるインセプションデッキ / Inception Deck for seeing the whole project
takaking22
3
170
DeepSeekとは?何がいいの? - Databricksと学ぶDeepSeek! 〜これからのLLMに備えよ!〜
taka_aki
1
180
アジャイルな開発チームでテスト戦略の話は誰がする? / Who Talks About Test Strategy?
ak1210
1
840
2025/3/1 公共交通オープンデータデイ2025
morohoshi
0
110
エンジニア主導の企画立案を可能にする組織とは?
recruitengineers
PRO
1
310
20250304_赤煉瓦倉庫_DeepSeek_Deep_Dive
hiouchiy
2
130
Snowflake ML モデルを dbt データパイプラインに組み込む
estie
0
120
入門 PEAK Threat Hunting @SECCON
odorusatoshi
0
180
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Git: the NoSQL Database
bkeepers
PRO
428
65k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Why Our Code Smells
bkeepers
PRO
336
57k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
A Modern Web Designer's Workflow
chriscoyier
693
190k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
440
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Designing for humans not robots
tammielis
250
25k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
The Invisible Side of Design
smashingmag
299
50k
Transcript
RamdaͰखܰʹ ؔܕݴޠΛ࢝ΊΑ͏ ɹ༎հ 2016/05/14 ॳՆͷJavaScriptࡇ
ࣗݾհ ༎հ ϓϩάϥϚʔ ؔܕݴޠΛษڧத ࠓظͷՇϠϞτ͞Μ ͍;Γͩͱ؋ਪ͠ twitter @pegass85 facebook yuusuke.takeuchi.96
ૣͰ͕͢Έͳ͞Μ javascriptͷϧʔϓॲཧʹ ࠔ͍ͬͯ·ͤΜ͔
ͦͷɺؔܕݴޠͷߟ͑ํΛ ͍ͬͯΕղܾͰ͖Δ͔
ࠓͷΞδΣϯμ खଓ͖ܕ -> ؔܕ ؔܕݴޠͷجຊతͳߟ͑ํ ࣮ྫ υΩϡϝϯτྨͳͲ
ࠓͷΞδΣϯμ खଓ͖ܕ -> ؔܕ ؔܕݴޠͷجຊతͳߟ͑ํ ࣮ྫ υΩϡϝϯτྨͳͲ
͜ͷॲཧΛͲ͏ॻ͖·͔͢ʁ TODOϦετ͕͋ͬͨͱ͠·͢ ϦετͰมߋ͕͋ͬͨͷ͚ͩΛऔΓग़͢ ˢͷσʔλΛAPIʹ͛ΔͨΊʹมߋ͢Δ
forΛͬͨΓํ let postData = []; for (let i in todo)
{ if(todo[i].isChanged) { postData.push(convertData(todo[i])); } }
Ͳ͕͜ͳͷ͔ʁ ωετ͕ਂͯ͘ෳࡶ ॲཧΛશ෦ݟͳ͍ͱpostData͕Ͳ͏ͳ͔ ͔Βͳ͍ ͜Ε͕30ߦ͘Β͍ʹͳͬͯɺωετ͕3ஈʹͳ Δͱखʹෛ͑ͳ͍ɾɾɾɾɾɾ
ͦ͜ͰRamdaͷग़൪ʂʂ
RamdaΛͬͯಉ͡ॲཧΛॻ͘ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ωετ͕ਂ͘ͳͯ͘γϯϓϧʹ ͔͠ɺมͷೖ͔ͯ͠Β มΘͬͯͳ͍
ࠓͷΞδΣϯμ खଓ͖ܕ -> ؔܕ ؔܕݴޠͷجຊతͳ໋ྩ ࣮ྫ υΩϡϝϯτྨͳͲ
ؔܕݴޠͷେݪଇ ྻͷશཁૉʹ ಉ͡ॲཧΛ͢Δ
جຊͦͷ̍ શཁૉΛม͢Δ MAP
جຊͦͷ2 ݅ʹ߹͏ཁૉ͚ͩ͢ FILTER
͖ͬ͞ͷ՝ΛؔܕͰߟ͑Δͱ FILTER มߋͨ͠Ϩίʔυ͚ͩ͢ MAP ͬͨͷΛ API༻ʹσʔλม ɾɾɾͱͳΔ
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); filter มߋͨ͠ίʔυ͚ͩ͢
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ݅͢ɺؔͱͯ͠ఆٛ͢Δ
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ͜͏͍͏ͷΛؔܕݴޠͰϥϜμࣜͱ͍͏
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ؔͷϑΥʔϚοτҎԼͷ௨Γ ୈҰҾɿɹྻཁૉͷ Γɹɿɹboolean(trueͰ͢)
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ͜ͷྫͰisChanged͕trueͳΒ มߋ͞Εͨͱݟͳ͍ͯ͠Δ ɹˣ มߋ͞Εͨཁૉ͚ͩΛ͢ͱ͍͏ҙຯʹͳΔ
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ͜͜ʹFILTERରͷྻΛࢦఆ͢Δ
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); MAP API༻ʹσʔλม
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ͜͜ʹσʔλม͢ΔؔΛࢦఆ͢Δ
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ؔͷϑΥʔϚοτҎԼͷ௨Γ ୈҰҾɿɹྻཁૉͷ Γɹɿɹมޙͷσʔλ
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ͜ͷྫͰconvertDataͰ σʔλม͢ΔͷͰɺ ͜ΕΛͦͷ··ࢦఆ͢Δ
ίʔυͱͷରԠ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); ͜͜ʹMAPରͷྻΛࢦఆ͢Δ
͜Μͳײ͡Ͱ MAPɺFILTERͳͲͷૢ࡞Λ Έ߹ΘͤͯॲஔΛॻ͍͍ͯ͘ ωετΛਂ͘͢Δ ͱ͍͏ߟ͕͑ͳ͍
ࠓͷΞδΣϯμ खଓ͖ܕ -> ؔܕ ؔܕݴޠͷجຊతͳ໋ྩ ࣮ྫ υΩϡϝϯτྨͳͲ
͜ͷॲཧΛؔܕͰॻ͍ͯΈΑ͏ TODOϦετ͕͋Γ·ͨ͠ 1Ϩίʔυ୯ҐͰΤϥʔνΣοΫAPIΛݺͿ Τϥʔ͚ͩநग़ͯ͠ɺΤϥʔσʔλʹมԽ͢Δ
·ͣPromise.allͰ·ͱΊͯ ΤϥʔνΣοΫ·Ͱࢥ͍ͭ͘ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { }); ˞isErrorPromiseΛฦ͠·͢
·ͣPromise.allͰ·ͱΊͯ ΤϥʔνΣοΫ·Ͱࢥ͍ͭ͘ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { }); TODOͷ֤Ϩίʔυ͝ͱʹ ΤϥʔνΣοΫAPIΛ࣮ߦ ˞isErrorPromiseΛฦ͠·͢
·ͣPromise.allͰ·ͱΊͯ ΤϥʔνΣοΫ·Ͱࢥ͍ͭ͘ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { }); TODOϦετΛΤϥʔνΣοΫ APIͷPromiseϦετʹมߋ ˞isErrorPromiseΛฦ͠·͢
˞isErrorPromiseΛฦ͠·͢ ·ͣPromise.allͰ·ͱΊͯ ΤϥʔνΣοΫ·Ͱࢥ͍ͭ͘ let promiseList = R.map(todo => isError(todo), todos);
Promise.all(promiseList).then(resps => { }); ͍ͭ͜ΛPromise.allʹ ͛ͯฒྻ࣮ߦ͢Δ
ͰɺTODOຊମͱΤϥʔνΣοΫ͕ผʑͷྻ ͔ͩΒɺॲཧ͕ࡶʹͳΓͦ͏ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { }); TODOຊମ ΤϥʔνΣοΫ݁Ռ
͜͜Ͱ৽͍͠ثΛհ 2ͭͷྻΛ߹ମͤ͞Δ ZIP
ZIPͷಈ࡞ྫ R.zip([1,2,3], ['a','b','c']) => [[1,'a'], [2, 'b'], [3, 'c']]
ZIPͰTODOϦετͱ ΤϥʔνΣοΫͷ݁ՌΛ߹ମͤ͞Δ TODO1 TODO1ͷΤϥʔνΣοΫ݁Ռ TODO2 TODO2ͷΤϥʔνΣοΫ݁Ռ ͜͜·Ͱ͘Εޙ؆୯ʂʂ ɾɾɾ
Promise.allͰ શϨίʔυͷΤϥʔAPIΛݺͿ zip todoϦετͱPromiseͷϨεϙϯεΛ߹ମ filter ΤϥʔͷͷΛ͢ map Τϥʔσʔλʹม͢Δ
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); });
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); R.pipeͰෳͷॲཧΛܨ͔͚͛ͯ·͢
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); ͜͜ʹ࠷ॳͷॲཧʹ͢ҾΛࢦఆ
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); ࠓճTODOຊମͱ ΤϥʔνΣοΫ݁Ռ
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); TODOຊମͱΤϥʔνΣοΫ݁ՌΛ߹ମ
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); R.zipͷ݁Ռ͕͍ͭ͜ͷॲཧରʹͳΔ
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); item[0] : todoຊମ item[1] : ΤϥʔνΣοΫ݁Ռ
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); ͜ͷ݅Τϥʔ͕͋Δ Ϩίʔυ͚ͩΛ͢ͱ͍͏ҙຯ
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); ͬͺΓR.filterͷ݁Ռ͕ೖྗʹͳΔ
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); ͜͜ͰΤϥʔσʔλʹม͢Δ
ίʔυͰॻ͘ͱ͜͏ͳΓ·͢ let promiseList = R.map(todo => isError(todo), todos); Promise.all(promiseList).then(resps
=> { let errorData = R.pipe( R.zip, R.filter(item => item[1].isError), R.map(item => getErrorData(item[0].id)) )(todos, resps); }); Τϥʔσʔλͷྻ͕֨ೲ͞ΕΔ
ෳࡶͦ͏ͳॲཧͰ ׂͱγϯϓϧʹ͔͚·ͨ͠ ͜ͷΑ͏ʹ
ࠓͷΞδΣϯμ खଓ͖ܕ -> ؔܕ ؔܕݴޠͷجຊతͳ໋ྩ ࣮ྫ υΩϡϝϯτྨͳͲ
ެࣜαΠτ ϓϩδΣΫτϖʔδ http:/ /ramdajs.com/0.21.0/index.html υΩϡϝϯτ http:/ /ramdajs.com/0.21.0/docs/ Try Ramda (ϒϥβͰRamda͕ࢼͤ·͢)
http:/ /ramdajs.com/repl/?v=0.21.0
ίʔυͷαϯϓϧ ࠷ॳʹղઆͨ͠FILTERɺMAPΛ͏ͷ http:/ /goo.gl/AC4bfS ࠷ޙʹղઆͨ͠ZIPΛ͏ͭ http:/ /goo.gl/eoI0u9 TRY RamdaͰॻ͖·ͨ͠ ͙͢ʹಈ͖·͢ʂʂ
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠