SlideShare a Scribd company logo
1 of 37
Download to read offline
オブジェクト指向プログラマ
が今関数型言語を学ばないと
いけない理由
`
谷口耕平 @ran_tan
ハウインターナショナル
で働いてます
九工大 知能情報工学科卒
自己紹介
現在
2010.03
小出研、工大祭実行委員、SE塾
毎週木曜日 ココで
開催中!!
普段書いている言語
• Ruby
• Javascript, CoffeeScript
• Swift, Objective-C
• Java
関数型言語は全く
書いていません。。。
今日はOOPプログラマを自認する私が、な
ぜ関数型言語を勉強したいのかを話します
関数型言語が流行ってる?
Githubのリポジトリ数
Githubのリポジトリ数
Githubのリポジトリ数
関数型流行ってる?
Google Trends
を見れば流行っているのがわかるはず!
X軸と同化した、、
もしかして
流行ってない?
数年前,Dave Thomas氏に会ったときに「Ruby
の次のLotYに何を選んだのか」と聞いてみたと
ころ「Haskellを試そうとした。でも,次に考え
てるのは日本語だよ」と笑顔で答えてくれました。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070618/275142/
総論 複数のプログラミング言語を学ぶ意義
Dave Thomasも
Haskellに注目している!
(かなり昔の記事だけど、、)
「Haskellを学ぶ事は、TDDを細かく分析し、それへ
回帰する事を強いる。原則は私が懸念していたよりも
根元的なものだった。」 適当和訳
よくわからんけどHaskellや
るとTDDも深まるらしい
関数型言語流行の背景
ムーアの法則の限界
• クロック数の頭打ち
• それによるマルチコア化の流れ
• 並行プログラミングへの需要
• OOP言語での並行処理の書きにくさ
• 関数型言語の参照透過性という性質への注目
とかが世の中でよく言われている
Erlangへの注目
• Prologのような宣言的な構文で記述
• スレッド間でメモリを共有しないスレッドモデル
• 並行処理を前提に設計されている
Scalaの登場
• JVM上で動作
• オブジェクト指向と関数型のマルチパラダイム
• Erlangと同じくメモリを共有しないアクターモデル
という並行処理の仕組みがある
数学に支えられた構文の美しさ
• 小出先生「Lispは神言語」
• ぼくにはまだよくわかりません!
OOP言語の中の関数型
Javascript
• クロージャ
• 高階関数
• カリー化
• 普通にJSの本に出てくる。むしろこれらを使わな
いとコード書けない。
Ruby
• ブロック構文 ← 高階関数が簡単に書ける
• lambdaある
• mapとかreduceとか関数型由来のメソッドを多用
するのが当たり前
Java
• lambdaが入った
関数型言語を使わなくても恩恵
を受けている
OOP言語を捨てて関数型へ
は行かない
もはやOOPは手放せない
• 複雑な現実をコードで表現するには、事象を「オブ
ジェクト」という抽象化された概念の相互作用とし
てモデリングするアプローチは、非常に協力な武器
• 我々は現実と戦わなければならないのです!
• でしょ?OOPの皆さん?
関数型パラダイムを学ぶことでOOP言語でよ
り良いコードが書けるようになる、、はず!
• OOP言語の中の関数型要素を活用できる!
• 参照透過性→副作用が無い→メソッドをシンプルに
• と言いつつ正直まだよくわかりません、皆さんの意
見を教えて下さい。
OOPと関数型両方を生かすス
タイルが模索されている
• Scalaのアクターモデル
• イミュータブルな変数(というか定数)の多用。
• オブジェクト自体をイミュータブルにするアプロー
チもあるぽい。(試してないけど)
• 副作用のある操作と無い操作を分離する設計も可能?
まとめ
• 関数型の流れがきている(結構前から)
• OOP言語にも関数型のパラダイムが入ってきている
• OOPと関数型両方のメリッドを生かすスタイルが
模索されいている
• 俺たちOOP戦士の戦いはまだこれからだ!

More Related Content

What's hot

iii_SGMI #5 "OOP & Design Patterns"
iii_SGMI #5 "OOP & Design Patterns"iii_SGMI #5 "OOP & Design Patterns"
iii_SGMI #5 "OOP & Design Patterns"Ryohei Suzuki
 
プロ生Lt20130622
プロ生Lt20130622プロ生Lt20130622
プロ生Lt20130622erthejp
 
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b77web
 
解り方と教え方
解り方と教え方解り方と教え方
解り方と教え方健人 井関
 
Rubyist started to learn Groovy - things important to leran new LL
Rubyist started to learn Groovy - things important to leran new LLRubyist started to learn Groovy - things important to leran new LL
Rubyist started to learn Groovy - things important to leran new LLUchio Kondo
 
俺とコミュニティ活動のタスク
俺とコミュニティ活動のタスク俺とコミュニティ活動のタスク
俺とコミュニティ活動のタスクMasayuki KaToH
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyazuma satoshi
 
Requestsで始める5分前帰社
Requestsで始める5分前帰社Requestsで始める5分前帰社
Requestsで始める5分前帰社Satoshi Yamada
 
Alluren of prototype-based OOP
Alluren of prototype-based OOPAlluren of prototype-based OOP
Alluren of prototype-based OOPazuma satoshi
 
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみたTensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみたVan Huy
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルSatoshi Yamada
 
もっとドキュメントが日本語になりますように
もっとドキュメントが日本語になりますようにもっとドキュメントが日本語になりますように
もっとドキュメントが日本語になりますようにTakako Miyagawa
 
Chrome拡張で改善 表紙
Chrome拡張で改善 表紙Chrome拡張で改善 表紙
Chrome拡張で改善 表紙Wataru Terada
 
楽しいプログラミング
楽しいプログラミング楽しいプログラミング
楽しいプログラミング明洋 庄司
 
Sinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPythonSinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPythonkuroneko1988
 

What's hot (20)

iii_SGMI #5 "OOP & Design Patterns"
iii_SGMI #5 "OOP & Design Patterns"iii_SGMI #5 "OOP & Design Patterns"
iii_SGMI #5 "OOP & Design Patterns"
 
プロ生Lt20130622
プロ生Lt20130622プロ生Lt20130622
プロ生Lt20130622
 
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
 
解り方と教え方
解り方と教え方解り方と教え方
解り方と教え方
 
Rubyist started to learn Groovy - things important to leran new LL
Rubyist started to learn Groovy - things important to leran new LLRubyist started to learn Groovy - things important to leran new LL
Rubyist started to learn Groovy - things important to leran new LL
 
無名関数のすすめ
無名関数のすすめ無名関数のすすめ
無名関数のすすめ
 
TalknoteとGolang
TalknoteとGolangTalknoteとGolang
TalknoteとGolang
 
俺とコミュニティ活動のタスク
俺とコミュニティ活動のタスク俺とコミュニティ活動のタスク
俺とコミュニティ活動のタスク
 
Trunk0125資料
Trunk0125資料Trunk0125資料
Trunk0125資料
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobody
 
Kotlin as an AltJS
Kotlin as an AltJSKotlin as an AltJS
Kotlin as an AltJS
 
Requestsで始める5分前帰社
Requestsで始める5分前帰社Requestsで始める5分前帰社
Requestsで始める5分前帰社
 
Alluren of prototype-based OOP
Alluren of prototype-based OOPAlluren of prototype-based OOP
Alluren of prototype-based OOP
 
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみたTensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
 
Cap01
Cap01Cap01
Cap01
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
 
もっとドキュメントが日本語になりますように
もっとドキュメントが日本語になりますようにもっとドキュメントが日本語になりますように
もっとドキュメントが日本語になりますように
 
Chrome拡張で改善 表紙
Chrome拡張で改善 表紙Chrome拡張で改善 表紙
Chrome拡張で改善 表紙
 
楽しいプログラミング
楽しいプログラミング楽しいプログラミング
楽しいプログラミング
 
Sinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPythonSinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPython
 

Similar to オブジェクト指向プログラマが今関数型言語を学ばないといけない理由

複数人でSwift開発を行うには
複数人でSwift開発を行うには複数人でSwift開発を行うには
複数人でSwift開発を行うにはYuya Fujiwara
 
Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Ouka Yuka
 
Go で Unit Test をやってみた
Go で Unit Test をやってみたGo で Unit Test をやってみた
Go で Unit Test をやってみたMasahiro Yanou
 
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方Roy Kim
 
PHPカンファレンス2015
PHPカンファレンス2015PHPカンファレンス2015
PHPカンファレンス2015Daisuke Kasuya
 
概観テキストマイニング
概観テキストマイニング概観テキストマイニング
概観テキストマイニングtod esking
 
React+fluxを導入した話
React+fluxを導入した話React+fluxを導入した話
React+fluxを導入した話Yuki Ishikawa
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Tokoroten Nakayama
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Drecom Co., Ltd.
 
Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた:
Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた: Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた:
Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた: Yutaka Kachi
 
Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Tsutomu Yano
 
Swiftのクロージャー
SwiftのクロージャーSwiftのクロージャー
SwiftのクロージャーSatoTakeshi
 
プログラミング同好会とすごい合同勉強会
プログラミング同好会とすごい合同勉強会プログラミング同好会とすごい合同勉強会
プログラミング同好会とすごい合同勉強会nemumu
 
[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来Masahiro Nishimi
 
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数Satoru Kodaira
 
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生Satoru Kodaira
 
three.jsによる一歩進めたグラフィカルな表現
three.jsによる一歩進めたグラフィカルな表現three.jsによる一歩進めたグラフィカルな表現
three.jsによる一歩進めたグラフィカルな表現Kei Yagi
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Tomoki Hasegawa
 
JavaScriptと関数型言語
JavaScriptと関数型言語JavaScriptと関数型言語
JavaScriptと関数型言語Hideaki Miyake
 

Similar to オブジェクト指向プログラマが今関数型言語を学ばないといけない理由 (20)

複数人でSwift開発を行うには
複数人でSwift開発を行うには複数人でSwift開発を行うには
複数人でSwift開発を行うには
 
Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!
 
Go で Unit Test をやってみた
Go で Unit Test をやってみたGo で Unit Test をやってみた
Go で Unit Test をやってみた
 
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
 
PHPカンファレンス2015
PHPカンファレンス2015PHPカンファレンス2015
PHPカンファレンス2015
 
LT#6 Taskete
LT#6 TasketeLT#6 Taskete
LT#6 Taskete
 
概観テキストマイニング
概観テキストマイニング概観テキストマイニング
概観テキストマイニング
 
React+fluxを導入した話
React+fluxを導入した話React+fluxを導入した話
React+fluxを導入した話
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
 
Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた:
Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた: Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた:
Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた:
 
Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発
 
Swiftのクロージャー
SwiftのクロージャーSwiftのクロージャー
Swiftのクロージャー
 
プログラミング同好会とすごい合同勉強会
プログラミング同好会とすごい合同勉強会プログラミング同好会とすごい合同勉強会
プログラミング同好会とすごい合同勉強会
 
[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来
 
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
 
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
 
three.jsによる一歩進めたグラフィカルな表現
three.jsによる一歩進めたグラフィカルな表現three.jsによる一歩進めたグラフィカルな表現
three.jsによる一歩進めたグラフィカルな表現
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
 
JavaScriptと関数型言語
JavaScriptと関数型言語JavaScriptと関数型言語
JavaScriptと関数型言語
 

オブジェクト指向プログラマが今関数型言語を学ばないといけない理由