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
320
Ramdaで手軽に関数型言語を始めよう
初夏のJavaScript祭2016のLTスライドです。
kaidouji85
May 03, 2016
Tweet
Share
More Decks by kaidouji85
See All by kaidouji85
一発芸!!なんちゃってローカライズ
kaidouji85
0
47
AWSだけでネット対戦できるブラウザゲームを作った話
kaidouji85
0
50
GitHub CopilotでJavaScript開発効率を爆上げする
kaidouji85
0
93
Serverless + Fargate構成で継続的デリバリーの速度を劇的に改善した話
kaidouji85
0
870
サーバーレスアーキテクチャこそ"ヘキサゴナルアーキテクチャ"
kaidouji85
0
91
サーバーレスでターンベース制のネット対戦ゲームを作った話
kaidouji85
0
600
CDKで構築したFargateのデプロイ時間を改善した話
kaidouji85
2
520
ブラウザゲームで視聴者参加型のゲーム配信
kaidouji85
0
320
JSだけでバックエンド環境構築、IaC、自動デプロイまでやってみた話
kaidouji85
0
360
Other Decks in Technology
See All in Technology
成長し続けるアプリのためのテストと設計の関係、そして意思決定の記録。
sansantech
PRO
0
130
〜『世界中の家族のこころのインフラ』を目指して”次の10年”へ〜 SREが導いたグローバルサービスの信頼性向上戦略とその舞台裏 / Towards the Next Decade: Enhancing Global Service Reliability
kohbis
2
370
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
3
460
AWS CDK 入門ガイド これだけは知っておきたいヒント集
anank
3
300
Delegating the chores of authenticating users to Keycloak
ahus1
0
160
FOSS4G 2025 KANSAI QGISで点群データをいろいろしてみた
kou_kita
0
410
AWS CDKの仕組み / how-aws-cdk-works
gotok365
8
300
Operating Operator
shhnjk
1
620
How Do I Contact HP Printer Support? [Full 2025 Guide for U.S. Businesses]
harrry1211
0
130
american aa airlines®️ USA Contact Numbers: Complete 2025 Support Guide
aaguide
0
390
アクセスピークを制するオートスケール再設計: 障害を乗り越えKEDAで実現したリソース管理の最適化
myamashii
1
140
MobileActOsaka_250704.pdf
akaitadaaki
0
170
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
40
1.9k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.6k
Scaling GitHub
holman
460
140k
Faster Mobile Websites
deanohume
307
31k
Typedesign – Prime Four
hannesfritz
42
2.7k
Site-Speed That Sticks
csswizardry
10
690
The Pragmatic Product Professional
lauravandoore
35
6.7k
Music & Morning Musume
bryan
46
6.6k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
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Ͱॻ͖·ͨ͠ ͙͢ʹಈ͖·͢ʂʂ
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠