Slide 1

Slide 1 text

静的型付き関数 型言語のススメ @@ttmmaaeeddaa 22001133..0033..2200 RRuubbyy勉強会@札幌

Slide 2

Slide 2 text

@@ttmmaaeeddaa ((株))アンタスで主にPPHHPPで仕事をしていま す。 関数型は趣味です。OOCCaammllとHHaaxxeeが好 き。近いうちに仕事で使いたいなぁ。

Slide 3

Slide 3 text

22001133年22月77日

Slide 4

Slide 4 text

22001133年22月77日

Slide 5

Slide 5 text

22001133年22月77日

Slide 6

Slide 6 text

22001133年22月77日

Slide 7

Slide 7 text

22001133年22月77日

Slide 8

Slide 8 text

22001133年22月2277日

Slide 9

Slide 9 text

22001133年22月2277日 戦いは動的陣営か ら始まった

Slide 10

Slide 10 text

22001133年22月2277日 hhttttpp::////dd..hhaatteennaa..nnee..jjpp//ppeerrllccooddeessaammppllee// 2200113300222277//11336611992288881100

Slide 11

Slide 11 text

22001133年22月2277日 見事な 大炎上

Slide 12

Slide 12 text

せっかく下火に なってきたのに、 また蒸し返し ちゃっていいの?

Slide 13

Slide 13 text

動的陣営の大ボス@@ssuummiimmさ んも今日の勉強会に参加する というのでドキドキしていた けど、今日の自己紹介による と@@ssuummiimmさんは今SSccaallaaの ttrraaiittやRRuubbyyのrreeffiinneemmeennttss に夢中らしいので、心配事が ひとつだけ減りました♪

Slide 14

Slide 14 text

この物語は私の関数型の平凡 な日常を淡々と描くもので す。過度なツッコミはしない でください。

Slide 15

Slide 15 text

静的型付き関数 型言語のススメ @@ttmmaaeeddaa 22001133..0033..2200 RRuubbyy勉強会@札幌

Slide 16

Slide 16 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 17

Slide 17 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 18

Slide 18 text

関数型プログラミング 副作用をなるべく少なく 関数を第一級オブジェクトとして扱う((関 数が関数を受けとったり、関数が関数を 返したり))

Slide 19

Slide 19 text

副作用? 同じ引数を与えれば常に同じ戻り値を返 すのが「副作用がない」状態 ((数学の「関数」と同じ)) 副作用 入�出力((ファイル、DDBB、ネットワーク、環境変 数など)) 破壊的代入�

Slide 20

Slide 20 text

関数型プログラミ ングがしやすいよ うな機能がある言 語=関数型言語

Slide 21

Slide 21 text

主な関数型言語 静的型 付け MMLL((7733)),, CClleeaann((8877)),, SSMMLL((9900)),, HHaasskkeellll((9900)),, OOCCaammll((9966)),, SSccaallaa((0033)),, FF##((0055)),, SSMMLL##((1122)) 動的型 付け LLiisspp((5588)),, SScchheemmee((7755)),, EErrllaanngg((8866)),, CClloojjuurree((0077)) ※カッコ内の数字は登場年

Slide 22

Slide 22 text

そういう言語があるの は知ってるけどさぁ、 実際使われてるわけ? 研究者とか趣味の人だ けなんでしょ?

Slide 23

Slide 23 text

関数型の実例 hhttttppss::////ggiitthhuubb..ccoomm//xxeenn--oorrgg//xxeenn--aappii hhttttppss::////ggiitthhuubb..ccoomm//hhaaxxee--mmiirrrroorrss//hhaaxxee FFiieelldd RReeppoorrttss OOCCaammll 検索 hhttttppss::////ggiitthhuubb..ccoomm//ffaacceebbooookk//lleexx--ppaassss hhttttppss::////ggiitthhuubb..ccoomm//ffaacceebbooookk//ppffffff SSccaallaa aatt ffoouurrssqquuaarree 検索 TTuummbbllrr における SSccaallaa 検索

Slide 24

Slide 24 text

今日は主にOOCCaammllを題材 に静的型付き関数型言語 の話をします。 ※以下、「関数型」と言ったら静的型付き関数型言語のことを指します。 ブラウザで動く対話環境TTrryy OOCCaammllで 試すのも良いでしょう。 TTrryy OOCCaammll 検索

Slide 25

Slide 25 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 26

Slide 26 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 27

Slide 27 text

静的型付き関数型で 開発しているときの 気持ち

Slide 28

Slide 28 text

JJaavvaaとRRuubbyyとOOCCaammllで開発していると きの気持ちをタイムラインで比較してみ たいと思います ※タイムラインって何?って方はこちら → hhttttpp::////wwwwww..aaggiilleeaaccaaddeemmyy..ccoomm..aauu//aaggiillee//ssiitteess//ddeeffaauulltt//ffiilleess// TTiimmeelliinnee%%2200RReettrrooppeeccttiivveess%%220022001111..ppddff

Slide 29

Slide 29 text

JJaavvaaでの開発 (( ゜∀゜ )) ((´・ω・`))

Slide 30

Slide 30 text

JJaavvaaでの開発 できたー (( ゜∀゜ )) ((´・ω・`))

Slide 31

Slide 31 text

JJaavvaaでの開発 コンパイルエラー (( ゜∀゜ )) ((´・ω・`))

Slide 32

Slide 32 text

JJaavvaaでの開発 うーん、何がダメなのかなー (( ゜∀゜ )) ((´・ω・`))

Slide 33

Slide 33 text

JJaavvaaでの開発 これか!コンパイル通った! (( ゜∀゜ )) ((´・ω・`))

Slide 34

Slide 34 text

JJaavvaaでの開発 動いた! (( ゜∀゜ )) ((´・ω・`))

Slide 35

Slide 35 text

JJaavvaaでの開発 ぬるぽ((´・ω・`)) (( ゜∀゜ )) ((´・ω・`))

Slide 36

Slide 36 text

JJaavvaaでの開発 えー、何がダメなのー? (( ゜∀゜ )) ((´・ω・`))

Slide 37

Slide 37 text

JJaavvaaでの開発 これか!コンパイルも通った! (( ゜∀゜ )) ((´・ω・`))

Slide 38

Slide 38 text

JJaavvaaでの開発 動いた! (( ゜∀゜ )) ((´・ω・`))

Slide 39

Slide 39 text

JJaavvaaでの開発 ぬるぽ((´・ω・`)) (( ゜∀゜ )) ((´・ω・`))

Slide 40

Slide 40 text

JJaavvaaでの開発 えー、何がダメなのー? (( ゜∀゜ )) ((´・ω・`))

Slide 41

Slide 41 text

JJaavvaaでの開発 これか!コンパイルも通った! (( ゜∀゜ )) ((´・ω・`))

Slide 42

Slide 42 text

JJaavvaaでの開発 動いた! コンパイル通っても実行時に落ちることが多いので、 コンパイルによる型チェックが有り難い物だと言う 感覚をあまり持てない。 (( ゜∀゜ )) ((´・ω・`))

Slide 43

Slide 43 text

RRuubbyyでの開発 (( ゜∀゜ )) ((´・ω・`))

Slide 44

Slide 44 text

RRuubbyyでの開発 できたー (( ゜∀゜ )) ((´・ω・`))

Slide 45

Slide 45 text

RRuubbyyでの開発 動いた! (( ゜∀゜ )) ((´・ω・`))

Slide 46

Slide 46 text

RRuubbyyでの開発 ぬるぽ((´・ω・`)) (( ゜∀゜ )) ((´・ω・`))

Slide 47

Slide 47 text

RRuubbyyでの開発 うーん、何がダメなのかなー (( ゜∀゜ )) ((´・ω・`))

Slide 48

Slide 48 text

RRuubbyyでの開発 これか! (( ゜∀゜ )) ((´・ω・`))

Slide 49

Slide 49 text

RRuubbyyでの開発 動いた! (( ゜∀゜ )) ((´・ω・`))

Slide 50

Slide 50 text

RRuubbyyでの開発 ぬるぽ((´・ω・`)) (( ゜∀゜ )) ((´・ω・`))

Slide 51

Slide 51 text

RRuubbyyでの開発 うーん、何がダメなのかなー (( ゜∀゜ )) ((´・ω・`))

Slide 52

Slide 52 text

RRuubbyyでの開発 これか! (( ゜∀゜ )) ((´・ω・`))

Slide 53

Slide 53 text

RRuubbyyでの開発 動いた! 早い段階で「動いたー」という喜びを得られるので、 その喜びを糧にその後の実行時エラーの対処もがんばれる。 但し、いちいち動かさないとエラーがわからないので エラーが全てつぶれるまでには時間がかかる。 (( ゜∀゜ )) ((´・ω・`))

Slide 54

Slide 54 text

関数型での開発((初心者)) (( ゜∀゜ )) ((´・ω・`))

Slide 55

Slide 55 text

関数型での開発((初心者)) できたー (( ゜∀゜ )) ((´・ω・`))

Slide 56

Slide 56 text

関数型での開発((初心者)) コンパイルエラー((´・ω・`)) (( ゜∀゜ )) ((´・ω・`))

Slide 57

Slide 57 text

関数型での開発((初心者)) うーん、何がダメなのかなー (( ゜∀゜ )) ((´・ω・`))

Slide 58

Slide 58 text

関数型での開発((初心者)) これか! (( ゜∀゜ )) ((´・ω・`))

Slide 59

Slide 59 text

関数型での開発((初心者)) コンパイルエラー((´・ω・`)) (( ゜∀゜ )) ((´・ω・`))

Slide 60

Slide 60 text

関数型での開発((初心者)) うーん、何がダメなのかなー (( ゜∀゜ )) ((´・ω・`))

Slide 61

Slide 61 text

関数型での開発((初心者)) これか! (( ゜∀゜ )) ((´・ω・`))

Slide 62

Slide 62 text

関数型での開発((初心者)) コンパイルエラー((´・ω・`)) (( ゜∀゜ )) ((´・ω・`))

Slide 63

Slide 63 text

関数型での開発((初心者)) うーん、何がダメなのかなー 動かせずにいっぱいコンパイラに文句言われ るのでどんどん気分が落ちていく (( ゜∀゜ )) ((´・ω・`))

Slide 64

Slide 64 text

関数型での開発((初心者)) これか! (( ゜∀゜ )) ((´・ω・`))

Slide 65

Slide 65 text

関数型での開発((初心者)) コンパイル通ったーーーーー! (( ゜∀゜ )) ((´・ω・`))

Slide 66

Slide 66 text

関数型での開発((初心者)) 実行時エラー起きねーーー! (( ゜∀゜ )) ((´・ω・`))

Slide 67

Slide 67 text

関数型での開発((慣れると)) 「コンパイルが通ればほとんど実行時エラーが 起きない」を体験すると、 コンパイルエラーが起きても「はいはい、 ご忠告ありがとね♪」と解釈できるようになり、 凹まなくなってくる (( ゜∀゜ )) ((´・ω・`)) ※何も気をつけなくても実行時エラーがゼロになるということではな いです。コンパイラのチェック機能をうまく活かすように書き方に気 をつけるという人間側の努力も必要です。

Slide 68

Slide 68 text

気持ちの変化 最初は口うるさく感じられたコンパイラ が愛おしくなってくる この強力なチェック機能をもっと活用し て、どんどん人的ミスが起きる可能性を つぶして行こう! 世の中の全てを型で表せばいいんだ! エラーはほとんどコンパイラが検出して くれるので、自分はロジックを組むこと に集中できる

Slide 69

Slide 69 text

動的陣営の反論 えー、型を間違うなんて滅多にない よー。uusseerr型が要求されているところに uusseerr以外のデータなんか渡さないし...... メソッド名の間違いなんてしないよー、 エディタが補完してくれるしー。

Slide 70

Slide 70 text

これ型エラーです! ppaarraammss[[::nnaammee]] ==>> nniill あれー、値がとれてくるはずなんだけどなー

Slide 71

Slide 71 text

これ型エラーです! ppaarraammss[[""nnaammee""]] ==>> ""ffoooo"" あれー、値がとれてくるはずなんだけどなー あ!こうか!(シンボルと文字列の間違い)) ppaarraammss[[::nnaammee]] ==>> nniill

Slide 72

Slide 72 text

これ型エラーです! <<%%== uusseerr..ggrroouupp..nnaammee %%>> uusseerrが属するggrroouuppの名前を表示しようとしたとき。 ggrroouuppに属していないuusseerrがいると...... NNooMMeetthhooddEErrrroorr:: uunnddeeffiinneedd mmeetthhoodd ``nnaammee'' ffoorr nniill::NNiillCCllaassss

Slide 73

Slide 73 text

明らかな型エラーだと思 われているもの((※))以外に も、型エラーとして検出 できるエラーがいっぱい あります。 ※uusseerr型が期待されているところにuusseerr以外のものを渡す、 みたいなやつ

Slide 74

Slide 74 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 75

Slide 75 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 76

Slide 76 text

静的型付き関数型によくある機能 強い型付けと型推論 代数的データ型 パターンマッチ

Slide 77

Slide 77 text

静的型付き関数型によくある機能 強い型付けと型推論 代数的データ型 パターンマッチ

Slide 78

Slide 78 text

静的型付けと型推論 FFiillee** ffiillee == ffooppeenn((""ffoooo..ttxxtt"",, ""rr""));; iinntt cc == ffggeett((ffiillee));; //// コンパイルエラー ((正:ffggeettcc)) ffiillee == ooppeenn((""ffoooo..ttxxtt"",, ""rr"")) cc == ffiillee..ggeett ## 実行時エラー((正: ggeettcc)) lleett ffiillee == ooppeenn__iinn ""ffoooo..ttxxtt"" iinn lleett cc == iinnppuutt__cchhrr ffiillee ((** コンパイルエ ラー((正: iinnppuutt__cchhaarr)) **))

Slide 79

Slide 79 text

静的型付けと型推論 言語 型宣言 静的型チェック CC 必要 有 RRuubbyy 不要 無 OOCCaammll 不要 有 ⇒不要な型宣言を書かずに本質に集中で き、その後コンパイラでチェックできる!

Slide 80

Slide 80 text

静的型付き関数型によくある機能 強い型付けと型推論 代数的データ型 パターンマッチ

Slide 81

Slide 81 text

静的型付き関数型によくある機能 強い型付けと型推論 代数的データ型 パターンマッチ

Slide 82

Slide 82 text

代数的データ型 型の直積の直和の総和(日本語でおkk?)) 直積 複数の値の組み合わせ CCの構造体とかOOOOのVVaalluueeOObbjjeeccttに相当? 直和 複数の値のどれか一つを選択 CCの共用体とかOOOOのCCoommppoossiitteeパターンに相 当?

Slide 83

Slide 83 text

11 RRuubbyyで木 ccllaassss BBrraanncchh aattttrr__aacccceessssoorr ::lleefftt,, ::vvaalluuee,, ::rriigghhtt ddeeff iinniittiiaalliizzee((lleefftt,, vvaalluuee,, rriigghhtt)) rraaiissee AArrgguummeennttEErrrroorr uunnlleessss [[BBrraanncchh,, IInntteeggeerr]]..aannyy??{{||tt|| lleefftt..iiss__aa??((tt))}} rraaiissee AArrgguummeennttEErrrroorr uunnlleessss vvaalluuee..iiss__aa??((IInntteeggeerr)) rraaiissee AArrgguummeennttEErrrroorr uunnlleessss [[BBrraanncchh,, IInntteeggeerr]]..aannyy??{{||tt|| rriigghhtt..iiss__aa??((tt))}} @@lleefftt == lleefftt @@vvaalluuee == vvaalluuee @@rriigghhtt == rriigghhtt eenndd eenndd ttrreeee == BBrraanncchh..nneeww((11,, 22,, BBrraanncchh..nneeww((33,,44,,55)))) 33 55 44 22 ※ルーズにやるなら、HHaasshhで済ませてしまうという手もあるが...... {{::lleefftt ==>> 11,, ::vvaalluuee ==>> 22,, ::rriigghhtt ==>> {{::lleefftt ==>> 33,, ::vvaalluuee ==>> 44,, ::rriigghhtt ==>> 55}}

Slide 84

Slide 84 text

代数的データ型で木 ttyyppee ttrreeee__tt == LLeeaaff ooff iinntt || BBrraanncchh ooff ttrreeee__tt ** iinntt ** ttrreeee__tt lleett ttrreeee == BBrraanncchh ((((LLeeaaff 11)),, 22,, ((BBrraanncchh ((((LLeeaaff 33)),, 44,, ((LLeeaaff 55)))))) RRuubbyyに慣れているとだいぶ戸惑いますが、型!=ク ラスです。 OOCCaammllでは型は小文字で表記します((CCやJJaavvaaの組 み込み型と同じ))。 OOCCaammllではコンストラクタが大文字で始まります。

Slide 85

Slide 85 text

代数的データ型で木 ttyyppee ttrreeee__tt == LLeeaaff ooff iinntt || BBrraanncchh ooff ttrreeee__tt ** iinntt **ttrreeee__tt 直積 直和 再帰もオッケー ⇒複雑なデータ構造もシンプルに書き表 せ、しかもコンパイラでチェックできる!

Slide 86

Slide 86 text

静的型付き関数型によくある機能 強い型付けと型推論 代数的データ型 パターンマッチ

Slide 87

Slide 87 text

静的型付き関数型によくある機能 強い型付けと型推論 代数的データ型 パターンマッチ

Slide 88

Slide 88 text

パターンマッチ 値だけではなく、値の構造まで比較して 分岐できる((RRuubbyyで言う所の))ccaassee式 構造にマッチさせ、マッチしたものに対 して何かの処理をするという意味では、 正規表現やXXPPaatthhを使っているときの感 覚に近い。正規表現やXXPPaatthhでやってい るようなことが、プログラミング言語の 中で扱っているあらゆるデータ構造に対 して行える。

Slide 89

Slide 89 text

RRuubbyyで再帰で配列の合計 ddeeff ssuumm((aarrrraayy)) ccaassee wwhheenn [[]];; 00 eellssee;; aarrrraayy..ffiirrsstt ++ ssuumm((aarrrraayy[[11....--11]])) eenndd eenndd ※RRuubbyyのccaassee式も相当高機能なので、関数型にそんなに負け てないですが......

Slide 90

Slide 90 text

OOCCaammllで再帰で配列の合計 lleett rreecc ssuumm__lliisstt == ffuunnccttiioonn [[]] -->> 00 || hheeaadd::::ttaaiill -->> hheeaadd ++ ((ssuumm__lliisstt ttaaiill))

Slide 91

Slide 91 text

パターンマッチによる束縛 || hheeaadd::::ttaaiill -->> hheeaadd ++ ((ssuumm__lliisstt ttaaiill)) マッチする構造 に名前をつけて...... こっちで使えるので読 みやすい

Slide 92

Slide 92 text

RRuubbyyだと...... eellssee;; aarrrraayy..ffiirrsstt ++ ssuumm((aarrrraayy[[11....--11]])) 読みにくい eellssee;; hheeaadd,, **ttaaiill == aarrrraayy hheeaadd ++ ssuumm((ttaaiill)) こういう方法もあるけど、 パターンマッチに比べると冗長 ※パターンマッチっぽいことを実現するライブラリもあるが、 無理矢理感は否めない hhttttpp::////ssaappppoorroo..rruubbyykkaaiiggii..oorrgg//22001122//jjaa//sscchheedduullee// ddeettaaiillss//1111..hhttmmll

Slide 93

Slide 93 text

パターンマッチによる網羅性チェック lleett rreecc ssuumm__lliisstt == ffuunnccttiioonn hheeaadd::::ttaaiill -->> hheeaadd ++ ((ssuumm__lliisstt ttaaiill)) WWaarrnniinngg 88:: tthhiiss ppaatttteerrnn--mmaattcchhiinngg iiss nnoott eexxhhaauussttiivvee.. HHeerree iiss aann eexxaammppllee ooff aa vvaalluuee tthhaatt iiss nnoott mmaattcchheedd:: [[]] 空の場合を忘れてるよー、と教えてくれる ((** ←要素が空の場合を考慮し忘れると...... **))

Slide 94

Slide 94 text

パターンマッチによる網羅性チェック22 lleett rreecc ssuumm__iinntt == ffuunnccttiioonn nn wwhheenn nn >> 00 -->> nn ++ ssuumm__iinntt ((nn -- 11)) || nn -->> 00 00からnnまでの合計を求める

Slide 95

Slide 95 text

パターンマッチによる網羅性チェック22 lleett rreecc ssuumm__iinntt == ffuunnccttiioonn nn wwhheenn nn >> 00 -->> nn ++ ssuumm__iinntt ((nn -- 11)) WWaarrnniinngg 2255:: bbaadd ssttyyllee,, aallll ccllaauusseess iinn tthhiiss ppaatttteerrnn--mmaattcchhiinngg aarree gguuaarrddeedd.. ((** ← || nn -->> 00 のケースを書き忘れると...... **)) 条件付きのケースしか記述されてないよー、 と警告してくれる 00からnnまでの合計を求める

Slide 96

Slide 96 text

パターンマッチによる網羅性チェック33 ttyyppee ''aa ooppttiioonn == NNoonnee || SSoommee ooff ''aa ※HHaasskkeellllで言うところのMMaayybbee lleett bbaarr == ffuunnccttiioonn SSoommee nn -->> pprriinntt__eennddlliinnee ((ssttrriinngg__ooff__iinntt nn)) || NNoonnee -->> pprriinntt__eennddlliinnee ""値なし""

Slide 97

Slide 97 text

パターンマッチによる網羅性チェック33 ttyyppee ''aa ooppttiioonn == NNoonnee || SSoommee ooff ''aa ※HHaasskkeellllで言うところのMMaayybbee lleett bbaarr == ffuunnccttiioonn SSoommee nn -->> pprriinntt__eennddlliinnee ((ssttrriinngg__ooff__iinntt nn)) ((** ← 値がない場合((NNoonnee))を書き忘れると、 同様に警告してくれる。)) ⇒NNUULLLLチェックを忘れることがない!! ※余談だがggcccc++eennuummでも警告してくれるらしい

Slide 98

Slide 98 text

Photograph by Rama, Wikimedia Commons, Cc-by-sa-2.0-fr クイックソートの開発者でもある 著名な計算機科学者 トニー・ホーア氏 NNUULLLLは 1100億ドル の失敗 hhttttpp::////qqccoonnlloonnddoonn..ccoomm//lloonnddoonn--22000099//pprreesseennttaattiioonn// NNuullll++RReeffeerreenncceess::++TThhee++BBiilllliioonn++DDoollllaarr++MMiissttaakkee

Slide 99

Slide 99 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 100

Slide 100 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 101

Slide 101 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 102

Slide 102 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 103

Slide 103 text

対話環境 関数型でも大抵使えます((もちろん言語に よりますが))

Slide 104

Slide 104 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 105

Slide 105 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 106

Slide 106 text

ダックタイピング ダックタイピングは何が嬉しいのか 継承関係にないオブジェクト群を共通に扱え る OOCCaammllは構造的部分型というのがあるの で、ダックタイピングできますがあまり 積極的には使わない気が...... lleett ffoooo oobbjj == oobbjj##xx;;;; vvaall ffoooo :: << xx :: ''aa;; .... >> -->> ''aa == <> ※xxというメソッドがあるオブジェクトなら 何でもいいよ、という型

Slide 107

Slide 107 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 108

Slide 108 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 109

Slide 109 text

11..mmoonntthh..aaggoo lleett ((||>>)) xx ff == ff xx 11 ||>> mmoonntthh ||>> aaggoo hhttttpp::////ttmmaaeeddaa..ss4455..xxrreeaa..ccoomm//ttdd//2200111111221199..hhttmmll##pp0011 関数を適用するだけの演算子((||>>))を定義でき る((UUNNIIXXのパイプみたいな感じ)) RRuubbyyは「全てがオブジェクト」という ルールを作ることで、11というただの数字 にも特別な機能をつけることができた 一方、関数型は関数の繋がり方をプログラ ミングした

Slide 110

Slide 110 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 111

Slide 111 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 112

Slide 112 text

oobbjj..mmeetthhooddss オブジェクトに問い合わせるような考え 方ではない インストールされているライブラリのイ ンターフェースファイルなどをパースし て、モジュール名やメソッド名の一覧を 生成する、というやり方になる

Slide 113

Slide 113 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 114

Slide 114 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 115

Slide 115 text

メタプログラミング 実行時にはできないので、コンパイル時 にコードやシンタックスツリーを自動生 成する(マクロ)ようなやり方になりま す。ccaammllpp44((OOCCaammll))とかTTeemmppllaattee HHaasskkeellll((HHaasskkeellll))とか。 sshhaarree [[mmkkPPeerrssiisstt ssqqllSSeettttiinnggss,, mmkkMMiiggrraattee ""mmiiggrraatteeAAllll""]] [[ppeerrssiisstt|| PPeerrssoonn nnaammee SSttrriinngg aaggee IInntt MMaayybbee ddeerriivviinngg SShhooww ]] HHaasskkeellllのYYeessooddの例

Slide 116

Slide 116 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 117

Slide 117 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 118

Slide 118 text

ddRRuubbyyみたいなの 他のプロセスの何らかのインターフェー スを叩くということは、大抵は事前にそ のインターフェースがわかっているは ず。 なので、大抵はプロトコルやスキーマな どをきっちり型で定義して通信するよう なやり方になる。 プロトコルを扱う関数を自動生成するマ クロみたいなのは作れるかも?

Slide 119

Slide 119 text

私が愛するRRuubbyyのアレは? 対話環境 ダックタイピング 11..mmoonntthh..aaggoo oobbjj..mmeetthhooddss..ggrreepp((//hhooggee//)) メタプログラミング((aattttrr__aacccceessssoorrと か)) ddRRuubbyyみたいなの

Slide 120

Slide 120 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 121

Slide 121 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 122

Slide 122 text

質問回答コーナー RRuubbyyの方が高速に処理できること? 実行速度という点で言えば、RRuubbyyに負けるこ とはほぼ無いと思います。 不得意なことという点で言えば、ソースコー ドを変更できる状況にないオブジェクトなり メソッドなりの挙動を変えるとか、実行した まま挙動を変えるとか((オープンクラス)) デバッグは? 他の言語と基本的には同じだと思います。 pprriinnttデバッグとかデバッガで値を確認したり とか。

Slide 123

Slide 123 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 124

Slide 124 text

今日のお話 関数型言語って何? 関数型で開発しているときの気持ち 静的型付き関数型によくある機能 RRuubbyyのアレは関数型でできるの? 質問回答コーナー おすすめの本とか言語とか

Slide 125

Slide 125 text

オススメの入�門書 OOCCaammllで プログラミングを 学ぶ本

Slide 126

Slide 126 text

オススメの入�門書 OOCCaammllを がっつり学ぶ本 ((電子書籍で買え るよ))

Slide 127

Slide 127 text

オススメの入�門書 HHaasskkeellllを 大変丁寧に学ぶ本

Slide 128

Slide 128 text

オススメの言語 HHaaxxee ---- 文法が馴染みやすく、今をときめ くJJaavvaaSSccrriippttの代わりとして使える OOCCaammll ---- モナドとか理解しなくても静的 型付き関数型の多くの恩恵を受けられる HHaasskkeellll ---- 文法が美�しい FF## ---- WWiinnddoowwssの資産が使える SSccaallaa ---- JJaavvaaの資産が使える SSMMLL## ---- CCとの親和性が高い。SSQQLLリテ ラルなどもある。

Slide 129

Slide 129 text

HHaaxxee33(へっくす) 強い静的型付け 型推論 パターンマッチ 代数的データ型 AAccttiioonnSSccrriippttっぽい文法 いろんな言語に変換できる nnuullllはあるけど、パターンマッチと代数的 データ型があるので、nnuullllを使わずにコー ドを書くことが可能

Slide 130

Slide 130 text

静的型付き関数型言語で もっと楽しましょう! 楽だ