SlideShare a Scribd company logo
ビッグウェーブ到来!?
- 関数プログラミング導入の要点 -
粕谷大輔 (@daiksy)
PHPカンファレンス関西2015
2015-05-30
https://www.flickr.com/photos/48337143@N00/2664619137
粕谷 大輔
id:daiksy / @daiksy
株式会社 はてな
PHPカンファレンス2015
PHP歴
- 以前勤めていた会社で
社内SNSを導入
- Open PNE
PHPカンファレンス2015
以下のキーワードを学ぶ
- 副作用のないプログラム
- 参照透過性
今日のお話
☓ 関数型言語
⃝ 関数プログラミング
関数型言語
関数が第一級の対象である言語
Haskell
OCaml
LISP
関数プログラミング
いくつかの成約を守れば、
関数型言語以外でも可能。
関数型言語を学べば、
その知見を
フィードバックできる
でも
関数プログラミングって
難しそう。。。
(ラムダ?? モナド?? 圏論??)
確かに奥が深い
でもそれは
関数プログラミングに
限らないのでは?
今や誰もが知ってる
オブジェクト指向プログラミング
『オブジェクト指向入門』
2冊で約1700ページ
この本を全部読まないと
オブジェクト指向の入門は
完了しない?
そんなことはなさそう
関数プログラミングは
身近に実用的に使われるように
なってきた
感覚として、LLを習得してる人
は関数型言語に取っ付きやすい
という印象
今日はその
入り口を学ぶためのお話
- 副作用のないプログラム
- 参照透過性
副作用とは
ある機能がコンピュータの(論理的な)状態を変
化させ、それ以降で得られる結果に影響を与
えること
(wikipedia [副作用(プログラム)])
代表的な副作用
- 変数を変更する
- オブジェクトのフィールドを
設定する
- データ構造を直接変更する
バグの原因の大半は副作用
- 変数に意図しない値が入って
いた
- オブジェクトが意図しない状
態になっていた
- DBに意図しない値が…
副作用のないプログラム
副作用の影響範囲を局所化する
副作用の無い関数は常に意図ど
おりの結果が帰ってくる
副作用のないプログラムとは?
-> 参照透過性が保たれている
参照透過性とは??
難しい説明をすると
“式が参照透過であるということ
は、式をその結果に置き換えるこ
とができる”
例) 参照透過である場合
scala) val x = “Hello, World”
x: String = Hello, World
scala) val r1 = x.reverse
r1: String = dlroW ,olleH
scala) val r2 = x.reverse
r2: String = dlroW ,olleH
r1とr2の結果は同じ
コードは‘Functional Programming in scala’ より引用
例) 参照透過である場合
scala) val r2 = x.reverse
r2: String = dlroW ,olleH
scala) val r1 = “Hello, World”.reverse
r1:String = dlroW ,olleH
scala) val r2 = “Hello, World”.reverse
r2:String = dlroW ,olleH
変数xを、その式の結果である”Hello, World” と置き換えても
r1とr2の結果は同じ
-> 変数xは参照透過である
例) 参照透過でない場合
scala) val x = new StringBuilder(“Hello”)
x: StringBuilder = Hello
scala) val y = x.append(“, World”)
x: StringBuilder = Hello, World
scala) val r1 = y.toString
r1: String = Hello, World
scala) val r2 = y.toString
r2: String = Hello, World
r1 と r2の結果はここまでは同じ
例) 参照透過でない場合
scala) val x = new StringBuilder(“Hello”)
x: StringBuilder = Hello
scala) val y = x.append(“, World”)
x: StringBuilder = Hello, World
最初の例と同様に、y を x.append(“, World”) に置き換えてみよう
例) 参照透過でない場合
scala) val x = new StringBuilder(“Hello”)
x: StringBuilder = Hello
scala) val y = x.append(“, World”)
x: StringBuilder = Hello, World
scala) val r1 = x.append(“, World”).toString
r1: String = Hello, World
例) 参照透過でない場合
scala) val x = new StringBuilder(“Hello”)
x: StringBuilder = Hello
scala) val y = x.append(“, World”)
x: StringBuilder = Hello, World
scala) val r1 = x.append(“, World”).toString
r1: String = Hello, World
scala) val r2 = x.append(“, World”).toString
r2: String = Hello, World, World
変数を式に置き換えたことで結果が変わった -> 変数 y は参照透過でない
引数を10倍にして返す関数
-> 5を渡したら50
-> 6を渡したら60
参照透過である関数
参照透過である関数
• 何度呼び出しても常に同じ結果
• プログラマは内部の状態に気を配らずに気
軽にいつでも呼び出せる
引数をn倍にして返す関数
-> 5を渡したら5n
-> 6を渡したら6n
nの状態によって結果が変わる
参照透過でない関数
参照透過でない関数
• 呼び出すときの内部の状態によって結果が
変わる
• 関数を呼び出すときにプログラマが常に内
部の状態に気を配る必要がある
関数プログラミングとは
- 関数を組み合わせて計算を行
う
- 関数の結果が参照透過だから
安全にプログラムが書ける
副作用のないプログラミングとは
- 関数をできるだけ参照透過に
保つようにする
購入(商品ID, 個数, クレジットカード) {
- 商品テーブルをread
- 金額 <- 個数 単価
- 課金処理(金額, クレジットカード)
}
購入(商品ID, 個数, クレジットカード) {
- 商品テーブルをread
- 金額 <- 個数 単価
- 課金処理(金額, クレジットカード)
}
商品取得(商品ID){
- 商品テーブルをread
}
購入(商品, 個数) {
- 金額 <- 個数 単価
- 課金オブジェクト作成(金額)
}
課金処理(課金オブジェクト, クレジットカード)
まとめ (関数プログラミングの入口)
- 副作用を局所化することでバ
グの混入の余地を少なくする
- なるべく参照透過な関数を作っ
て計算することをこころがけ
よう
ご清聴
ありがとうございました

More Related Content

What's hot (20)

PDF
PHP初心者に贈る、まちがえないPHPの始め方・学び方
Hiroyuki Sugimoto
 
PDF
.NET Micro Framework で IoT
Yoshitaka Seo
 
PDF
速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについて
Daisuke Tamada
 
PPTX
爆速フレームワークでREST APIを作った話
Shohei Tai
 
PDF
中の下のエンジニアを脱出するための仕事術
Noriaki Kadota
 
PPTX
FuelPHP × HHVM サービス開発事例
Yuji Otani
 
PDF
IoT、貯めるだけではもったいない
Yoshitaka Seo
 
PDF
ウェブパフォーマンスの基礎とこれから
Hiroshi Kawada
 
PPTX
最近誰かに「やったほうがいいよ」と伝えた7のこと
Noriaki Kadota
 
PPTX
PHP7ではなくHack/HHVMを選ぶ理由
Yuji Otani
 
PDF
Changing Infrastructure operation by DevOps And Agile Development
Taiji Tsuchiya
 
PPTX
Hack+FuelPHPによるWebサービス開発
Yuji Otani
 
PPTX
ドメイン駆動設計と サーバサイドと私
Noriaki Kadota
 
PDF
NetOps Coding#1 のお知らせ
Taiji Tsuchiya
 
PPTX
NoSQL勉強会資料(2015/03/12@ヒカラボ )
Yuji Otani
 
PDF
PHP7で変わること ——言語仕様とエンジンの改善ポイント
Yoshio Hanawa
 
PDF
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
Masahiro Nishimi
 
PDF
kintone devCamp 2015 ultra fast improvement
Takahiro Kubo
 
PDF
ブラウザのPerformance APIの話
Hiroshi Kawada
 
PPTX
Redis勉強会資料(2015/06 update)
Yuji Otani
 
PHP初心者に贈る、まちがえないPHPの始め方・学び方
Hiroyuki Sugimoto
 
.NET Micro Framework で IoT
Yoshitaka Seo
 
速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについて
Daisuke Tamada
 
爆速フレームワークでREST APIを作った話
Shohei Tai
 
中の下のエンジニアを脱出するための仕事術
Noriaki Kadota
 
FuelPHP × HHVM サービス開発事例
Yuji Otani
 
IoT、貯めるだけではもったいない
Yoshitaka Seo
 
ウェブパフォーマンスの基礎とこれから
Hiroshi Kawada
 
最近誰かに「やったほうがいいよ」と伝えた7のこと
Noriaki Kadota
 
PHP7ではなくHack/HHVMを選ぶ理由
Yuji Otani
 
Changing Infrastructure operation by DevOps And Agile Development
Taiji Tsuchiya
 
Hack+FuelPHPによるWebサービス開発
Yuji Otani
 
ドメイン駆動設計と サーバサイドと私
Noriaki Kadota
 
NetOps Coding#1 のお知らせ
Taiji Tsuchiya
 
NoSQL勉強会資料(2015/03/12@ヒカラボ )
Yuji Otani
 
PHP7で変わること ——言語仕様とエンジンの改善ポイント
Yoshio Hanawa
 
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
Masahiro Nishimi
 
kintone devCamp 2015 ultra fast improvement
Takahiro Kubo
 
ブラウザのPerformance APIの話
Hiroshi Kawada
 
Redis勉強会資料(2015/06 update)
Yuji Otani
 

Viewers also liked (20)

PDF
5分でわかる? 関数型 PHP の潮流
Yuya Takeyama
 
PPTX
PHPerにもCoderDojoのメンターとしてお手伝いしてほしい
Ippei Sumida
 
PDF
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
ichikaway
 
PDF
Wocker 秒速で WordPress 開発環境を構築する
Kite Koga
 
PPTX
PHPとフロントのイイ関係・動くスタイルガイドをつくろう
Yusuke Kawabata
 
PDF
PHP Codeception テスト -- 日本語
Florent Batard
 
PDF
PHPにないセキュリティ機能
Yasuo Ohgaki
 
PDF
20150531 phpcon kansai
kumamidori
 
PPTX
PHP x AWS でスケーラブルなシステムをつくろう
Taiji INOUE
 
PDF
PHP で始める AWS モバイルサービス - PHPカンファレンス_20150530
崇之 清水
 
PPTX
医薬品化学の世界
Hiroki Sato
 
PDF
計算力増強講座 vol.1 「2乗の計算」
Courslide
 
PDF
医療ビッグデータ勉強会 第2回 国立病院機構における診療情報分析について
Naomi Kawashima
 
PDF
RとSQLiteで気軽にデータベース作成
弘毅 露崎
 
KEY
Play勉強会 第3回
Daisuke Kasuya
 
PPTX
DPCデータ(E/Fファイル)分析ツールの紹介
Hiromasa Horiguchi
 
PPTX
Behat Driven Development
Ryo Tomidokoro
 
PDF
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Tomoki Hasegawa
 
PDF
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
ichikaway
 
PDF
PHPの今とこれから2015
Rui Hirokawa
 
5分でわかる? 関数型 PHP の潮流
Yuya Takeyama
 
PHPerにもCoderDojoのメンターとしてお手伝いしてほしい
Ippei Sumida
 
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
ichikaway
 
Wocker 秒速で WordPress 開発環境を構築する
Kite Koga
 
PHPとフロントのイイ関係・動くスタイルガイドをつくろう
Yusuke Kawabata
 
PHP Codeception テスト -- 日本語
Florent Batard
 
PHPにないセキュリティ機能
Yasuo Ohgaki
 
20150531 phpcon kansai
kumamidori
 
PHP x AWS でスケーラブルなシステムをつくろう
Taiji INOUE
 
PHP で始める AWS モバイルサービス - PHPカンファレンス_20150530
崇之 清水
 
医薬品化学の世界
Hiroki Sato
 
計算力増強講座 vol.1 「2乗の計算」
Courslide
 
医療ビッグデータ勉強会 第2回 国立病院機構における診療情報分析について
Naomi Kawashima
 
RとSQLiteで気軽にデータベース作成
弘毅 露崎
 
Play勉強会 第3回
Daisuke Kasuya
 
DPCデータ(E/Fファイル)分析ツールの紹介
Hiromasa Horiguchi
 
Behat Driven Development
Ryo Tomidokoro
 
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Tomoki Hasegawa
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
ichikaway
 
PHPの今とこれから2015
Rui Hirokawa
 
Ad

Similar to PHPカンファレンス2015 (20)

PDF
PFIセミナー 2013/02/28 「プログラミング言語の今」
Preferred Networks
 
PDF
いまどき(これから)のPHP開発
Kenjiro Kubota
 
PDF
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
Kohei Taniguchi
 
PDF
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
parrotstudio
 
PDF
【CodeCamp】PHP教科書サンプル
codecampJP
 
PPTX
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
Fujio Kojima
 
PDF
Nom de fonction français
hajikami
 
PDF
2019年9月15日 OSC広島 ドローンをプログラミングして飛ばす!ScratchとPHPでプログラミング授業
株式会社 オープンソース・ワークショップ
 
PDF
ドローンをプログラミングして飛ばす!Scratch、PHP、Python、映像のプログラミング授業
株式会社 オープンソース・ワークショップ
 
PDF
PHP-ML で手書き数字認識
y-uti
 
PDF
YAPC::Asia2015
Masaru Hoshino
 
PPTX
iii_SGMI #5 "OOP & Design Patterns"
Ryohei Suzuki
 
PDF
PHP Now and then 2018 : WordPress Special Edition
Rui Hirokawa
 
PDF
PHP カンファレンス福岡 2017 参加報告
y-uti
 
PDF
Mizuno buddypress-plugin
Ikuko Kanada
 
PDF
Mizuno buddypress-plugin
Fumito Mizuno
 
PDF
PHPでセキュリティを真面目に考える
Takuya Sato
 
PPTX
ど素人向け エンジニア勉強会
YukiIwasaki2764
 
PPTX
Tfug kansai vol1
Natsutani Minoru
 
PDF
PHPerのためのpostgresqlチューニングmini
Takhisa Hirokawa
 
PFIセミナー 2013/02/28 「プログラミング言語の今」
Preferred Networks
 
いまどき(これから)のPHP開発
Kenjiro Kubota
 
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
Kohei Taniguchi
 
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
parrotstudio
 
【CodeCamp】PHP教科書サンプル
codecampJP
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
Fujio Kojima
 
Nom de fonction français
hajikami
 
2019年9月15日 OSC広島 ドローンをプログラミングして飛ばす!ScratchとPHPでプログラミング授業
株式会社 オープンソース・ワークショップ
 
ドローンをプログラミングして飛ばす!Scratch、PHP、Python、映像のプログラミング授業
株式会社 オープンソース・ワークショップ
 
PHP-ML で手書き数字認識
y-uti
 
YAPC::Asia2015
Masaru Hoshino
 
iii_SGMI #5 "OOP & Design Patterns"
Ryohei Suzuki
 
PHP Now and then 2018 : WordPress Special Edition
Rui Hirokawa
 
PHP カンファレンス福岡 2017 参加報告
y-uti
 
Mizuno buddypress-plugin
Ikuko Kanada
 
Mizuno buddypress-plugin
Fumito Mizuno
 
PHPでセキュリティを真面目に考える
Takuya Sato
 
ど素人向け エンジニア勉強会
YukiIwasaki2764
 
Tfug kansai vol1
Natsutani Minoru
 
PHPerのためのpostgresqlチューニングmini
Takhisa Hirokawa
 
Ad

More from Daisuke Kasuya (20)

PDF
Devlove mackerel
Daisuke Kasuya
 
PDF
Overview of Scala ~ Hacker Tackle
Daisuke Kasuya
 
PDF
Api meetup LT
Daisuke Kasuya
 
PDF
中国地方Db勉強会
Daisuke Kasuya
 
PDF
トイレに閉じ込められた心情をMackerelで可視化してみる
Daisuke Kasuya
 
PDF
システムをダイナミックに運用する from DevLove関西
Daisuke Kasuya
 
PDF
ScalaMatsuri 2014 LT
Daisuke Kasuya
 
PDF
DevLOVE甲子園 西日本
Daisuke Kasuya
 
PDF
Scala関西ビギナーズ
Daisuke Kasuya
 
PDF
RxTStudy- git gitにされた俺の屍を越えて行け -
Daisuke Kasuya
 
PDF
こわくないScala
Daisuke Kasuya
 
PDF
デブサミ関西 自分戦略 2013
Daisuke Kasuya
 
PDF
Scala conf2013
Daisuke Kasuya
 
PDF
ペアプロ
Daisuke Kasuya
 
KEY
Dev love関西 forslideshare
Daisuke Kasuya
 
KEY
git gitにされたオレの屍を超えていけ
Daisuke Kasuya
 
KEY
Techreaders3
Daisuke Kasuya
 
KEY
鹿駆動勉強会ポスター2
Daisuke Kasuya
 
KEY
鹿駆動勉強会ポスター
Daisuke Kasuya
 
KEY
勉強会初心者向け勉強会 Study4bg
Daisuke Kasuya
 
Devlove mackerel
Daisuke Kasuya
 
Overview of Scala ~ Hacker Tackle
Daisuke Kasuya
 
Api meetup LT
Daisuke Kasuya
 
中国地方Db勉強会
Daisuke Kasuya
 
トイレに閉じ込められた心情をMackerelで可視化してみる
Daisuke Kasuya
 
システムをダイナミックに運用する from DevLove関西
Daisuke Kasuya
 
ScalaMatsuri 2014 LT
Daisuke Kasuya
 
DevLOVE甲子園 西日本
Daisuke Kasuya
 
Scala関西ビギナーズ
Daisuke Kasuya
 
RxTStudy- git gitにされた俺の屍を越えて行け -
Daisuke Kasuya
 
こわくないScala
Daisuke Kasuya
 
デブサミ関西 自分戦略 2013
Daisuke Kasuya
 
Scala conf2013
Daisuke Kasuya
 
ペアプロ
Daisuke Kasuya
 
Dev love関西 forslideshare
Daisuke Kasuya
 
git gitにされたオレの屍を超えていけ
Daisuke Kasuya
 
Techreaders3
Daisuke Kasuya
 
鹿駆動勉強会ポスター2
Daisuke Kasuya
 
鹿駆動勉強会ポスター
Daisuke Kasuya
 
勉強会初心者向け勉強会 Study4bg
Daisuke Kasuya
 

PHPカンファレンス2015