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
0
25
Juliaを書いていて「便利だな〜」と 思ってたらスライド出来上がってた
Julia言語で研究用のコードを書いていたら、結構便利だなと思ったif式のことを話したくなったので書きました。
5分LTだから内容薄いです...
cyokozai
October 15, 2024
Tweet
Share
More Decks by cyokozai
See All by cyokozai
学生サークルで開発するVMプロビジョニングツール
yusuke427
1
6
あした話したくなるSREとPlatform Engineering
yusuke427
0
100
Terraform × cloud-init で VM のセットアップをいい感じにする話
yusuke427
0
800
Featured
See All Featured
Done Done
chrislema
181
16k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
We Have a Design System, Now What?
morganepeng
50
7.2k
YesSQL, Process and Tooling at Scale
rocio
168
14k
4 Signs Your Business is Dying
shpigford
180
21k
[RailsConf 2023] Rails as a piece of cake
palkan
51
4.9k
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9k
The Cult of Friendly URLs
andyhume
78
6k
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!