Haskell勉強会

関数型プログラミングの学習日記

関数と手続きの違い

関数型プログラミングの資料で、とても分かりやすい説明がありました。

 

f:id:hamamuratakuo:20190928084710p:plain

 

・2019/06 関数プログラミングことはじめ 2019年度版

http://www.mew.org/~kazu/material/2019-fp.pdf

 

これの旧版である

・2015/11 関数プログラミングことはじめ

http://www.mew.org/~kazu/material/2015-fp.pdf

の方が説明が簡潔だったような気もします。

(新版では、より厳密な定義、説明に差し替わっている?)

 

手続き=関数+副作用

なるほど!と思った部分をメモ。

 

#4 関数プログラミングとは数学でいう「関数」を使ってプログラミングすることです。

 

#5 「数学の関数」とは何ですか?

 

#6 引数から値を計算して返す箱です。f(x)=x+1

 

#7 数学の関数は、引数が同じであれば必ず同じ値を返します。

 

#10 「C言語の関数」は「数学の関数」よりたくさんのことができてしまいます。

 

#11 この講義では、数学の関数よりたくさんのことができる箱のことを「手続き」と呼びます。

 

※英語で書けば、関数は「function」で、手続きは「procedure」でしょう。

検索したら「プロシージャ―」の日本語訳は「手順」という意味もありました。

 

#14 手続きを使ったプログラミングのことを「命令プログラミング」と呼びます。

 

#15 ここまでのまとめ

関数プログラミング=数学の関数を使ったプログラミング

命令プログラミング=手続きを使ったプログラミング

 

#17 「手続き」は機能を制限して利用すれば「関数」としても使えます。

 

#25 関数の「作用」(仕事)は値を返すことです。

 

#26 値を返すこと以外の仕事は「副作用」と呼ばれます。

 

#27 この講義では副作用を持つ箱を手続きと呼んでいます。

 

#28 副作用にはどんなものがありますか?

 

#29 ディスプレイへの出力、ネットワークへの入出力、グローバル変数の書き換えなどが副作用の例です。

 

#50 命令プログラミングでは複数の文を列挙します。

 

#51 関数プログラミングでは文ではなく「式」を使ってプログラムを構成します。

 

#53 これまでのまとめ

関数プログラミングとは式でプログラムを書くことです。

命令プログラミングとは文でプログラムを書くことです。

 

※「文」と「式」の違いは、評価して値を返すのが式でしょうか。

(参考)

ichitcltk.hustle.ne.jp

文と式の最大の違いは、値を返すのが式で、返さないのが文。

 

#57 関数プログラミングとは不変データプログラミングのことです。

 

#65 関数プログラミングだけではゲームは作れません。通常、関数プログラミングは命令プログラミングと組みあわせて使います。

 

※「通常」という言い方をしているということは、「例外」もあるってことですね?

関数プログラミングだけで完結させるには、I/Oモナドなどの仕組みを使うことになりますね?

 

#66 具体的には関数プログラミングで書いた関数は命令プログラミングの手続きから呼び出して使います。

 

関数プログラミングでも命令プログラミングのような記述ができます。Haskellならdo記法とかでしょう。

 

#112 関数プログラミングとはパイププログラミングのようなプログラミングのことです。

 

#114 UNIXの哲学

"Do one thing and do it well"

パイプの作者 Doug Mcllroy

 

UNIX哲学は有名ですね。

(参考) 

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

 

 

#115 関数プログラミングでは、一つのことをうまくやれるように関数を作ります。

 

#116 関数プログラミングではバグがないと確信できる関数を組み合わせて新しい関数を作ります。

 

#117 関数プログラミングとは部品プログラミングです。

 

以上、気になった部分をメモ。

関数と手続きの違いを意識すると、関数プログラミングの特徴が浮き彫りになると思いました。

 

資料の紹介記事

この資料にたどり着いたのは、Qiitaの記事からでした。

 

qiita.com

 

Qiitaの記事のコメント欄で、参考文献が紹介されていました。

 

https://qiita.com/hiruberuto/items/26a813ab2b188ca39019#comment-aa8014e9c4d81d01903f

 

@osiire
2015-01-06 22:35
面白いと思います。ただ、参考文献が少ないようなので、ちょっと追加しておきます。

関数プログラミング実践入門 ──簡潔で、正しいコードを書くために”
最近の素晴らしい本。
http://www.amazon.co.jp/dp/4774169269

"関数プログラミング" R. バード (著), P. ワドラー (著), 武市 正人 (翻訳)
古典。
http://www.amazon.co.jp/dp/4764901811

山本さんの記事。
最初の人は「関数プログラミングが教えてくれる規律」とかいいかも。
http://www.mew.org/~kazu/material/

"関数型プログラミングの今昔(仮)"
http://www.slideshare.net/ksknac/120901fp-key

"函数プログラミングのエッセンスと考え方"
http://www.slideshare.net/osiire/ss-43240712

"関数型の考え方: 関数型プログラミングの人気が高まっている理由"
http://www.ibm.com/developerworks/jp/java/library/j-ft20/

"数理科学的バグ撲滅方法論のすすめ"
http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/

"仕事で使うF#"
http://www.slideshare.net/bleistift/f-9062112?related=2

"OCaml for the Masses"
http://queue.acm.org/detail.cfm?id=2038036

"Rubyを使って「なぜ関数プログラミングは重要か」を読み解く(改定)─ 前編 ─ 但し後編の予定なし"
http://melborne.github.io/2013/01/21/why-fp-with-ruby/

 

コメントで紹介されていた山本さんの記事を拝見してみました。

 

www.mew.org

 

・2013/01 関数プログラミングが教えてくれる規律(関数プログラミングの波に乗り遅れるな、CROSS 2013)

http://www.mew.org/~kazu/material/2013-cross.pdf

 

こちらも参考になりますね。

 

分かりやすい資料を読めてラッキー!!!

 

(有益な情報提供、どうもありがとうございます。)

 

twitter.com

 

twitter.com

 

プログラミングHaskell 第2版

プログラミングHaskell 第2版