「脱アルゴリズム宣言」読書ノート

この話で出てくる「アルゴリズム」「脱アルゴリズム」という単語について

ここでいうアルゴリズムとは命令型言語的なアルゴリズムを指している
なので必要に応じて「アルゴリズム」という単語を「(命令型言語的)アルゴリズム」と脳内正規表現マッシーンっで置換してもらいたい
ここでそもそもアルゴリズムとは何か?という問題については言及しない。絶対しない

ちなみにもちろん関数型言語にもアルゴリズムはある。

Swiftで脱アルゴリズム!iOS開発を関数型(宣言型)プログラミングへパラダイムシフトしてみる【脱アルゴリズム宣言①】 - Qiita

この章は関数型と手続型の違いについて、および関数型の入り口について話している

まずApple言語のSwiftの諸々について書いてある
要約するとSwiftはモダンらしい。ここは別にどうでもいい。どうせ次の章では出てこない

次に命令型(手続き型)と宣言型(関数型)のコードの違いについて記している
手続型とは要するにC言語childrenなどのことを指す言葉である
いわゆるフローチャートとかそういう感じの、一般によく使われるプログラミング言語パラダイム(種類)だ。この手続型という思想はアセンブラマシン語からきている

対し関数型とは古いところだとLISP大先生、最近だとHaskellなどを指す言葉である
関数型という思想は数学からきている*1

関数型の利点は数学的な問題をかなり数学的な記法で解くことができることだ
当然数学的な問題は数学に近い記法のほうが直観的だ

ここで出てくる*2reduceは2引数を取る関数を受け取り

sum(sum(sum(sum(1,2),3),4),5)

のようにしてくれる優れものである

私も

range({1,2,3,4,5}).resuce(add)

のようなコードを美しいと思う。関数型は美しいです。reduceイエーイ

JavaScript - 関数リアクティブプログラミング(FRP)で分断された2つの世界を繋ぐ【脱アルゴリズム宣言②】 - Qiita

いつの間にかJavaScriptの記事になったが気にしない。気にしてはいけない

ここでいう「分断された2つの世界」というのは「数学世界」と「物理世界」のことらしい
「物理世界」というのはつまり現実のことである
現実というものには時間があり空間があり、そしてそのどれもが実質有限である
対し数学というのは時間も空間も無限にある前提で構築する*3

FRPとは
よく言うのがエクセルとか。入力値の変化によって出力値が自動で変わったり
これは関数型が入力に対し出力が変わらないことを利用している


Swift - 関数型(宣言型)プログラミングで無限をコーディングする「遅延評価」のわかりやすい解説【脱アルゴリズム宣言③】 - Qiita

一応、成り行き上Swiftのタグをつけていますが、実質JavaScript/node.jsの記事になっています。

はい

アルゴリズム」というバズワード、言葉の定義について

はい
遅延評価について
遅延評価とは可能な限り評価を遅らせることを指す
例えばリストAの各要素に+5をしたリストBがあるとする

auto B=A.map([](int n){return n+5;});

この時まだ各要素に+5する必要はない。まだ使わない

for(auto x:B)print(x);

のように使う必要になるまで計算するのを遅延しても何ら問題ない

遅延評価を用いる利点は

  1. 即時評価だとAの要素数分のメモリが必要になる
  2. 即時評価だと仮にAが何らかの方法で無限リストが実装されている場合、Bは無限長さになりパンクする
  3. もしかしたら全部の要素評価する必要はないかもしれない

などなど

記事にも書いてある通り遅延評価を用いると無限リストが使える
この辺はC++でも採用されている。詳しくはBOOST.rangeを見てほしい
そろそろ来るといわれ続けているrangeV3ではさらに無限の扱いが用意になるだろう
例えば素数1000個欲しい場合

make_natural_list()//1,2,3...という無限リストを作る
.filter(isPrime)//そこから素数のみ抜きだす
.take(1000)//そこから先頭1000個とる

となる。こういう問題の時無限リストを扱えると強い


時空プログラミングのほうも読もうと思ったけどもう疲れたよ

*1:宣言型==関数型ではない。prolog大先生がいる

*2:Haskellで言うところのfold。C++でいうとstd::accumulateが近いかもしれない

*3:リーマン巡回問題とか応用数学の類はここでは忘れてくれ