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
64
AWSだけでネット対戦できるブラウザゲームを作った話
kaidouji85
0
61
GitHub CopilotでJavaScript開発効率を爆上げする
kaidouji85
0
100
Serverless + Fargate構成で継続的デリバリーの速度を劇的に改善した話
kaidouji85
0
920
サーバーレスアーキテクチャこそ"ヘキサゴナルアーキテクチャ"
kaidouji85
0
100
サーバーレスでターンベース制のネット対戦ゲームを作った話
kaidouji85
0
620
CDKで構築したFargateのデプロイ時間を改善した話
kaidouji85
2
540
ブラウザゲームで視聴者参加型のゲーム配信
kaidouji85
0
350
JSだけでバックエンド環境構築、IaC、自動デプロイまでやってみた話
kaidouji85
0
370
Other Decks in Technology
See All in Technology
Behind Postgres 18: The People, the Code, & the Invisible Work | Claire Giordano | PGConfEU 2025
clairegiordano
0
140
コンパウンド組織のCRE #cre_meetup
layerx
PRO
1
270
オブザーバビリティが育むシステム理解と好奇心
maruloop
2
1.3k
ViteとTypeScriptのProject Referencesで 大規模モノレポのUIカタログのリリースサイクルを高速化する
shuta13
3
210
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
14
82k
AI時代におけるデータの重要性 ~データマネジメントの第一歩~
ryoichi_ota
0
720
マルチエージェントのチームビルディング_2025-10-25
shinoyamada
0
180
Dify on AWS 環境構築手順
yosse95ai
0
140
20251027_マルチエージェントとは
almondo_event
1
440
プロダクト開発と社内データ活用での、BI×AIの現在地 / Data_Findy
sansan_randd
0
180
ヘンリー会社紹介資料(エンジニア向け) / company deck for engineer
henryofficial
0
390
AWS re:Invent 2025事前勉強会資料 / AWS re:Invent 2025 pre study meetup
kinunori
0
350
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
65
7.9k
Side Projects
sachag
455
43k
Mobile First: as difficult as doing things right
swwweet
225
10k
GraphQLとの向き合い方2022年版
quramy
49
14k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1k
Raft: Consensus for Rubyists
vanstee
140
7.2k
Scaling GitHub
holman
463
140k
Making Projects Easy
brettharned
120
6.4k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Automating Front-end Workflow
addyosmani
1371
200k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
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ͳͲΛ͏ ϓϩੜͪΌΜͱઌഐ࠷ߴ
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠