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
31
Juliaを書いていて「便利だな〜」と 思ってたらスライド出来上がってた
Julia言語で研究用のコードを書いていたら、結構便利だなと思ったif式のことを話したくなったので書きました。
5分LTだから内容薄いです...
cyokozai
October 15, 2024
Tweet
Share
More Decks by cyokozai
See All by cyokozai
学生サークルで開発するVMプロビジョニングツール
yusuke427
1
38
あした話したくなるSREとPlatform Engineering
yusuke427
2
110
Terraform × cloud-init で VM のセットアップをいい感じにする話
yusuke427
1
1.6k
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
34
3.1k
How to train your dragon (web standard)
notwaldorf
91
5.8k
Why Our Code Smells
bkeepers
PRO
336
57k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
How STYLIGHT went responsive
nonsquared
98
5.4k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
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!