SlideShare a Scribd company logo
1 of 15
関数型プログラミングとモナドの
考え方
Masayuki Isobe
isobe@fivesolutions.jp
ファイブソリューションズ 社内勉強会 #4
計算とは何か?
・関数y=f(x)を適用すること。xからyを「計算」する。
f(x)x y
計算
・あらかじめ決められた規則に従って状態を変えること。
“123”“456”
“123456”
計算の手段
・表を用意して、「入力」と「出力あるいは結果」の
全パターンを用意する
入力 状態 出力(結果状態)
1 1 2
2 1 3
3 1 4
… … …
パターンの数が無限にあるので用意できない。
・そこで、「演算」を定義して、「演算」の合成によって
「計算」をくみ上げる。(※演算自体は有限の表で定義)
「計算」=「計画された(一連の)演算」
ここまでのまとめ & この先の議題
入力
演算 出力
状態
計算
・複数の演算をどう合成して関数にする?
・入力に対してどう関数を選ぶのか?
・状態とは何か?
関数
複数の演算をどう合成して関数にする?
⇨ 合成のパターンを用意しておく
演算
演算
演算
入力
???
出力
演算
演算
演算
入力
出力
合成
手段
合成
手段
合成手段の例
• 演算の合成
– y = f(x), z=g(y) ⇨ z = (f ○ g)(x)
• 繰り返し適用
– z = fold(3,f,x) ⇨ z = f(f(f(x)))
– z = map(f,[x,y,z]) ⇨ z = [f(x),f(y),f(z)]
• ちなみに分解手段もある(例:カリー化)
– z = f(x,y) ⇨ z = fc(x)(y)
⇨ 「演算」と「合成・分解手段(=高階関数)」
によって割と自由にプログラミングできる!
入力に対して関数を選ぶ方法
⇨ 多相型(ポリモーフィズム)
入力(x,y)
関数g(x,y) 演算h(x,y) 演算q(x,y)
f(x,y) ⇨ 選択機構
入力(x,y) 関数f(x,y)
fという関数の定義域を広げたい。それができると便利。
(汎用的な道具のほうが、特別なケースでしか使えない道具より便利。
ただし、汎用的なぶんパフォーマンスを犠牲にするので、工夫が必要。)
多相データ型 と 型クラス
・多相データ型: コンテナ型のようなもの。Enumのような定数値も含む。
単純な例) リスト a
aにはintとかfloatとかcharとか、あるいはリストのリストならば 「a = リスト b」となる。
再帰構造の例) 2分木ツリー a
aの型を要素に持つ2分木ツリーコンテナのようなもの。
雑多な例) くじ引き型 a b
aは当選商品のEnum型、bはハズレくじを集めて再チャンス応募の商品のEnum型
・型クラス: 通常のデータ型や多相データ型に対して、適用可能な関数を
保証する型
例) 合計を計算できる型クラス(CanTotal)というのを定義してみる
クラス CanTotal
定義:
関数 total(x) を持つこと
型クラスのインスタンスによるオーバーロード
入力(x)
リスト total(x,y) 二分木 total(x) 他 total(x)
total(x) ⇨ 選択機構
・型クラスのインスタンス: あるデータ型(基本型 or データ多相型)がその
型クラスが規定する関数の定義を持つこと
例1) リスト a 型はCanTotal型クラスのインスタンスであると定義できる。
定義: 引数xをリストa型のデータとしたとき、
total(x) = xに含まれるa型の要素を合計する
例2) 二分木a型はCanTotal型クラスのインスタンスであると定義できる。
定義: 引数xを二分木a型のデータとしたとき、
total(x) = xに含まれるa型の要素を合計する
⇨ これで、totalという関数は、上図のように選択機構がうまく働く。
(オーバーロード または アドホック多相 と呼ぶ)
状態とは何か?
・入力とは別に、関数の引数には現れない状態を扱いたい。
C++やPythonだったら、グローバル変数とか、クラスのメソッドならメンバ変数とかが
「状態」の例
・関数型プログラミング言語はHaskellのように「純粋関数型」とLispやMLやF#のように
そうでない言語があり、「純粋関数型」は「関数の引数には現れない状態」を許さない。
⇨ でも、Haskellでも「状態が関数の外にあるっぽい書き方」をしたい!
状態
入力 関数
暗黙入力 副作用
出力
この構造をどうバラせば、いいだろうか?
暗黙状態アクセスから明示適用部分を分離
3つにバラしてみる(一見ヘンだけど先人たちが色々考えた結果のベストプラクティス)
副作用の予約
メモ
関数
出力
状態からの
切り出し
入力
状態
①状態から「使うところ」
を切り出してくるロジック
③「副作用予約メモ」
を実際に状態に適用
するロジック
②切り出した状態を
入力に加えて明示的に
関数の入力に与え、
状態に作用させるための
情報を得る。
暗黙入力なし。
全て明示的。
出力も状態を経由して一本化
計算本体とバインド関数
前ページの要素を整理すると、さらに「②」と「①、③」にまとめられる
入力 関数
副作用の
予約メモ
②計算本体
①③状態切り出しと、副作用のフィードバック
副作用の予約
メモ状態からの
切り出し
状態
これを
bind(バインド)関数
と呼ぶ
型クラス「モナド」による「状態」と「バインド関数」の対応づけ
入力 関数
副作用の
予約メモ
状態
型を一致
させておく
その型に
Bind関数を
定義しておく
型クラス「モナド」の定義を、
関数「bind」を持つこと、とする
「状態」の型はモナド型クラスの
インスタンスとなる
これで、関数の「入力側」としてはあたかも状態が外部に存在せず
全ての情報が引数として渡され、「出力側」は入力データに関係する
状態更新部分だけ出力するように関数を定義することができ、状態全体
をケアする部分は全てbindに押し付けることができる。
(実演) GHC Preludeで
あとは各自で興味あればぜひ
ここまでコンセプトが分かればもう簡単

More Related Content

What's hot

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
ゲーム理論スライド02章
ゲーム理論スライド02章ゲーム理論スライド02章
ゲーム理論スライド02章
fumiwo
 
日本にJoy,Incを創る!どん底からスタートしたぼくらのジョイインクジャーニー7年間の軌跡
日本にJoy,Incを創る!どん底からスタートしたぼくらのジョイインクジャーニー7年間の軌跡日本にJoy,Incを創る!どん底からスタートしたぼくらのジョイインクジャーニー7年間の軌跡
日本にJoy,Incを創る!どん底からスタートしたぼくらのジョイインクジャーニー7年間の軌跡
忠弘 安田
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
kumake
 

What's hot (20)

色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
VRM 標準シェーダ MToon の使い方
VRM 標準シェーダ MToon の使い方VRM 標準シェーダ MToon の使い方
VRM 標準シェーダ MToon の使い方
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
ゲーム理論スライド02章
ゲーム理論スライド02章ゲーム理論スライド02章
ゲーム理論スライド02章
 
日本にJoy,Incを創る!どん底からスタートしたぼくらのジョイインクジャーニー7年間の軌跡
日本にJoy,Incを創る!どん底からスタートしたぼくらのジョイインクジャーニー7年間の軌跡日本にJoy,Incを創る!どん底からスタートしたぼくらのジョイインクジャーニー7年間の軌跡
日本にJoy,Incを創る!どん底からスタートしたぼくらのジョイインクジャーニー7年間の軌跡
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
 
Dll Injection
Dll InjectionDll Injection
Dll Injection
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計
 
GCSアジャイル開発を使ったゲームの作り方
 GCSアジャイル開発を使ったゲームの作り方 GCSアジャイル開発を使ったゲームの作り方
GCSアジャイル開発を使ったゲームの作り方
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Unityで意外と簡単・・・だけど難しいVRコンテンツ
Unityで意外と簡単・・・だけど難しいVRコンテンツUnityで意外と簡単・・・だけど難しいVRコンテンツ
Unityで意外と簡単・・・だけど難しいVRコンテンツ
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 
CEDEC2014 「ライブラリを作ってはいけない ~それでも作りたいあなたへのアドバイス~」
CEDEC2014 「ライブラリを作ってはいけない ~それでも作りたいあなたへのアドバイス~」CEDEC2014 「ライブラリを作ってはいけない ~それでも作りたいあなたへのアドバイス~」
CEDEC2014 「ライブラリを作ってはいけない ~それでも作りたいあなたへのアドバイス~」
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
プレゼン初心者にありがちなアンチパターン
プレゼン初心者にありがちなアンチパターンプレゼン初心者にありがちなアンチパターン
プレゼン初心者にありがちなアンチパターン
 
【Visual Studio】開発効率を上げる25個の拡張機能
【Visual Studio】開発効率を上げる25個の拡張機能【Visual Studio】開発効率を上げる25個の拡張機能
【Visual Studio】開発効率を上げる25個の拡張機能
 
No skk, no life.
No skk, no life.No skk, no life.
No skk, no life.
 

Similar to 関数型プログラミングとモナド

K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201
t2tarumi
 
LET2011: Rによる教育データ分析入門
LET2011: Rによる教育データ分析入門LET2011: Rによる教育データ分析入門
LET2011: Rによる教育データ分析入門
Yuichiro Kobayashi
 
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
nukaemon
 

Similar to 関数型プログラミングとモナド (16)

[xDNCL] 配布資料
[xDNCL] 配布資料[xDNCL] 配布資料
[xDNCL] 配布資料
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascript
 
第1回R勉強会@東京
第1回R勉強会@東京第1回R勉強会@東京
第1回R勉強会@東京
 
講座C入門
講座C入門講座C入門
講座C入門
 
LET2011: Rによる教育データ分析入門
LET2011: Rによる教育データ分析入門LET2011: Rによる教育データ分析入門
LET2011: Rによる教育データ分析入門
 
T77 episteme
T77 epistemeT77 episteme
T77 episteme
 
Lispでやる記号微分
Lispでやる記号微分Lispでやる記号微分
Lispでやる記号微分
 
Analyze by StatsModels or Numpy
Analyze by StatsModels or NumpyAnalyze by StatsModels or Numpy
Analyze by StatsModels or Numpy
 
cp-5. 繰り返し計算
cp-5. 繰り返し計算cp-5. 繰り返し計算
cp-5. 繰り返し計算
 
Programming Haskell Chapter 11 切符番号選び
Programming Haskell Chapter 11 切符番号選びProgramming Haskell Chapter 11 切符番号選び
Programming Haskell Chapter 11 切符番号選び
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
 
cp-7. 配列
cp-7. 配列cp-7. 配列
cp-7. 配列
 

More from Masayuki Isobe

オープンソースを用いたドローンの自律制御ソフトウェア技術
オープンソースを用いたドローンの自律制御ソフトウェア技術オープンソースを用いたドローンの自律制御ソフトウェア技術
オープンソースを用いたドローンの自律制御ソフトウェア技術
Masayuki Isobe
 
第二回機械学習アルゴリズム実装会 - LDA
第二回機械学習アルゴリズム実装会 - LDA第二回機械学習アルゴリズム実装会 - LDA
第二回機械学習アルゴリズム実装会 - LDA
Masayuki Isobe
 

More from Masayuki Isobe (20)

オープンソースを用いたドローンの自律制御ソフトウェア技術
オープンソースを用いたドローンの自律制御ソフトウェア技術オープンソースを用いたドローンの自律制御ソフトウェア技術
オープンソースを用いたドローンの自律制御ソフトウェア技術
 
ジャパンドローンセミナー
ジャパンドローンセミナージャパンドローンセミナー
ジャパンドローンセミナー
 
AIBOX DroneBrain 製品パンフレット
AIBOX DroneBrain 製品パンフレットAIBOX DroneBrain 製品パンフレット
AIBOX DroneBrain 製品パンフレット
 
ファイブソリューションズデベロッパーネットワーク
ファイブソリューションズデベロッパーネットワークファイブソリューションズデベロッパーネットワーク
ファイブソリューションズデベロッパーネットワーク
 
ドローン向けソフトウェア事業
ドローン向けソフトウェア事業ドローン向けソフトウェア事業
ドローン向けソフトウェア事業
 
RDF/OWLの概要及びOSS実装、及び活用イメージについて
RDF/OWLの概要及びOSS実装、及び活用イメージについてRDF/OWLの概要及びOSS実装、及び活用イメージについて
RDF/OWLの概要及びOSS実装、及び活用イメージについて
 
第三回機械学習アルゴリズム実装会イントロダクション
第三回機械学習アルゴリズム実装会イントロダクション第三回機械学習アルゴリズム実装会イントロダクション
第三回機械学習アルゴリズム実装会イントロダクション
 
CasperJSを使って任意のWebサイトを電子書籍化する方法
CasperJSを使って任意のWebサイトを電子書籍化する方法CasperJSを使って任意のWebサイトを電子書籍化する方法
CasperJSを使って任意のWebサイトを電子書籍化する方法
 
ScrapyとPhantomJSを用いたスクレイピングDSL
ScrapyとPhantomJSを用いたスクレイピングDSLScrapyとPhantomJSを用いたスクレイピングDSL
ScrapyとPhantomJSを用いたスクレイピングDSL
 
第二回機械学習アルゴリズム実装会 - LDA
第二回機械学習アルゴリズム実装会 - LDA第二回機械学習アルゴリズム実装会 - LDA
第二回機械学習アルゴリズム実装会 - LDA
 
ブランディング指標の数値化について
ブランディング指標の数値化についてブランディング指標の数値化について
ブランディング指標の数値化について
 
TEDxTitech 2013 speech material
TEDxTitech 2013 speech materialTEDxTitech 2013 speech material
TEDxTitech 2013 speech material
 
Rec sys2013 reading_isobe
Rec sys2013 reading_isobeRec sys2013 reading_isobe
Rec sys2013 reading_isobe
 
広告ナビゲータ・広告シミュレータ
広告ナビゲータ・広告シミュレータ広告ナビゲータ・広告シミュレータ
広告ナビゲータ・広告シミュレータ
 
rzmq
rzmqrzmq
rzmq
 
Uuyアドテクセミナー
UuyアドテクセミナーUuyアドテクセミナー
Uuyアドテクセミナー
 
第12回モヤLT発表資料
第12回モヤLT発表資料第12回モヤLT発表資料
第12回モヤLT発表資料
 
Tokyo.R 26 LT isobe
Tokyo.R 26 LT isobeTokyo.R 26 LT isobe
Tokyo.R 26 LT isobe
 
Tokyo r 25_lt_isobe
Tokyo r 25_lt_isobeTokyo r 25_lt_isobe
Tokyo r 25_lt_isobe
 
Tokyo.R #22 LT
Tokyo.R #22 LTTokyo.R #22 LT
Tokyo.R #22 LT
 

Recently uploaded

Recently uploaded (11)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

関数型プログラミングとモナド