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
今更聞けない関数型プログラミングの基本
Search
kaidouji85
June 04, 2016
Technology
1
1.5k
今更聞けない関数型プログラミングの基本
プログラミング生放送勉強会 第41回@サイボウズ株式会社 松山オフィスの発表資料です。
kaidouji85
June 04, 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
TableauLangchainとは何か?
cielo1985
1
140
いつの間にか入れ替わってる!?新しいAWS Security Hubとは?
cmusudakeisuke
0
150
「Chatwork」のEKS環境を支えるhelmfileを使用したマニフェスト管理術
hanayo04
1
210
開発生産性を測る前にやるべきこと - 組織改善の実践 / Before Measuring Dev Productivity
kaonavi
14
8k
[SRE NEXT] ARR150億円_エンジニア140名_27チーム_17プロダクトから始めるSLO.pdf
satos
3
1.7k
AIエージェントが書くのなら直接CloudFormationを書かせればいいじゃないですか何故AWS CDKを使う必要があるのさ
watany
16
6.2k
【あのMCPって、どんな処理してるの?】 AWS CDKでの開発で便利なAWS MCP Servers特集
yoshimi0227
6
600
AI エージェントと考え直すデータ基盤
na0
17
6.8k
2025-07-06 QGIS初級ハンズオン「はじめてのQGIS」
kou_kita
0
180
〜『世界中の家族のこころのインフラ』を目指して”次の10年”へ〜 SREが導いたグローバルサービスの信頼性向上戦略とその舞台裏 / Towards the Next Decade: Enhancing Global Service Reliability
kohbis
2
900
20250708オープンエンドな探索と知識発見
sakana_ai
PRO
3
610
microCMSではじめるAIライティング
himaratsu
0
110
Featured
See All Featured
Writing Fast Ruby
sferik
628
62k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
The Invisible Side of Design
smashingmag
301
51k
Raft: Consensus for Rubyists
vanstee
140
7k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Facilitating Awesome Meetings
lara
54
6.5k
Making the Leap to Tech Lead
cromwellryan
134
9.4k
Transcript
ࠓߋฉ͚ͳ͍ؔܕ ϓϩάϥϛϯάͷجຊ 2016/06/18 ϓϩੜษڧձ@দࢁ ɹ༎հ
ࣗݾհ ༎հ ࣄͰjavaͱjavascriptͬ ͯ·͢ झຯͷήʔϜ࡞Ͱ javascriptͬͯ·͢ React + Redux࠷ߴ
ϓϩੜͪΌΜϑΝϯΫϥϒʹೖΓ·ͨ͠
ϓϩੜͪΌΜ༏ͷ্ࡔ͢ΈΕ͞Μͷ ϋϚϦͱ͍͑ઌഐͰ͢ΑͶ ʢҟೝΊΔʣ
ࢲͷ৬ʹɺ͍͢͝ઌഐ͕͍·͢ ͦͷਓ͔ΒؔܕΛୟ͖ࠐ·Ε·ͨ͠
ࠓઌഐ͔Βڭ͑ͯΒͬͨ ؔܕϓϩάϥϛϯά ʹ͍ͭͯ͠·͢
ΞδΣϯμ 1. ؔܕϓϩάϥϛϯάͱʁ 2. TODOϦετΛؔܕͰ࡞ͬͯΈΔ 3. ؔܕϓϩάϥϛϯάࡾݪଇ 4. ϥΠϒϓϩάϥϛϯά 5.
ؔܕΛ͡ΊΔʹ
ΞδΣϯμ 1. ؔܕϓϩάϥϛϯάͱʁ 2. TODOϦετΛؔܕͰ࡞ͬͯΈΔ 3. ؔܕϓϩάϥϛϯάࡾݪଇ 4. ϥΠϒϓϩάϥϛϯά 5.
ؔܕΛ͡ΊΔʹ
ؔܕϓϩάϥϛϯάͬͯ ԿͳΜͰ͠ΐ͏͔ʁ
༗໊Ͳ͜Ζͩͱɺ͍ͭ͜Β
JavaͩͱStream API͕༗໊Ͱ͢
ؔܕݴޠ ԿΛͬͯؔܕϓϩάϥϛϯάͱ͢Δ͔ɺؔܕϓϩ άϥϛϯάΛߦ͍ͬͯΔίϛϡχςΟͰਖ਼֬ͳఆٛ ߹ҙͱ͍͏ͷଘࡏ͠ͳ͍͕ɺҰൠతʹɺखଓ͖ ܕϓϩάϥϛϯά͕ίϚϯυ࣮ߦͷྻͱͯ͠ϓϩάϥϜ Λهड़͍ͯ͘͠ͷʹର͠ɺؔܕϓϩάϥϛϯάෳ ͷࣜΛؔͷద༻ʹΑͬͯΈ߹Θ͍ͤͯ͘ϓϩάϥϛ ϯάελΠϧͰ͋Δɺͱ͍͏͜ͱ͘ೝΊΒΕ͍ͯΔɻ WikipediaΑΓ https:/
/ja.wikipedia.org/wiki/ؔܕݴޠ
ؔܕͱ ͲΜͳσʔλ͕ཉ͍͠ͷ͔ɺతΛத৺ʹॻ͘ ϓϩάϥϛϯάελΠϧ Ͳ͏ͬͯతͱͳΔσʔλΛ࡞Δͷ͔ɺ ͱ͍͏͜ͱجຊతʹॻ͔ͳ͍
ؔܕͷϝϦοτ ෳࡶͳॲཧ͕͍ߦͰॻ͚Δ ίʔυͷՄಡੑ্͕Δ Α͔͘Βͳ͍όάݮΔ
ΞδΣϯμ 1. ؔܕϓϩάϥϛϯάͱʁ 2. TODOϦετΛؔܕͰ࡞ͬͯΈΔ 3. ؔܕϓϩάϥϛϯάࡾݪଇ 4. ϥΠϒϓϩάϥϛϯά 5.
ؔܕΛ͡ΊΔʹ
ྫ มߋ͕͋ͬͨϨίʔυ͚ͩநग़͢Δ ϨίʔυΛอଘ༻ʹม͢Δ TODOϦετͷอଘػೳΛ࡞Δͱ͠·͢ɻ ཁ݅ҎԼͷ௨ΓͰ͢
લఏ݅ ݴޠjavascript Ϩίʔυ͕มߋ͞Εͨ߹isChanged͕trueʹͳΔ σʔλมʹconvertDataΛ͏ // TODOϦετͷσʔλߏ let todo = [
{action:'ϓϩੜͷൃදࢿྉΛ࡞Δ', isChanged: false}, {action:'ϑΝϯτϜϫʔϧυΛ؍Δ', isChanged: true}, {action:'ϋοΧυʔϧΛνΣοΫ͢Δ', isChanged: true}, {action:'חʹ͓Ֆݟʹߦ͘', isChanged: false}, {action:'य़ΞχϝͰԿΛݟΔ͔ܾΊΔ', isChanged: true}, ];
TODOϦετΛϧʔϓͰճ͢ API༻ʹσʔλม มߋ͞Ε͔ͨ ϦετʹՃ YES NO
let postData = []; for (let i in todo) {
if(todo[i].isChanged) { postData.push(convertData(todo[i])); } } ίʔυʹىͯ͜͠Έ·͠ΐ͏ Α͋͘Δॻ͖ํͰ͕͢ɺ͕͋Γ·͢
Ͳ͕͜ͳͷ͔ •ແବʹωετ͕ਂ͍ •มͷ͕ԿճมΘΔ
ؔܕͪͬ͘ʹॻ͍ͨ let chanegedList = R.filter(data=>data.isChanged, todo); let postData = R.map(convertData,
chanegedList); let postData = []; for (let i in todo) { if(todo[i].isChanged) { postData.push(convertData(todo[i])); } }
ؔܕϓϩάϥϛϯάͷجຊతͳߟ͑ํ ྻͷશཁૉʹରͯ͠ ಉ͡ૢ࡞Λ͢Δ
ࠓճͬͨૢ࡞ FILTER MAP
FILTER ͋Δ݅Λຬͨ͢ཁૉ͚ͩΛ͢
MAP શͯͷཁૉΛม͢Δ
͜ΕͰTODOϦετͷॲཧΛॻ͘ͱ FILTER มߋ͞Εͨͷ͚ͩ͢ MAP API༻ʹσʔλม͢Δ
// FILTER มߋ͞Εͨͷ͚ͩ͢ let chanegedList = R.filter(data=>data.isChanged, todo); // MAP
API༻ʹσʔλม͢Δ let postData = R.map(convertData, chanegedList); ίʔυ̍ର̍ରԠ͍ͯ͠Δ
R.filter(data=>data.isChanged, todo); FILETRͷୈҰҾʹ ݟ׳Εͳ͍ͷ͕͋Γ·ͤΜ͔ ͱ͜ΖͰɺ
EcmaScript2015ͰՃ͞Εͨ ΞϩʔؔͰ͢ // Լͷೋͭಉ͡ҙຯ function(data) { return data.isChanged; } data
=> data.isChanged;
FILTERͰཁૉΛ݅͢Λࢦఆ͢Δ ୈҰҾɿཁૉͷ Γɿ͔͢൱͔ͷఆ݁Ռ(boolean) true -> ͢ ɹɹɹɹfalse -> ͞ͳ͍ ҎԼ༷ͷؔΛఆٛ͢Δ
FILTERͷΠϝʔδ FILTER
ؔܕϓϩάϥϛϯάͰ ࡉ͔͍݅ɺσʔλมنଇΛ ؔͱͯ͠ఆٛ͢Δ
let chanegedList = R.filter(data=>data.isChanged, todo); ͜͏͍͏ͷΛϥϜμࣜͱ͍͏
ͪͳΈʹMAPͷϥϜμࣜͷ༷ ୈҰҾɿཁૉͷ Γɿมޙͷσʔλ
MAPͷΠϝʔδ MAP
͖ͬ͞ͷྫͩͱ σʔλม༻͕ؔ༻ҙ͞Ε͍ͯΔͷͰ ͦͷ··ࢦఆ let postData = R.map(convertData, chanegedList);
આ໌ʹͬͨίʔυ ϒϥβ্Ͱಈ͔ͤ·͢ http:/ /goo.gl/AC4bfS
ΞδΣϯμ 1. ؔܕϓϩάϥϛϯάͱʁ 2. TODOϦετΛؔܕͰ࡞ͬͯΈΔ 3. ؔܕϓϩάϥϛϯάࡾݪଇ 4. ϥΠϒϓϩάϥϛϯά 5.
ؔܕΛ͡ΊΔʹ
ؔܕϓϩάϥϛϯάࡾݪଇ ϧʔϓɺ݅ذͷΘΓʹmapɺfilterͳͲΛ͏ ϥϜμࣜ1ʙ2ߦఔͰॻ͘ มͷ࠶ೖݪଇېࢭ
ؔܕϓϩάϥϛϯάࡾݪଇ ϧʔϓɺ݅ذͷΘΓʹmapɺfilterͳͲΛ͏ ϥϜμࣜ1ʙ2ߦఔͰॻ͘ มͷ࠶ೖݪଇېࢭ
ϧʔϓͷΘΓʹmapɺfilter Λ͑ͱݴ͏͚Ͳ ଞʹͲΜͳͷ͕͋Δͷʁ
ଞʹRamdaͷެࣜαΠτʹ৭ʑॻ͍ͯ͋Γ·͢ http:/ /ramdajs.com/0.21.0/docs/ reduce ྻΛ·ͱΊͯҰͭʹ͢Δ groupBy ྻͷཁૉΛάϧʔϓʹ͚Δ zip ̎ͭͷྻΛ߹͢Δ
͜ΕΒΛΈ߹ΘͤͯϩδοΫΛ࡞Δͱ ҎԼͷΑ͏ͳߟ͑ํʹͳͬͯ͘Δ ू߹͔ΒͲͷσʔλΛऔΔ͔ σʔλΛͲ͏άϧʔϓ͚ɺ߹͢Δ͔ σʔλΛͲ͏Ճ͢Δ͔
ϓϩάϥϜͱ͍͏ΑΓ SQLΛॻ͍͍ͯΔײ֮ʹ͍ۙ એݴత
એݴతϓϩάϥϛϯά ୈ1ͷఆٛʹΑΕɺ͋Δग़ྗΛಘΔʹ͋ͨͬͯͦΕΛ ࡞͢Δํ๏Ͱͳ͘ɺग़ྗͷੑ࣭Λهड़͢Δ͜ͱΛʮએ ݴܕʯͱশ͢ΔɻҰྫΛڍ͛ΔͳΒɺʢϓϩάϥϛϯ άݴޠͰͳ͍͕ʣSQLͷΫΤϦʮͲͷΑ͏ͳσʔλ ͕ཉ͍͔͠ʯΛهड़͢ΔͷͰ͋Γɺྫ͑۩ମతͳB ͷૢ࡞ͳͲͱ͍ͬͨʮ͍͔ʹͯ͠σʔλϕʔεʹΞΫ ηε͢Δ͔ʯͱ͍ͬͨ͜ͱʹؔ༩͠ͳ͍ɻ WikipediaΑΓ https:/
/ja.wikipedia.org/wiki/એݴܕϓϩάϥϛϯά
खଓ͖ܕͰू߹ʹର͢Δ ૢ࡞Λ࣮͢Δ forɺifͷΈ߹Θͤ ෳͷঢ়ଶม ΧΦείʔυʹ
ؔܕͳΒ1ߦఔͰࡁΉ ͔͠൚༻త ෳࡶͳॲཧΛগͳ͍ߦͰॻ͚Δ
ؔܕϓϩάϥϛϯάࡾݪଇ ϧʔϓɺ݅ذͷΘΓʹmapɺfilterͳͲΛ͏ ϥϜμࣜ1ʙ2ߦఔͰॻ͘ มͷ࠶ೖݪଇېࢭ
ϥϜμ͕ࣜ͗͢Δྫ // ؔܕݴޠͰҰԠॻ͍ͨ R.forEach(item => { if (item.isChanged) { postData.push(convertData(item))
} }, todo); // ࠷ॳʹࣔͨ͠ѱ͍ྫ for (let i in todo) { if(todo[i].isChanged) { postData.push(convertData(todo[i])); } }
͍ϥϜμࣜ forɺifΛͬͯΔͷͱมΘΒͳ͍
ؔܕϓϩάϥϛϯάࡾݪଇ ϧʔϓɺ݅ذͷΘΓʹmapɺfilterͳͲΛ͏ ϥϜμࣜ1ʙ2ߦఔͰॻ͘ มͷ࠶ೖݪଇېࢭ
mapɺfilterΛ͑Ұ࣌มΛ͏ඞཁ͕ͳ͍ มͷ࠶ೖΛېࢭ͢Εঢ়ଶɺ෭࡞༻͕ݮΔ ͷͰόά͕গͳ͘ͳΔ มͷ࠶ೖېࢭͷ͜͜Ζ
ཧతͳؔ ೖྗ͕ಉ͡ͳΒɺ͍ͭͰಉ͡ग़ྗ ঢ়ଶ͕͋Δؔ ೖྗ͕ಉ͡Ͱɺ෦ঢ়ଶʹΑΓग़ྗ͕ҟͳΔ ෭࡞༻͕͋Δؔ ೖྗσʔλ͕ؔ෦Ͱॻ͖ΘΔ ঢ়ଶɺ෭࡞༻ʹ͍ͭͯ
ঢ়ଶ: ঢ়ଶมʹ࠶ೖ͢Δ ෭࡞༻ɿҾʹ࠶ೖ͢Δ มͷ࠶ೖېࢭͰ ঢ়ଶɺ෭࡞༻͕໓Ͱ͖Δ
ঢ়ଶɺ෭࡞༻͕ͳ͍ϓϩάϥϜ Α͔͘Βͳ͍όά͕ग़ʹ͍͘
ΞδΣϯμ 1. ؔܕϓϩάϥϛϯάͱʁ 2. TODOϦετΛؔܕͰ࡞ͬͯΈΔ 3. ؔܕϓϩάϥϛϯάࡾݪଇ 4. ϥΠϒϓϩάϥϛϯά 5.
ؔܕΛ͡ΊΔʹ
ྫ ҎԼͷΑ͏ͳσʔλมॲཧΛߦ͏ //ݩͷσʔλߏ [ { data:’YYYY/MM/DD’, weather:’ ఱؾ’ } ]
// มޙͷσʔλߏ [ { weather:’ఱؾ’, data:[ ‘YYYY/MM/DD’ ] } ]
ϩδοΫΛߟ͑Δͱ groupBy ఱؾ͝ͱʹάϧʔϓ͚͢Δ MAP άϧʔϓ͝ͱʹσʔλม͢Δ
͔͜͜Β ϥΠϒϓϩάϥϛϯά ͷελʔτʂʂ http:/ /goo.gl/C7W0fW
͑ͷίʔυ let createGroupData = (val, key)=>({ weather: key, date: R.map(item
=> item.date, val) }); let convertData = R.pipe( R.groupBy(item => item.weather), R.mapObjIndexed(createGroupData), R.values ); convertData(data); ಈ࡞֬ೝ͜͜Ͱʂ http:/ /goo.gl/qdiY2u
গ͚ͩ͠ղઆ // άϧʔϓ͝ͱͷσʔλมॲཧ let createGroupData = (val, key)=>({ weather: key,
date: R.map(item => item.date, val) }); let convertData = R.pipe( // ఱؾͰάϧʔϓ͚ R.groupBy(item => item.weather), // άϧʔϓ͝ͱʹσʔλม R.mapObjIndexed(createGroupData), // ࿈ྻ͔Βී௨ͷྻʹม R.values ); convertData(data);
ΞδΣϯμ 1. ؔܕϓϩάϥϛϯάͱʁ 2. TODOϦετΛؔܕͰ࡞ͬͯΈΔ 3. ؔܕϓϩάϥϛϯάࡾݪଇ 4. ϥΠϒϓϩάϥϛϯά 5.
ؔܕΛ͡ΊΔʹ
͝ΊΜͳ͍͞ javaͱjavascript ͔͔͠Βͳ͍Ͱ͢
Javaͷ߹ Java8ʹόʔδϣϯΞοϓͯ͠ StreamAPIΛ͍·͠ΐ͏
JavaScriptͷ߹ Ramda͕͓͢͢ΊͰ͢ http:/ /ramdajs.com/0.21.0/index.html
Try RamdaͰ͙͢ʹࢼͤ·͢ http:/ /ramdajs.com/repl/?v=0.21.0 ͜ͷεϥΠυͷίʔυ͜ΕͰಈ͔ͤ·͢
javaɺjavascriptҎ֎Ͱؔܕ ϥΠϒϥϦΛ୳͍͍ͤͱࢥ͏Α
ଞݴޠগ͠ௐͯΈͨ PHP array_mapɺarray_filterͱ͔͕ඪ४Ͱ͋Δ Ruby Array͕ඪ४Ͱmapɺselectͱ͔Λ࣋ͬͯΔ C++ C++ Streamͯͷ͕͋ΔΒ͍͠ http:/ /jscheiny.github.io/Streams/
ࠓͷ·ͱΊ ؔܕϓϩάϥϜɺSQLͷΑ͏ʹએݴతʹ ϩδοΫΛߟ͑Δ ؔܕϓϩάϥϜϧʔϓɺذͷΘΓʹ filterɺmapͳͲΛ͏ ϓϩੜͪΌΜͱઌഐ࠷ߴ
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠