cbug function presentation

28
関数型言語プログラミングの紹介 oskimura Speee July 26, 2010

Upload: osamu-kimura

Post on 14-Jan-2015

2.046 views

Category:

Education


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Cbug function Presentation

関数型言語プログラミングの紹介

oskimura

Speee

July 26, 2010

Page 2: Cbug function Presentation

関数型言語の応用分野

! 金融! セキュリティ! 定理証明支援! MapReduce

Page 3: Cbug function Presentation

関数型言語

次のような言語がある! Scheme

! ML(OCaml,SML...)

! F

! Haskell

! Clean

! Erlang

! Coq

Page 4: Cbug function Presentation

関数型言語の親戚

次のような言語がある! Lisp

! APL

! Coq

! Agda

! Erlang

! Coq

! Mathmatica

! Curry

Page 5: Cbug function Presentation

Lisp

LISP

! 1958年に作成された作者はジョン・マッカーシーラムダ算法の計算モデルを紙の上で表現するための記法コンピューター言語を意図して設計されたわけではなかったスティーブ・ラッセルが FORTRAN 上で実装LISP は FORTRAN 上で動くリスト処理用のライブラリFLPL (Fortran List Processing Language) と呼ばれていた

! 方言Common Lisp, Emacs Lisp, ISLISP, Scheme

Page 6: Cbug function Presentation

ML

ML

! 1974年 エディンバラ大学で開発されたEdinburgh LCF(Logic for Computable Function)という定理証明支援システムの推論規則の記述言語たるメタ言語として開発された。

! 方言SML, CAML,OCAML

Page 7: Cbug function Presentation

Haskell

haskell

! 1990年に作成されたFunctional Programming Languages and ComputerArchitecture (FPCA ’87)遅延関数型言語のオープンな標準を作成するための委員会が発足されるべき

Page 8: Cbug function Presentation

関数型言語に影響を与えた言語

! algol   ! レキシカルスコープをもつ初めての言語! モジュール機構をもつ初めての言語! 値呼び出し、名前呼び出し(遅延評価)

Page 9: Cbug function Presentation

関数型言語に影響を与えた言語

! ISWIM! 1966年 Peter J. Landin が考案! Communications of the ACM 誌で発表

The Next 700 Programming Languages で初めて明らかにした抽象プログラミング言語

! ”If you See What I Mean” の頭字語に由来する! ラムダ計算の関数型コアを命令型言語の糖衣構文で包んだ! Landin の J 演算子を追加してある(Scheme の call/cc は J演算子に由来)

! ISWIM の操作的意味論は Landin の SECDマシンを使用! 字下げでブロックを示すようにした! CPLと共に最初に ’where’ 節を使った! 代数的データ型と同等のものがが存在した

Page 10: Cbug function Presentation

関数型言語に影響を与えた言語

! Hope! Hope is a small functional programming language developed in

the 1970s at Edinburgh University! It is notable for being the first language with call-by-pattern

evaluation and algebraic data types.

Page 11: Cbug function Presentation

関数型言語とはなにか

厳密な定義はない.一般に次のような特徴をもつ

! 参照透明性! 関数が第一級オブジェクト! 計算モデル (λ計算など)

Page 12: Cbug function Presentation

関数型言語の種類

! 型なし vs型付き! 純粋関数型 vs非純粋関数型! 遅延評価 vs正格評価

Page 13: Cbug function Presentation

関数型言語の歴史

! 1930年代! Churchと Kleeneがラムダ計算を考案

! 1958年! John McCarthyが Lispを作成

Page 14: Cbug function Presentation

! 1960年代! プログラミング言語理論の基礎となる概念が生まれる

! クロージャ! 参照透明性 ! 操作的意味論 ! 表示的意味論! J演算子

! 1970年代前半! Robin Milnerが数学的な定理の自動証明を支援するためにMLを開発

Page 15: Cbug function Presentation

! 1970年代! 遅延評価が出現! David Turnerは SASLと KRC(Lazy)を開発! Rod Burstallと John Darlingtonは NPLと Hopeを開発! NPL, KRC, ML は 1980年代に開発された Lazy ML, Clean,

Mirandaを含むいくつか関数型言語に影響を与えている

! 1990年! Haskell1.0仕様策定

Page 16: Cbug function Presentation

参照透明性とは?

もとは論理学者の quineが考えた概念。Landinと Stracheyによってプログラミング言語の性質として使われるよう になった。参照透明性の意味は文脈によって異なる

! 確定性! 副作用がない! 決定性! 展開可能性! 外延性

Page 17: Cbug function Presentation

モジュール

! 5つの基準! 5つの規則! 5つの原則

Page 18: Cbug function Presentation

モジュール 5つの基準

! 分解しやすさ他システムへの依存性を低く抑えることができる

! 組み合わせやすさ異なる環境においても自由に組み合わせることができる

! 分かりやすさ独立性が高く、他のモジュールの知識を必要としない

! 連続性変更の局所化が行えている

! 保護性モジュールの内部で発生したエラーの影響を閉じ込めることができる

Page 19: Cbug function Presentation

モジュール 5つの規則

! 直接的な写像解こうとしている問題領域のモデルとモジュールの構造が写像(マッピング)されている

! 少ないインターフェース他のモジュールとの連携を行う際できる限り少ない数のモジュールとのやり取りで済ませる

! 小さいインターフェース他のモジュールと通信する場合、最小限の情報のみをやり取りすること

! 明示的なインターフェース他のモジュールと通信する場合、そのことがインターフェースから明らかに分かること

! 情報隠蔽適切な情報のみを公開すること。不要な情報は隠蔽しておくこと

Page 20: Cbug function Presentation

モジュール 5つの原則

! 言語としてのモジュール単位モジュールは言語の構文構造に対応していなければならない

! 自己文書化モジュールについての情報をモジュールの一部として作成する

! 統一形式アクセス統一された表記によってアクセスできなければならない

! 開放/閉鎖の原則(Open-Closed Principle)拡張に対して開き、修正に対して閉じている

! 単一責任の原則(Single Responsibility Principle)ひとつの役割だけをもつこと。変更の理由はただひとつでなければならない

Page 21: Cbug function Presentation

モジュール

! 抽象データ型! 契約による設計! 事前条件! 事後条件! 不変条件

Page 22: Cbug function Presentation

ラムダ計算 vsチューリングマシン

! チューリングマシンはチューリングが提唱! ラムダ計算はチャーチが提唱! ラムダ計算とチューリングマシンは同じ能力 (チャーチ=チューリングの提唱)

! チューリングマシンは計算量を把握するのに向いている! ラムダ計算は停止するかどうか判断するのに向いている

Page 23: Cbug function Presentation

ラムダ計算

! 関数抽象

!x .x

! 関数適用

(!x .x)x ! x

! BNF

! (シンボルの定義)

expr ::= identifier

! (関数抽象)expr ::= (!identifier .expr )

! (関数適用)expr ::= (expr expr )

Page 24: Cbug function Presentation

型とは

! 関数型言語において型とは型つきλ計算のことである。! 型つきλ計算とは、λ計算に型理論をくっつけたものである。! 型理論の元はラッセルの「プリンキピア・マテマティカ」

Page 25: Cbug function Presentation

型付きλ計算

型つきλ計算の種類は複数ああり、関数型言語によって採用している型理論の種類は異なる

! 単純型付きλ計算! 高階λ計算! 依存型λ計算! 線形型つきλ計算! などなどラムダ計算はカリー=ハワード対応とよばれる対応があり、対応する直感主義論理が存在する

Page 26: Cbug function Presentation

カリー=ハワード対応

! この対応利用して、証明を行うことができる直観主義論理における証明を構成的証明論とよぶ

! 定理証明支援システム! Coq Agda ....

Page 27: Cbug function Presentation

関数型言語の機能

! 遅延評価! 高階関数! メモ化! 継続! クロージャ! 関数内関数! 部分適用! 型推論! 代数的データ構造! 型クラス! パターンマッチ

Page 28: Cbug function Presentation

第一級オブジェクト

! 無名のリテラルとして表現可能である。! 変数で束縛可能。! データ構造に格納可能である。! それ自体が独自に存在できる(無名関数として存在できる)。! 他のものとの等値性の比較が可能である。! 関数のパラメータとして渡すことができる。! 関数の戻り値として返すことができる。! 実行時に構築可能である。! 表示可能である。! 読み込むことができる。! 分散したプロセス間で転送することができる。! 実行中のプロセスの外に保存することができる。