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
Juliaを書いていて「便利だな〜」と 思ってたらスライド出来上がってた
Search
cyokozai
October 15, 2024
1
34
Juliaを書いていて「便利だな〜」と 思ってたらスライド出来上がってた
Julia言語で研究用のコードを書いていたら、結構便利だなと思ったif式のことを話したくなったので書きました。
5分LTだから内容薄いです...
cyokozai
October 15, 2024
Tweet
Share
More Decks by cyokozai
See All by cyokozai
学生サークルで開発するVMプロビジョニングツール
yusuke427
1
40
あした話したくなるSREとPlatform Engineering
yusuke427
2
110
Terraform × cloud-init で VM のセットアップをいい感じにする話
yusuke427
1
1.6k
Featured
See All Featured
A better future with KSS
kneath
238
17k
Bash Introduction
62gerente
611
210k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Navigating Team Friction
lara
183
15k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
Designing Experiences People Love
moore
140
23k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.1k
4 Signs Your Business is Dying
shpigford
182
22k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
Transcript
Julia を書いていて「便利だな〜」と 思ってたらスライド出来上がってた @cyokozai 関数型プログラミングと便利なif式
はじめに 今回話す内容はおそらく他のモダンな言語でも 同様の機能をサポートしていると思います。 「⚪⚪はJuliaだからできる!」という内容では ありませんのであらかじめご理解ください....。
自己紹介 井上 裕介 a.k.a cyokozai 千葉工業大学 情報科学部 情報工学科 B4 ❏
ネットワークコンテンツ研究会 Nekko Cloud Team ❏ 株式会社スリーシェイク sreake事業部 学生インターン生
アジェンダ • “Hello World!” in Julia • コード書いてた時の悩み • 便利なif式
• ちょっぴり入門 関数型言語
“Hello World!” in Julia println(“Hello World!”)
Python 使ってる?
NumPy 使ってる?
Julia 使ってる?
Julia とは • MITが作ったオープンソースのマルチパラダイム言語 • 自称「欲張りな言語」 • 機械学習、計算科学、工学、物理...科学の現場で大活躍! “Hello World!”
in Julia
Juliaのこと、ますます知りたいですよね? “Hello World!” in Julia 今日はほんの一部分だけお話しします^^
コード書いてた時の 悩み function idea(a,b,c...) return a+b+sum(c) end
私のユースケース • 遺伝的アルゴリズムの研究室 • 提案手法の実装をJuliaで行う • 大量のループ処理 ( 100,000世代 )
• 1,000次元以上のベンチマーク関数 コード書いてた時の悩み
こんなことがしたい コード書いてた時の悩み • 実験手法毎に関数の内容 を変えたい function calc(x, y) if method
== "add" return x + y elseif method == "sub" return x - y end end
こんなことがしたい コード書いてた時の悩み • 実験手法毎に関数の内容 を変えたい • 関数名は同じcalcだけを 使い回したい function calc(x,
y) if method == "add" return x + y elseif method == "sub" return x - y end end
こんなことがしたい コード書いてた時の悩み • 実験手法毎に関数の内容 を変えたい • 関数名は同じcalcだけを 使い回したい • 6桁規模のループ内で毎回
条件分岐をするのは嫌だ function calc(x, y) if method == "add" return x + y elseif method == "sub" return x - y end end
便利なif式 abs1(x) = x >= 0 ? x : -x
if文による条件分岐 便利なif式 • よく見る普通のif文 val = rand(Float64) if val >
0.8 fruit1 = "apple" elseif val > 0.4 fruit1 = "banana" else fruit1 = "melon" end
if文による条件分岐 便利なif式 • よく見る普通のif文 • valの値に応じてfruit1の 値が変化する val = rand(Float64)
if val > 0.8 fruit1 = "apple" elseif val > 0.4 fruit1 = "banana" else fruit1 = "melon" end
if文による条件分岐 便利なif式 • よく見る普通のif文 • valの値に応じてfruit1の 値が変化する • fruit1を条件毎に書くの は冗長
val = rand(Float64) if val > 0.8 fruit1 = "apple" elseif val > 0.4 fruit1 = "banana" else fruit1 = "melon" end
if式による条件分岐 便利なif式 • Juliaのif文は条件が真の ブロックの最終行を返す val = rand(Float64) fruit2 =
if val > 0.8 "apple" elseif val > 0.4 "banana" else "melon" end
if式による条件分岐 便利なif式 • Juliaのif文は条件が真の ブロックの最終行を返す • fruit2は一回書くだけで 先程と同じ処理ができる val =
rand(Float64) fruit2 = if val > 0.8 "apple" elseif val > 0.4 "banana" else "melon" end
さっきのコードをこうしてこうじゃ! 便利なif式 function calc(x, y) if method == "add" return
x + y elseif method == "sub" return x - y end end
さっきのコードをこうしてこうじゃ! 便利なif式 calc = if method == "add" (x, y)
-> x + y elseif method == "sub" (x, y) -> x - y end end function calc(x, y) if method == "add" return x + y elseif method == "sub" return x - y end end
できてよかったこと • ムダな (実行中は論理式の真偽が変化しない) 条件分岐の 実行が最初の一回だけで済む • if文でありがちな冗長な記述を簡潔にかける 便利なif式
ちょっぴり入門 関数型言語 add5 = x -> add(5, x)
Q. なぜこんな芸当ができてしまうのか? ちょっぴり入門 関数型言語
Q. なぜこんな芸当ができてしまうのか? A. Julia が関数型プログラミングをサポートしているから ちょっぴり入門 関数型言語
Q. なぜこんな芸当ができてしまうのか? A. Julia が関数型プログラミングをサポートしているから -> Juliaの関数は第一級関数であるから ちょっぴり入門 関数型言語
第一級関数とはなんぞや? • 値 (String, Int, etc)と関数を同等に扱う -> Juliaでは関数の型(Function)が存在する • 以下の4つの要素を持つ
関数を引数として渡す 関数を変数に代入 関数を戻り値として返す データ構造内での関数 ちょっぴり入門 関数型言語
第一級関数の特徴 ちょっぴり入門 関数型言語 calc = if method == "add" (x,
y) -> x + y elseif method == "sub" (x, y) -> x - y end end • if式は論理式の成立した ブロックの値を返す
第一級関数の特徴 ちょっぴり入門 関数型言語 calc = if method == "add" (x,
y) -> x + y elseif method == "sub" (x, y) -> x - y end end • if式は論理式の成立した ブロックの値を返す • if式の戻り値は無名関数 -> 高階関数っぽい...?
第一級関数の特徴 ちょっぴり入門 関数型言語 calc = if method == "add" (x,
y) -> x + y elseif method == "sub" (x, y) -> x - y end end • if式は論理式の成立した ブロックの値を返す • if式の戻り値は無名関数 -> 高階関数っぽい...? • 関数を変数calcへ代入 -> 第一級関数の特徴!
まとめ • Juliaは速い・書きやすい・楽しいの三拍子! • PythonでNumPy使ってる人には特にオススメ • 関数型プログラミング入門には向いてるかも...? • ぶっちゃけ最近の言語は関数型の要素取り入れてる あまり珍しくもなかったかも...?
今日話さなかった用語一覧 • 高階関数 • 関数型言語 • 三項演算子 • 無名関数 •
多重ディスパッチ • LLVM • JITコンパイル
Thank you for listening!