Slide 1

Slide 1 text

Julia を書いていて「便利だな〜」と 思ってたらスライド出来上がってた @cyokozai 関数型プログラミングと便利なif式

Slide 2

Slide 2 text

はじめに 今回話す内容はおそらく他のモダンな言語でも 同様の機能をサポートしていると思います。 「⚪⚪はJuliaだからできる!」という内容では ありませんのであらかじめご理解ください....。

Slide 3

Slide 3 text

自己紹介 井上 裕介 a.k.a cyokozai 千葉工業大学 情報科学部 情報工学科 B4 ❏ ネットワークコンテンツ研究会 Nekko Cloud Team ❏ 株式会社スリーシェイク sreake事業部 学生インターン生

Slide 4

Slide 4 text

アジェンダ ● “Hello World!” in Julia ● コード書いてた時の悩み ● 便利なif式 ● ちょっぴり入門 関数型言語

Slide 5

Slide 5 text

“Hello World!” in Julia println(“Hello World!”)

Slide 6

Slide 6 text

Python 使ってる?

Slide 7

Slide 7 text

NumPy 使ってる?

Slide 8

Slide 8 text

Julia 使ってる?

Slide 9

Slide 9 text

Julia とは ● MITが作ったオープンソースのマルチパラダイム言語 ● 自称「欲張りな言語」 ● 機械学習、計算科学、工学、物理...科学の現場で大活躍! “Hello World!” in Julia

Slide 10

Slide 10 text

Juliaのこと、ますます知りたいですよね? “Hello World!” in Julia 今日はほんの一部分だけお話しします^^

Slide 11

Slide 11 text

コード書いてた時の 悩み function idea(a,b,c...) return a+b+sum(c) end

Slide 12

Slide 12 text

私のユースケース ● 遺伝的アルゴリズムの研究室 ● 提案手法の実装をJuliaで行う ● 大量のループ処理 ( 100,000世代 ) ● 1,000次元以上のベンチマーク関数 コード書いてた時の悩み

Slide 13

Slide 13 text

こんなことがしたい コード書いてた時の悩み ● 実験手法毎に関数の内容 を変えたい function calc(x, y) if method == "add" return x + y elseif method == "sub" return x - y end end

Slide 14

Slide 14 text

こんなことがしたい コード書いてた時の悩み ● 実験手法毎に関数の内容 を変えたい ● 関数名は同じcalcだけを 使い回したい function calc(x, y) if method == "add" return x + y elseif method == "sub" return x - y end end

Slide 15

Slide 15 text

こんなことがしたい コード書いてた時の悩み ● 実験手法毎に関数の内容 を変えたい ● 関数名は同じcalcだけを 使い回したい ● 6桁規模のループ内で毎回 条件分岐をするのは嫌だ function calc(x, y) if method == "add" return x + y elseif method == "sub" return x - y end end

Slide 16

Slide 16 text

便利なif式 abs1(x) = x >= 0 ? x : -x

Slide 17

Slide 17 text

if文による条件分岐 便利なif式 ● よく見る普通のif文 val = rand(Float64) if val > 0.8 fruit1 = "apple" elseif val > 0.4 fruit1 = "banana" else fruit1 = "melon" end

Slide 18

Slide 18 text

if文による条件分岐 便利なif式 ● よく見る普通のif文 ● valの値に応じてfruit1の 値が変化する val = rand(Float64) if val > 0.8 fruit1 = "apple" elseif val > 0.4 fruit1 = "banana" else fruit1 = "melon" end

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

if式による条件分岐 便利なif式 ● Juliaのif文は条件が真の ブロックの最終行を返す val = rand(Float64) fruit2 = if val > 0.8 "apple" elseif val > 0.4 "banana" else "melon" end

Slide 21

Slide 21 text

if式による条件分岐 便利なif式 ● Juliaのif文は条件が真の ブロックの最終行を返す ● fruit2は一回書くだけで 先程と同じ処理ができる val = rand(Float64) fruit2 = if val > 0.8 "apple" elseif val > 0.4 "banana" else "melon" end

Slide 22

Slide 22 text

さっきのコードをこうしてこうじゃ! 便利なif式 function calc(x, y) if method == "add" return x + y elseif method == "sub" return x - y end end

Slide 23

Slide 23 text

さっきのコードをこうしてこうじゃ! 便利な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

Slide 24

Slide 24 text

できてよかったこと ● ムダな (実行中は論理式の真偽が変化しない) 条件分岐の 実行が最初の一回だけで済む ● if文でありがちな冗長な記述を簡潔にかける 便利なif式

Slide 25

Slide 25 text

ちょっぴり入門 関数型言語 add5 = x -> add(5, x)

Slide 26

Slide 26 text

Q. なぜこんな芸当ができてしまうのか? ちょっぴり入門 関数型言語

Slide 27

Slide 27 text

Q. なぜこんな芸当ができてしまうのか? A. Julia が関数型プログラミングをサポートしているから ちょっぴり入門 関数型言語

Slide 28

Slide 28 text

Q. なぜこんな芸当ができてしまうのか? A. Julia が関数型プログラミングをサポートしているから -> Juliaの関数は第一級関数であるから ちょっぴり入門 関数型言語

Slide 29

Slide 29 text

第一級関数とはなんぞや? ● 値 (String, Int, etc)と関数を同等に扱う -> Juliaでは関数の型(Function)が存在する ● 以下の4つの要素を持つ 関数を引数として渡す 関数を変数に代入 関数を戻り値として返す データ構造内での関数 ちょっぴり入門 関数型言語

Slide 30

Slide 30 text

第一級関数の特徴 ちょっぴり入門 関数型言語 calc = if method == "add" (x, y) -> x + y elseif method == "sub" (x, y) -> x - y end end ● if式は論理式の成立した ブロックの値を返す

Slide 31

Slide 31 text

第一級関数の特徴 ちょっぴり入門 関数型言語 calc = if method == "add" (x, y) -> x + y elseif method == "sub" (x, y) -> x - y end end ● if式は論理式の成立した ブロックの値を返す ● if式の戻り値は無名関数 -> 高階関数っぽい...?

Slide 32

Slide 32 text

第一級関数の特徴 ちょっぴり入門 関数型言語 calc = if method == "add" (x, y) -> x + y elseif method == "sub" (x, y) -> x - y end end ● if式は論理式の成立した ブロックの値を返す ● if式の戻り値は無名関数 -> 高階関数っぽい...? ● 関数を変数calcへ代入 -> 第一級関数の特徴!

Slide 33

Slide 33 text

まとめ ● Juliaは速い・書きやすい・楽しいの三拍子! ● PythonでNumPy使ってる人には特にオススメ ● 関数型プログラミング入門には向いてるかも...? ● ぶっちゃけ最近の言語は関数型の要素取り入れてる あまり珍しくもなかったかも...?

Slide 34

Slide 34 text

今日話さなかった用語一覧 ● 高階関数 ● 関数型言語 ● 三項演算子 ● 無名関数 ● 多重ディスパッチ ● LLVM ● JITコンパイル

Slide 35

Slide 35 text

Thank you for listening!