ラベル 関数型プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル 関数型プログラミング の投稿を表示しています。 すべての投稿を表示

2015年8月9日日曜日

Lispによる関数型プログラミング入門2 記法

Lispの記法

・前置記法
1 + 2
→ 
 (+ 1 2)

つまり、関数(ここでは和演算)を最初に宣言して、引数を渡す。これはf(x)と記述するのと同じである。

・defun
means define-function

例)
フィボナッチ数計算:
> (defun fib(n)
>   (if (<= n 1)
>     1
>     (+ (fib (- n 1)) (fib(- n 2)))
>   )
> )

> (fib 5)
 8
> (fib 21)
 17711


Lispの評価と特殊形式quote、function

・quote
関数を評価せずにそのままかえす

例)
> (quote (1 2 3))
 (1 2 3)

・function
シンボルの関数をかえす特殊関数
略記 #'

例)
> (function +)

#<SYSTEM-FUNCTION +>

2015年8月3日月曜日

Lispによる関数型プログラミング入門

SoftwareDesignの2015Aug を読んでLispに興味をもったので、何回かにわけて入門のメモを残す。

Lispの前に、関数型プログラミングの特徴から。

関数型プログラミング

グローバル変数や代入文など副作用を生じる機能を使わずにプログラミングを行う。

・従来の考え方
上記のように変数や配列などの状態をループなどを用いて変更し結果を得る

・関数型プログラミングの考え方
関数(主に高階関数)を利用して副作用無しに結果を得る

・関数型プログラミング向きの問題
状態をもたない再帰的な問題
→探索、整列

・人間には再帰的思考が向いている
数学的帰納法(具体的で小さい問題から大きな全体の問題へ向かう)

・並列処理に対する強み
状態を持たないので、並列処理を自然に(というのは同期や排他が必要無い)できる。
クラウドやビックデータ向きである。

・関数呼び出しに対する弱み
関数呼び出しはコストが大きいので、低機能コンピュータには向いていない。高機能コンピュータ上で並列処理するのに向いている。

・動的なプログラミングに対する強み
関数自身をオブジェクトとして扱えるため、動的な関数生成や変更をすることができる。(サービス指向コンピューティング)

・抽象的なプログラミングに対する強み
うまく作れれば、状態をもたないので仕様変更に柔軟であるはず。

・バグの現象
副作用が少ないので、バグの温床がつくられることを防げる。

Lisp
・言語仕様が小さい
・インタプリタ言語であり、実行が簡単
・GC、ラムダなど最近の言語では常識であるアイデアの元となった言語
・動的型付け(型推論ではない)
・かっこが多くて見難い
・前置記法が見難い
・動的型付けはリソースを食う

数学的帰納法だと考えるとわかりやすい
・再帰をみつける = 同じことの繰り返しをみつける。

例)
階乗:
・関数型
 →5(N)の階乗は4(N-1)の階乗の結果に5を掛けること
・手続き型
 →1 x 2 x 3 x 4 x 5

Lispのインストール(OSX)

次回はLispの記法から。