機械が保持している計算モデルは3つのモデルがあります。
命令型モデル
アランチューリングが考案した。JavaやCなどで採用される一般的なモデル、「計算」とは「命令を実行する」こと。
命令
計算機の状態を変更する処理のこと。例をあげれば電卓などの仕組みです。1を押したら1が表示され、+と2を押したら3が表示されます。
メリット
概念は現実世界と似ているのでわかりやすい。
デメリット
状態が分かりづらい。プログラムが必要以上に複雑になる。
チューリング機械
1930年代にアランチューリングが機械によって計算を自動化しました。
なぜ流行ったのか?
ハードウェアの構造に近かったため。関数型モデルではメモリやコンパイルの効率的な管理がしにくい。
関数型モデル
HaskellやLispなどで採用される。「計算」とは「関数を呼び出して値を得る」こと。
ラムダ計算
アメリカのアロンゾ・チャーチが考案した。関数名がない。関数から名前を取り除いた抽象関数である。
バインドする
以下のように変数に関数を対応づけることを「バインドする」と言います。
1 2 3 |
const a = (x)=> { return x+1; }; |
a()とすることで関数を呼び出せます。
なぜ注目されつつあるのか?
メモリやCPUの処理能力向上によりメモリ管理などの実装上の問題は解決されやすくなっているため。
命令型モデルに比べて簡潔に記述ができる。
置換ルール
我々が小学校の頃にやってきた計算手順と同じもの。
「関数適用の時に引数の値で関数本体の内部の変数を置換する」という規則があります。ということは、逆に言えば、「関数呼び出しの結果は、その関数の引数のみに依存する」ことになる。
計算の過程(状態)が捉えやすい。
計算の状態を明示できる。
関数として扱う姿勢
処理自体を部品化できるようになる。
論理型モデル
Prologなどで採用される。「計算」とは「証明を得る」こと。現在はあまり使われません。
カリー化された関数とは?
- カリー化された関数はただ一つの引数しか取らない。
- 1つの引数しか取らない別の関数を返す。
- 高階関数の一種
カリー化のメリット
ただ一つしか引数を取らないので、関数同士を組み合わせる場面で引数の数を一致させる必要がなく関数に汎用性を持たせることができる。
カリー化された関数の例
1 2 3 4 5 |
const a = (x) => { return (y) => { return x + y; } } |
なので、a(1)などと指定しても無名関数が返ってくるだけです。a(1)(2)などとしたら初めて3という計算結果が返ってきます。
この記事へのコメントはありません。