吉田/覚書/関数プログラミング
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[吉田>吉田]]/[[覚書>吉田/覚書]]
輪講にあたり。
#contents
*関数プログラミング [#qd63313b]
**関数プログラミングって、なんぞや? [#v1a2b199]
-関数だけで全体が構成されているプログラム。
-身も蓋も無いっちゃ無いですね。
-こう聞くとカプセル化の極が関数プログラミングなのかとか思う。
-なんか、''代入文とかが無くて''、関数は''計算以外の副作用を持たない''ので、~
''制御フローを気にする必要がなく式をいつ評価してもいい''、らしい。
--上から順の逐次実行型言語とは違いますネ。
-なんか無い無い尽くしだが、普通の数式を解く感覚で記述していけると言うことカネ。
**・・・で? [#tde6319a]
-ちょっと書いたが構造化プログラミングのモジュールを使った設計に近いモノがあるよね。
--モジュールは入力から出力が一意に決まる、条件反射の装置と言えばいいか。
-でもモジュール(部品)化するには問題をバラす行程があり、各部品で処理が終わった後には当然くっつける必要がある。
-どうくっつけるかはどう分解したかにより、これをぅやぅや考えるのが構造化プログラミングの面倒なところである。
-それでですね、
***関数プログラミングにおけるモジュールのくっつけかた その1 [#dd4d8961]
-関数プログラミングは「関数しか使わない言語」ってことで、「A(B(C(D(input))))」的に関数を並べたり入れ子状にしたりで記述できる。
--ここで、「A」のための関数、「Aのための関数」のための関数、とかがうなうな続いたりする。
-その果ての「ネジ一本」な部品は初めから用意されていたり自分で作ったりする。
-そしてその「ネジ」をどこかに取り付けるより先に「ナット」や「釘」や「ネジ釘」を作る事を考える。
-もしくは針金を作ったとして、そのままでは強度が必要なときはひたすらグルグル巻いて補強するしかないが、束ねて強度を上げたモノを作っておけば巻く労力も少なく見栄えもいいだろう、と。
-これは「X*(X-1)*(X-2)・・・」というXの階乗を「X!」で表せば楽チンじゃね?という考えである。だよね。
-要は、例えばINT型が与えられたとき、''その型に対して行うだろうあらゆる要求の処理機構を先の「積み上げ」によって「部品(関数)」として細かく用意しておける''、ということ。
--こうして組み上げた関数を''「高階関数」''とか言う。
-
***関数プログラミングにおけるモジュールのくっつけかた その2 [#ub329e5a]
-関数プログラミングは全部関数を使ってプログラムを作るんでしょう?
-だったら出来たプログラムも関数みたいなものじゃない!
-それを部品に新たなプログラムを積み上げればいいんだわ!
-・・・
-関数の場合でもそうだがプログラムA,Bと入力inputがあったとして A(B(input)) と書けば、大抵は「Bが引数inputにより何らかの出力をし、それを引数としてAが動作する」
-つまり B(input) を完全に評価してから、その結果を A の引数として全体の解をだすワケだ。
-だもんで B(input) の評価結果が「自然数のリストを用意する」だったりすると1〜∞の要素を用意しなければならない。
--つまり無理。
-これを「B(input) の評価をひとまず保留し、A の評価に必要な分だけを後から評価する」事を考える。
--無限を扱う数式とかは大体そうするよね。
-この、Bを必要量しか評価しない(出来るだけサボらせよう)というやり方を''「遅延(怠惰)評価」''とか言う。
-(必要な処理しかしないって事はその処理に必要なデータしかメモリに置かなくていいって事でもあるっぽい)
~
**・・・・・・で? [#qee5859b]
-つまりは、~
''&size(18){手持ちの道具を元手に新しい道具をガリガリ作っていって、実行記述は&br;最新の道具(関数)一個で済まそうとかいうスワンな言語概念};''である。
-・・・だよな?
~
~
***参考 [#y2cb9199]
-http://hp.vector.co.jp/authors/VA028375/haskell/log.html
--のリンクとか。
-
~
_______________________________________________________________________________________
#comment
終了行:
[[吉田>吉田]]/[[覚書>吉田/覚書]]
輪講にあたり。
#contents
*関数プログラミング [#qd63313b]
**関数プログラミングって、なんぞや? [#v1a2b199]
-関数だけで全体が構成されているプログラム。
-身も蓋も無いっちゃ無いですね。
-こう聞くとカプセル化の極が関数プログラミングなのかとか思う。
-なんか、''代入文とかが無くて''、関数は''計算以外の副作用を持たない''ので、~
''制御フローを気にする必要がなく式をいつ評価してもいい''、らしい。
--上から順の逐次実行型言語とは違いますネ。
-なんか無い無い尽くしだが、普通の数式を解く感覚で記述していけると言うことカネ。
**・・・で? [#tde6319a]
-ちょっと書いたが構造化プログラミングのモジュールを使った設計に近いモノがあるよね。
--モジュールは入力から出力が一意に決まる、条件反射の装置と言えばいいか。
-でもモジュール(部品)化するには問題をバラす行程があり、各部品で処理が終わった後には当然くっつける必要がある。
-どうくっつけるかはどう分解したかにより、これをぅやぅや考えるのが構造化プログラミングの面倒なところである。
-それでですね、
***関数プログラミングにおけるモジュールのくっつけかた その1 [#dd4d8961]
-関数プログラミングは「関数しか使わない言語」ってことで、「A(B(C(D(input))))」的に関数を並べたり入れ子状にしたりで記述できる。
--ここで、「A」のための関数、「Aのための関数」のための関数、とかがうなうな続いたりする。
-その果ての「ネジ一本」な部品は初めから用意されていたり自分で作ったりする。
-そしてその「ネジ」をどこかに取り付けるより先に「ナット」や「釘」や「ネジ釘」を作る事を考える。
-もしくは針金を作ったとして、そのままでは強度が必要なときはひたすらグルグル巻いて補強するしかないが、束ねて強度を上げたモノを作っておけば巻く労力も少なく見栄えもいいだろう、と。
-これは「X*(X-1)*(X-2)・・・」というXの階乗を「X!」で表せば楽チンじゃね?という考えである。だよね。
-要は、例えばINT型が与えられたとき、''その型に対して行うだろうあらゆる要求の処理機構を先の「積み上げ」によって「部品(関数)」として細かく用意しておける''、ということ。
--こうして組み上げた関数を''「高階関数」''とか言う。
-
***関数プログラミングにおけるモジュールのくっつけかた その2 [#ub329e5a]
-関数プログラミングは全部関数を使ってプログラムを作るんでしょう?
-だったら出来たプログラムも関数みたいなものじゃない!
-それを部品に新たなプログラムを積み上げればいいんだわ!
-・・・
-関数の場合でもそうだがプログラムA,Bと入力inputがあったとして A(B(input)) と書けば、大抵は「Bが引数inputにより何らかの出力をし、それを引数としてAが動作する」
-つまり B(input) を完全に評価してから、その結果を A の引数として全体の解をだすワケだ。
-だもんで B(input) の評価結果が「自然数のリストを用意する」だったりすると1〜∞の要素を用意しなければならない。
--つまり無理。
-これを「B(input) の評価をひとまず保留し、A の評価に必要な分だけを後から評価する」事を考える。
--無限を扱う数式とかは大体そうするよね。
-この、Bを必要量しか評価しない(出来るだけサボらせよう)というやり方を''「遅延(怠惰)評価」''とか言う。
-(必要な処理しかしないって事はその処理に必要なデータしかメモリに置かなくていいって事でもあるっぽい)
~
**・・・・・・で? [#qee5859b]
-つまりは、~
''&size(18){手持ちの道具を元手に新しい道具をガリガリ作っていって、実行記述は&br;最新の道具(関数)一個で済まそうとかいうスワンな言語概念};''である。
-・・・だよな?
~
~
***参考 [#y2cb9199]
-http://hp.vector.co.jp/authors/VA028375/haskell/log.html
--のリンクとか。
-
~
_______________________________________________________________________________________
#comment
ページ名: