Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
辛いコードを甘くするカリー化のレシピ
Search
もなか
June 19, 2021
Technology
770
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
辛いコードを甘くするカリー化のレシピ
もりけん塾勉強会で使用した勉強会資料です。
もなか
June 19, 2021
More Decks by もなか
See All by もなか
知っているようで知らないOGPの書き方
443n0511
0
410
Other Decks in Technology
See All in Technology
2026 Apache Flink Community Checkpoint
rmetzger
0
200
HQ駆動開発で最高のAI-Contextを作ろう
sansantech
PRO
1
120
サボる子はいねぇがー!AgentCoreハーネスの脆弱性に学ぶ、エージェントの入力バリデーション
iwamot
PRO
5
310
属人化したISMS運用をGitHubとAIで仕組み化した1年間の記録
sioncojp
4
1.8k
令和の今、あらためて IAM を考える。アクセスキーを「無くせない現実」との向き合い方
kazzpapa3
0
540
Microsoft Entra Kerberos で実現するクラウド デバイス管理
tamaiyutaro
2
660
llm-d に入門してみた / Try out llm-d
kota2and3kan
0
100
cdkd (CDK Direct)
gotok365
4
280
コードレビューをなくして見えたもの
henteko
0
140
Claude Codeで作ったアプリを安全に公開する/Built with Claude Japan 2026
yoshidashingo
0
220
現場を動かすAIエージェント#2_製造業現場でのAI活用から見た、ハマる罠と実践知
kintotechdev
2
210
AIコーディングはじめました
miso
0
160
Featured
See All Featured
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
560
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
600
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Designing Powerful Visuals for Engaging Learning
tmiket
1
650
Discover your Explorer Soul
emna__ayadi
2
1.3k
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
750
Documentation Writing (for coders)
carmenintech
77
5.6k
Site-Speed That Sticks
csswizardry
13
1.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
Transcript
辛いコードを 甘くする カリー化のレシピ
自己紹介 ソフトウェア開発会社でテスター兼コーダーとして勤務 パンを焼くのが好き ▶Twitter:@ruby443n もなか@js詰まったらパン作る人
甘口なコードとは? 扱いやすい
可読性が高い スマート 保守しやすい バグが少ない
具体的には?
・・・。 わかる? いや、わかんない
変数・定数 命名 条件式 関数 いろいろあるよ
変数・定数 命名 条件式 関数 いろいろあるよ 今回はココ
今日話す内容 高階関数ってなに? カリー化とは 部分適応って知ってる?
話さないこと カレーパンのレシピ
知りたい方はDMください 待ってまーす
さて
下記のリストからデザートメニューだけを 取り出す場合について考えてみます。 ]; constmenus=[ {menu:'ハンバーガー',type:burger}, {menu:'チーズバーガー',type:burger}, {menu:'ソフトクリーム',type:dessert}, {menu:'ポテト',type:side}, {menu:'チキンナゲット',type:side}, {menu:'ホットアップルパイ',type:dessert},
{menu:'コーラ',type:drink}, {menu:'オレンジジュース',type:drink}
for文の場合
デザートメニューだけを取り出す(for文の場合) console.log(dessertMenus); constdessertMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===dessert){ dessertMenus.push(menus[i]); } }
処理が増えていくと どうなるか 考えてみようね
constdessertMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===dessert){ dessertMenus.push(menus[i]); } } constburgerMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===burger){
burgerMenus.push(menus[i]); } } constsideMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===side){ sideMenus.push(menus[i]); } }
目がシパシパする
for文の場合 console.log(dessertMenus); constdessertMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===dessert){ dessertMenus.push(menus[i]); } } デザートかどうか
for文の場合 console.log(dessertMenus); constdessertMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===dessert){ dessertMenus.push(menus[i]); } } 配列の中に
値を追加
console.log(dessertMenus); constdessertMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===dessert){ dessertMenus.push(menus[i]); } } for文の場合 処理が2種類ある
分けちゃいましょう
高階関数とは 関数を引数または戻り値 として扱う関数のこと 引数:プログラムや関数に渡す値のこと 戻り値:プログラムや関数から戻ってくる値のこと
コールバック関数には 特定の条件を与えて取得したい内容を書くよ すると任意のデータを抽出して新しい配列を生成してくれるよ filter関数をつかって高階関数をつくるよ 配列データ.filter(コールバック関数) constitems=
へえ〜… わかる? ぼんやり…
コールバック関数に書くこと 特定の条件を与えて取得したい内容を書くよ すると任意のデータを抽出して新しい配列を生成してくれるよ filterをつかって高階関数をつくるよ 配列データ.filter(コールバック関数) constitems=
高階関数の場合 デザートメニューかどうか判断する関数と メニューからデザートメニューを抜き出す関数に分けて考える
高階関数の場合 デザートメニューかどうか判断する関数と メニューからデザートメニューを抜き出す関数に分けて考える デザートかどうか
高階関数の場合 デザートメニューかどうか判断する関数と メニューからデザートメニューを抜き出す関数に分けて考える isDessertMenuを抽出
処理が増えていくと どうなるか 考えてみようね
constisDessertMenus=function(menu){ returnmenu.type===dessert; }; constisBurgerMenus=function(menu){ returnmenu.type===Burger'; }; constisSideMenus=function(menu){ returnmenu.type==='side'; }; constdessertMenus=menus.filter(isDessertMenus);
constdessertMenus=menus.filter(isBurgerMenus); constdessertMenus=menus.filter(isSideMenus);
カリー化とは
カリー化とは 2つ以上の引数を取る関数 を分割し、 1つの引数だけを取る関数 の組み合わせに書き換える こと
ふ〜ん…?
たとえば
カリー化していない関数(引数を2つ取るもの) 結果
カリー化された関数 (1つの引数だけを取る関数の組み合わせ) 結果
…なんか逆に 複雑になってない?
何故カリー化が いいのか カリー化をすると 部分適用を簡単に行うこと ができるからぜひ使ってほ しいのです。 順番に説明するね
部分適用とは
部分適用とは 複数の引数を受け取る関数 の引数の値を固定し、より 少ない数の引数を受け取る 関数に変換すること 引数を固定化してしまうことで、 バグが起きる可能性を極力抑えることができるよ!
わかりにくいなぁ
カリー化していない関数(引数を2つ取るもの)
カリー化していない関数(引数を2つ取るもの) 毎回1を代入してる
カリー化していない関数(引数を2つ取るもの) 毎回1を代入してる 無駄が多く バグが起こりやすい
カリー化された関数 (1つの引数だけを取る関数の組み合わせ)
カリー化された関数 (1つの引数だけを取る関数の組み合わせ) 1を足す部分が固定化
カリー化された関数 (1つの引数だけを取る関数の組み合わせ) 1を足す部分が固定化 引数を固定化してしまうことで、 バグが起きる可能性を極力抑えることができたよ!
constisDessertMenus=function(menu){ returnmenu.type===dessert; }; constisBurgerMenus=function(menu){ returnmenu.type===Burger'; }; constisSideMenus=function(menu){ returnmenu.type==='side'; }; constdessertMenus=menus.filter(isDessertMenus);
constdessertMenus=menus.filter(isBurgerMenus); constdessertMenus=menus.filter(isSideMenus);
constisDessertMenus=function(menu){ returnmenu.type===dessert; }; constisBurgerMenus=function(menu){ returnmenu.type===Burger'; }; constisSideMenus=function(menu){ returnmenu.type==='side'; }; constdessertMenus=menus.filter(isDessertMenus);
constdessertMenus=menus.filter(isBurgerMenus); constdessertMenus=menus.filter(isSideMenus); カリー化と部分適応を 使ってみるよ
高階関数の場合 デザートメニューかどうか判断する関数と メニューからデザートメニューを抜き出す関数に分けて考える
高階関数の場合 デザートメニューかどうか判断する関数と メニューからデザートメニューを抜き出す関数に分けて考える ココを変えるよ
functionmenuType(type){ returnfunction(menu){ returnmenu.type===type }; }; constdessertMenus=menus.filter(menuType( dessert )); 高階関数とカリー化と部分適用を使ったよ
constmenuType=(type)=>{ return(menu)=>{ returnmenu.type===type }; }; constdessertMenus=menus.filter(menuType( dessert )); 【アロー関数変更】functionを=>へ変更
constmenuType=(type)=>(menu)=>menu.type===type; constdessertMenus=menus.filter(menuType( dessert )); 【アロー関数変更】{}とreturnを省略
constmenuType=type=>menu=>menu.type===type; constdessertMenus=menus.filter(menuType( dessert )); 【アロー関数変更】{}とreturnと()を省略
constmenuType=type=>menu=>menu.type===type; constdessertMenus=menus.filter(menuType( dessert )); constburgerMenus=menus.filter(menuType( burger )); constsideMenus=menus.filter(menuType( side ));
処理が増えても簡潔に書ける
constdessertMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===dessert){ dessertMenus.push(menus[i]); } } constburgerMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===burger){
burgerMenus.push(menus[i]); } } constsideMenus=[]; for(leti=0;i<menus.length;i++){ if(menus[i].type===side){ sideMenus.push(menus[i]); } } これが
constmenuType=type=>menu=>menu.type===type; constdessertMenus=menus.filter(menuType( dessert )); constburgerMenus=menus.filter(menuType( burger )); constsideMenus=menus.filter(menuType( side ));
こう
constmenuType=type=>menu=>menu.type===type; constdessertMenus=menus.filter(menuType( dessert )); constburgerMenus=menus.filter(menuType( burger )); constsideMenus=menus.filter(menuType( side ));
こう
まとめ・質疑応答
ありがとうございました 参考資料 高階関数、カリー化、部分適用 https://qiita.com/nouka/items/d9f29db7b6a69baa650a javascriptのcurry化とは何か https://developer.yukimonkey.com/article/20200303/#h2_3