先端技術 関数型プログラミング

21
「先端技術」 - 関数型プログラミング - nakasen_20th

Transcript of 先端技術 関数型プログラミング

Page 1: 先端技術 関数型プログラミング

「先端技術」 - 関数型プログラミング -

nakasen_20th

Page 2: 先端技術 関数型プログラミング

関数型プログラミング1. ひとことで言えば?

2. 生まれた背景

3. 概要

4. 周囲はどう見ているか - 好意的視点

5. 周囲はどう見ているか - 批判的視点

6. 今後はどうなる?

7. 星いくつ?

Page 3: 先端技術 関数型プログラミング

1. ひとことで言えば?

「関数の定義が数学に近いプログラミング手法」

Page 4: 先端技術 関数型プログラミング

2. 生まれた(見直された)背景

• 数式に近い記述の高級言語として(1958年)

• 近年のプロジェクト炎上多発(→再評価)

• JavaScriptの復権

Page 5: 先端技術 関数型プログラミング

3. 概要説明

• 数学の関数とプログラミング言語の関数

• 関数型プログラミング言語の特徴

• 関数型プログラミング言語の種類

• LISPの誕生→JavaScriptの復権→他言語へ影響

• プログラマにとっての試金石

Page 6: 先端技術 関数型プログラミング

数学の関数とプログラミング言語の関数

• 数学の関数

✴ 入力が同じであれば、出力も常に同じ値になるもの

• プログラミング言語の関数

✴ 関数内部の状態やシステム全体の状態によって 得られる出力が変わってしまう

• 「副作用がある」ということ

✴ 変数への代入や入出力によって状態が変化するということ

Page 7: 先端技術 関数型プログラミング

関数型プログラミング言語の特徴

• 基本的に副作用がない

• 関数がファーストクラスオブジェクト

• 静的型付け言語は型推論機能を持つ

• クロージャ、遅延評価、カリー化、部分適用等

• バグが減りソースコードがスッキリする

Page 8: 先端技術 関数型プログラミング

関数型プログラミング言語の特徴• 正の整数だけの合計値を求める関数(Javaの場合) int sum(int[] array) { int ret = 0; for (int i : array) { if (i > 0) { ret = ret + i; } } return ret;}

Page 9: 先端技術 関数型プログラミング

関数型プログラミング言語の特徴• 正の整数だけの合計値を求める関数(Haskellの場合) sum = f where f [] = 0 f (it : its) | it > 0 = it + f its | otherwise = f its

Page 10: 先端技術 関数型プログラミング

関数型プログラミング言語の種類

• 純粋関数型言語(副作用を許さない)

• 静的型付け

• Haskell

• Miranda

Page 11: 先端技術 関数型プログラミング

関数型プログラミング言語の種類• 非純粋関数型言語(副作用を許す)

• 静的型付け

• ML

• OCaml

• Scala

• 動的型付け

• Erlang

• LISP

• Scheme(LISPの方言)

Page 12: 先端技術 関数型プログラミング

LISPの誕生

• 2番めに古いプログラミング言語(1958年)

• S式とカッコの多さ

• 実装しやすく多くの方言

• マニア向け言語としての歴史

Page 13: 先端技術 関数型プログラミング

JavaScriptの復権

• Webブラウザに動的変化を与えるための言語として華々しくデビュー

• ブラウザ側の独自実装乱発で滅亡の危機

• 実は関数がファーストクラスオブジェクト!

• Googleエンジニアのハートを射抜く?→ Ajaxを利用したプロダクツのヒット

Page 14: 先端技術 関数型プログラミング

JavaScriptの復権

• JavaScriptは関数型プログラミングのとっかかりに最適(すぐ試せる)

• JavaScriptで関数型っぽく書いてみよう http://qiita.com/takeharu/items/cf98d352ff574c5ac536

• いい思いをしたプログラマがJavaScriptを滅亡の危機から救った

Page 15: 先端技術 関数型プログラミング

他言語への影響

• 既存言語でのプロジェクトで炎上頻発!

• 関数型いいんじゃね? ソースコードきれい!

• ラムダ式、クロージャーの導入 (Javaもついに)

• 型推論、遅延評価等の導入

• 最近はどの言語も関数型の機能を持っている

Page 16: 先端技術 関数型プログラミング

プログラマにとっての試金石

• 新しいパラダイムを一から勉強し直し?

• オブジェクト指向をやっと理解したのに・・・

• 設計は? フレームワークは? 運用は?

• 文献は英語ばっかり

Page 17: 先端技術 関数型プログラミング

プログラマにとっての試金石• 上からの圧力

✴ レガシーの面倒見るのはもうコリゴリ

✴ 今後新規プロジェクトはPHP禁止、ScalaはO.K.(某CA社?)

✴ Haskellプロジェクトで良い人材集めよう!

• 下からの突き上げ

✴ 若いプログラマが「新技術でやりましょう!」

Page 18: 先端技術 関数型プログラミング

4.周囲はどう見ているか(好意的視点)

• バグが減る!

• ソースコードがすっきりする!

• 並列処理が書きやすい!

Page 19: 先端技術 関数型プログラミング

• 学習コスト高過ぎ

• 業務処理は無理、マニアのためのもの

• プログラマの単価を上げるためのバズワード

5.周囲はどう見ているか(批判的視点)

Page 20: 先端技術 関数型プログラミング

6. 今後はどうなる?

• オブジェクト指向との親和性アップ

• 「はじめての言語が関数型」世代の出現(関数型ネイティブ)

• 大手デベロッパのScalaプロジェクト増加

Page 21: 先端技術 関数型プログラミング

7. 星いくつ?

• トンガリ度    ★☆☆☆☆

• 絶対流行る    ★★★★★

• お金の匂い    ★★★★☆

• 敷居の低さ    ★★★★☆

• 総合おススメ度  ★★★★★