cbug function presentation
DESCRIPTION
TRANSCRIPT
関数型言語プログラミングの紹介
oskimura
Speee
July 26, 2010
関数型言語の応用分野
! 金融! セキュリティ! 定理証明支援! MapReduce
関数型言語
次のような言語がある! Scheme
! ML(OCaml,SML...)
! F
! Haskell
! Clean
! Erlang
! Coq
関数型言語の親戚
次のような言語がある! Lisp
! APL
! Coq
! Agda
! Erlang
! Coq
! Mathmatica
! Curry
Lisp
LISP
! 1958年に作成された作者はジョン・マッカーシーラムダ算法の計算モデルを紙の上で表現するための記法コンピューター言語を意図して設計されたわけではなかったスティーブ・ラッセルが FORTRAN 上で実装LISP は FORTRAN 上で動くリスト処理用のライブラリFLPL (Fortran List Processing Language) と呼ばれていた
! 方言Common Lisp, Emacs Lisp, ISLISP, Scheme
ML
ML
! 1974年 エディンバラ大学で開発されたEdinburgh LCF(Logic for Computable Function)という定理証明支援システムの推論規則の記述言語たるメタ言語として開発された。
! 方言SML, CAML,OCAML
Haskell
haskell
! 1990年に作成されたFunctional Programming Languages and ComputerArchitecture (FPCA ’87)遅延関数型言語のオープンな標準を作成するための委員会が発足されるべき
関数型言語に影響を与えた言語
! algol ! レキシカルスコープをもつ初めての言語! モジュール機構をもつ初めての言語! 値呼び出し、名前呼び出し(遅延評価)
関数型言語に影響を与えた言語
! 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’ 節を使った! 代数的データ型と同等のものがが存在した
関数型言語に影響を与えた言語
! 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.
関数型言語とはなにか
厳密な定義はない.一般に次のような特徴をもつ
! 参照透明性! 関数が第一級オブジェクト! 計算モデル (λ計算など)
関数型言語の種類
! 型なし vs型付き! 純粋関数型 vs非純粋関数型! 遅延評価 vs正格評価
関数型言語の歴史
! 1930年代! Churchと Kleeneがラムダ計算を考案
! 1958年! John McCarthyが Lispを作成
! 1960年代! プログラミング言語理論の基礎となる概念が生まれる
! クロージャ! 参照透明性 ! 操作的意味論 ! 表示的意味論! J演算子
! 1970年代前半! Robin Milnerが数学的な定理の自動証明を支援するためにMLを開発
! 1970年代! 遅延評価が出現! David Turnerは SASLと KRC(Lazy)を開発! Rod Burstallと John Darlingtonは NPLと Hopeを開発! NPL, KRC, ML は 1980年代に開発された Lazy ML, Clean,
Mirandaを含むいくつか関数型言語に影響を与えている
! 1990年! Haskell1.0仕様策定
参照透明性とは?
もとは論理学者の quineが考えた概念。Landinと Stracheyによってプログラミング言語の性質として使われるよう になった。参照透明性の意味は文脈によって異なる
! 確定性! 副作用がない! 決定性! 展開可能性! 外延性
モジュール
! 5つの基準! 5つの規則! 5つの原則
モジュール 5つの基準
! 分解しやすさ他システムへの依存性を低く抑えることができる
! 組み合わせやすさ異なる環境においても自由に組み合わせることができる
! 分かりやすさ独立性が高く、他のモジュールの知識を必要としない
! 連続性変更の局所化が行えている
! 保護性モジュールの内部で発生したエラーの影響を閉じ込めることができる
モジュール 5つの規則
! 直接的な写像解こうとしている問題領域のモデルとモジュールの構造が写像(マッピング)されている
! 少ないインターフェース他のモジュールとの連携を行う際できる限り少ない数のモジュールとのやり取りで済ませる
! 小さいインターフェース他のモジュールと通信する場合、最小限の情報のみをやり取りすること
! 明示的なインターフェース他のモジュールと通信する場合、そのことがインターフェースから明らかに分かること
! 情報隠蔽適切な情報のみを公開すること。不要な情報は隠蔽しておくこと
モジュール 5つの原則
! 言語としてのモジュール単位モジュールは言語の構文構造に対応していなければならない
! 自己文書化モジュールについての情報をモジュールの一部として作成する
! 統一形式アクセス統一された表記によってアクセスできなければならない
! 開放/閉鎖の原則(Open-Closed Principle)拡張に対して開き、修正に対して閉じている
! 単一責任の原則(Single Responsibility Principle)ひとつの役割だけをもつこと。変更の理由はただひとつでなければならない
モジュール
! 抽象データ型! 契約による設計! 事前条件! 事後条件! 不変条件
ラムダ計算 vsチューリングマシン
! チューリングマシンはチューリングが提唱! ラムダ計算はチャーチが提唱! ラムダ計算とチューリングマシンは同じ能力 (チャーチ=チューリングの提唱)
! チューリングマシンは計算量を把握するのに向いている! ラムダ計算は停止するかどうか判断するのに向いている
ラムダ計算
! 関数抽象
!x .x
! 関数適用
(!x .x)x ! x
! BNF
! (シンボルの定義)
expr ::= identifier
! (関数抽象)expr ::= (!identifier .expr )
! (関数適用)expr ::= (expr expr )
型とは
! 関数型言語において型とは型つきλ計算のことである。! 型つきλ計算とは、λ計算に型理論をくっつけたものである。! 型理論の元はラッセルの「プリンキピア・マテマティカ」
型付きλ計算
型つきλ計算の種類は複数ああり、関数型言語によって採用している型理論の種類は異なる
! 単純型付きλ計算! 高階λ計算! 依存型λ計算! 線形型つきλ計算! などなどラムダ計算はカリー=ハワード対応とよばれる対応があり、対応する直感主義論理が存在する
カリー=ハワード対応
! この対応利用して、証明を行うことができる直観主義論理における証明を構成的証明論とよぶ
! 定理証明支援システム! Coq Agda ....
関数型言語の機能
! 遅延評価! 高階関数! メモ化! 継続! クロージャ! 関数内関数! 部分適用! 型推論! 代数的データ構造! 型クラス! パターンマッチ
第一級オブジェクト
! 無名のリテラルとして表現可能である。! 変数で束縛可能。! データ構造に格納可能である。! それ自体が独自に存在できる(無名関数として存在できる)。! 他のものとの等値性の比較が可能である。! 関数のパラメータとして渡すことができる。! 関数の戻り値として返すことができる。! 実行時に構築可能である。! 表示可能である。! 読み込むことができる。! 分散したプロセス間で転送することができる。! 実行中のプロセスの外に保存することができる。