ML 演習 第 4 回 末永 幸平, 遠藤 侑介, 大山 恵弘 2005/06/21.

Slides:



Advertisements
Similar presentations
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Advertisements

アルゴリズムとデータ構造 第2回 線形リスト(復習).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
ISD実習E 2009年7月13日 LISPシステム入門 (第6回) 関数の定義 eval load 関数.
知識情報演習Ⅲ(後半第1回) 辻 慶太(水)
Javaのための暗黙的に型定義される構造体
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 4 回 新井淳也、中村宇佑、前田俊行 2011/05/10.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2012年度 計算機システム演習 第4回 白幡 晃一.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報科学1(G1) 2016年度.
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
条件式 (Conditional Expressions)
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
プログラム理論特論 第8回 亀山幸義
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
ML 演習 第 3 回 新井淳也、中村宇佑、前田俊行 2011/04/26.
プログラミング 3 構造体(1).
【プログラミング応用】 必修2単位 通年 30週 授業形態:演習.
プログラミング言語入門 手続き型言語としてのJava
暗黙的に型付けされる構造体の Java言語への導入
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
独習XML 第2章 XML文書の構成要素 2.1 XMLの文字と文字列 2.2 コメント
デジタル画像とC言語.
コンパイラ演習 第11回 2006/1/19 大山 恵弘 佐藤 秀明.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
 型推論3(MLの多相型).
B演習(言語処理系演習)第2回 田浦.
C言語 はじめに 2016年 吉田研究室.
15.cons と種々のデータ構造.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
プログラミング演習I 2003年4月30日(第3回) 木村巌.
プログラミング 3 2 次元配列.
プログラミング演習I 2003年7月2日(第11回) 木村巌.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
~sumii/class/proenb2010/ml2/
アルゴリズムとデータ構造1 2009年6月15日
2006/7/18(通信コース)2006/7/26(情報コース) 住井
2006/6/27(通信コース)2006/7/5(情報コース) 住井
2008/7/16(情報コース)2008/7/22(通信コース) 住井
~sumii/class/proenb2009/ml6/
18. Case Study : Imperative Objects
~sumii/class/proenb2010/ml5/
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
PROGRAMMING IN HASKELL
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
全体ミーティング(9/15) 村田雅之.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
Presentation transcript:

ML 演習 第 4 回 末永 幸平, 遠藤 侑介, 大山 恵弘 2005/06/21

識別子について 利用可能文字 先頭の文字の case で2つに区別 先頭文字: A~Z, a~z, _ (小文字扱い) 小文字: 変数, 型名, レコードの field 名 (ラベル, クラス名, クラスメソッド名) 大文字: Constructor 名, モジュール名 任意: モジュール型名

alias pattern パターンマッチの結果に別名を与える # match (1, (2, 3)) with (x, (y, z as a)) -> a - : int * int = (2, 3) 結合が弱いので注意。必要なら ( ) を。  (上の例では y, (z as a) ではなく (y, z) as a と結合している)

今回の内容 Ocaml のモジュールシステム Ocaml コンパイラの利用  今日使うソースは演習ホームページに 置いてあります structure signature functor Ocaml コンパイラの利用  今日使うソースは演習ホームページに 置いてあります

今回の内容 Ocaml のモジュールシステム structure signature functor Ocaml コンパイラの利用

大規模プログラミングと モジュール 大規模プログラミングに必要な機能 名前の衝突の回避 仕様と実装の切り分けの明確化 部品の再利用 適切な「名前空間」の分離 仕様と実装の切り分けの明確化 細かい実装の変更から利用者を守る 仕様を変えない範囲で実装の変更を自由にする 部品の再利用 同じ構造を持つコードを共通化する

Ocaml の モジュールシステム structure : 名前空間を提供 signature : interface 仕様を定義 プログラムをモジュールとして分離 signature : interface 仕様を定義 プログラムの実装 (値・型など) の隠蔽 functor : structure を受け取る 「関数」 共通の構造をもった structure の生成

Multiset モジュールの empty という変数に アクセス structure (1) Multiset モジュールの empty という変数に アクセス 変数や型などの定義の集合 例: MultiSet (lecture4-1.ml) 内部の変数には . (ドット) 表記でアクセス # MultiSet.empty;; - : ’a MultiSet.set = MultiSet.Leaf # let a = MultiSet.add MultiSet.empty 5;; val a : int MultiSet.set = MultiSet.Node (5, MultiSet.Leaf, MultiSet.Leaf) # MultiSet.member a 5;; - : bool = true

Multiset. を付けなくてもMultiset.add にアクセスできる structure (2) open: structure を「開く」 structure 内の定義を . 無しでアクセス # open MultiSet;; # add empty 5;; - : int MultiSet.set = Node (5, Leaf, Leaf) # member (add empty 5) 10;; - : bool = false Multiset. を付けなくてもMultiset.add にアクセスできる

signature structure に対する「型」 公開する/隠蔽する変数や型の指定 例: MULTISET: 重複集合の抽象化 type ’a set は存在だけが示されている モジュールの外からは ‘a set の定義が見えない ’a set の実装が変わっても, 使う側には影響ナシ remove_top は MULTISET にはない remove_top はモジュールの中からしか見えない

signature の適用 (1) signature を structure に適用 MULTISET で MultiSet に制限をかける # module AbstractMultiSet = (MultiSet : MULTISET);; module AbstractMultiSet : MULTISET # let a = AbstractMultiSet.empty;; val a : ’a AbstractMultiSet.set = <abstr> # let b = AbstractMultiSet.add a 5;; val b : int AbstractMultiSet.set = <abstr> 抽象データ型の内容は隠蔽される

AbstractMultiSet.set と MultiSet.set は違う型!! signature の適用 (2) remove_top は 外から見えない # open AbstractMultiSet;; # let a = add (add empty 5) 10;; val a : int AbstractMultiSet.set = <abstr> # AbstractMultiSet.remove_top;; Unbound value AbstractMultiSet.remove_top;; # MultiSet.remove_top a;; This expression has type int AbstractMultiSet.set but it is used with type ’a MultiSet.set AbstractMultiSet.set と MultiSet.set は違う型!!

functor structure から structure への「関数」 例: lecture4-2.ml signature ORDERED_TYPE 一般の全順序・等値関係つきの型 functor MultiSet2 ORDERED_TYPE を持つ structure に対する集合の定義

functor と signature functor に対する signature の定義 SETFUNCTOR: MultiSet2 に対する functor signature elem の型は concrete (Elt.t) t の型は abstract AbstractSet2: SETFUNCTOR で制限した functor MultiSet2

functor と signature (2) # module AbstractStringSet = AbstractSet2(OrderedString);; module AbstractStringSet : sig ... end # let sa = AbstractStringSet.add AbstractStringSet.empty “OCaml”;; val sa : AbstractStringSet.t = <abstr> # AbstractStringSet.member sa “ocaml”;; - : bool = false

渡す structure を 変えるだけで 新しい Set を作れる functor と signature (3) # module NCStringSet = AbstractSet2(NCString);; module NCStringSet : sig ... end # let sa = NCStringSet.add NCStringSet.empty “OCaml”;; val sa : NCStringSet.t = <abstr> # NCStringSet.member sa “ocaml”;; - : bool = true # AbstractStringSet.add sa “ocaml”;; This expression has type NCStringSet.t = AbstractSet2(NCString).t but is here used with type AbstractStringSet.t = AbstractSet2(OrderedString).t 渡す structure を 変えるだけで 新しい Set を作れる

今回の内容 Ocaml のモジュールシステム structure signature functor Ocaml コンパイラの利用

Ocaml のコンパイラ (1) モジュール単位の分割コンパイルを サポート Unix の実行形式ファイルを作成 複数の backend ocamlc: バイトコードコンパイラ バイトコードインタプリタ (ocamlrun) を実行に使用 デバッガをサポート ocamlopt: ネイティブコードコンパイラ SPARC や x86 などの機械語を直接生成

Ocaml のコンパイラ (2) 拡張子一覧 ソースファイル オブジェクトファイル .ml → module の実装 (structure) .mli → module のインタフェース (signature) オブジェクトファイル .cmo → 実装のバイトコード .cmi → インタフェース定義のバイトコード .cmx → 実装のネイティブコード .cma, .cmxa → ライブラリ

分割コンパイル (1) *.ml と *.mli 実装とインタフェースをそれぞれ記述 .mli をコンパイル → .cmi を生成 module SomeThing : sig [someThing.mli の内容] end = struct [someThing.ml の内容] end に相当 (モジュール名の先頭を小文字化) .mli をコンパイル → .cmi を生成 .ml をコンパイル → .cmi が無ければ 制約無しで生成、あれば型チェック

分割コンパイル (2) 例 mySet.mli, mySet.ml uniq.ml module MySet の定義 メインプログラムのモジュール

分割コンパイル (3) 実行例 (1) % ocamlc -c mySet.mli % ocamlc -c mySet.ml % ocamlc -c uniq.ml % ls -F *.cm* mySet.cmi mySet.cmo uniq.cmi uniq.cmo % ocamlc -o myuniq mySet.cmo uniq.cmo % ls -F myuniq myuniq* 順序が重要: モジュールの定義/依存順

分割コンパイル (4) 実行例 (1) % ./myuniq OCaml Standard ML C++ ^D 1 C++ 2 OCaml

分割コンパイル (5) .cmo ファイルのインタプリタでの利用 # #load “mySet.cmo”;; # MySet.empty;; - : ’a MySet.set = <abstr> # MySet.remove_top;; Unbound value MySet.remove_top # open MySet;; # empty;;

第 4 回 課題 締め切り: 7/5 13:00

課題0 myuniq の例を自分でやってみること。 次回以降のインタプリタの課題で 使えないと困ります。 提出はしなくて結構です。 実行ファイル生成 mySet.cmo をインタプリタに読み込んでみる 次回以降のインタプリタの課題で 使えないと困ります。 提出はしなくて結構です。

課題1 リストなどの別のデータ構造を使って signature MULTISET に対する別の実装を与えよ。 structure の書き方の練習。そんなに難しくはないと思います。

課題2 lecture4-ex2 は簡単なパスワード付き銀行口座の例であるが、fst a1 や BankAccountImpl.accounts などで、 秘密の情報である暗証や口座一覧が 操作可能である。そこで、この moduleに適用する signature を作り、これらの情報を隠蔽せよ。 signature の練習。割と簡単。

課題2 (仕様) 公開すべきもの 隠蔽すべきもの deposit, withdraw, balance, bank_statistics 型 account の存在 隠蔽すべきもの 型 t の実装: 残高を操作できる 値 accounts: 他口座の instance が得られる その他の関数: 認証を回避できる

課題3 (optional) ORDERED_TYPE で表現される型の key と、任意の型の値についての連想配列を作り出す functor を作れ。 functor の練習。前2問よりは難しいか?

課題3 (例1) # module NCStringAssociation = Association(NCString);; sig type key = NCString.t and ‘a t = ‘a Association(NCString).t val empty : ‘a t val add : ‘a t -> key -> ‘a -> ‘a t val remove : ‘a t -> key -> ‘a t val get : ‘a t -> key -> ‘a exception Not_Found end

課題3 (例2) # open NCStringAssociation;; # let sa = add empty “C” “/* */”;; val sa : string NCStringAssociation.t = <abstr> # let sa = add sa “OCaml” “(* *)”;; # let sa = add sa “Perl” “#”;; # get sa “ocaml”;; - : string = “(* *)”

課題 4 (optional) 環 (ring) を表すモジュールを受け取って その環を係数とする多項式の環を返す functor を実装する課題 詳しくは別紙

レポート提出上の注意 (1) 提出方法: 電子メール 宛先: ml-report@yl.is.s.u-tokyo.ac.jp 受領通知が届くと思うので確認のこと Subject を Report <レポート番号> <学生証番号> とすること 今回の場合 “Report 4 510xx” 地下以外から提出する場合, 地下計算機の アカウントを書くこと レポートは添付ファイルにせず, メール本文に 記述すること

レポート提出上の注意 (2) レポート本文に含めるべきもの 氏名, 学生証番号 ソース 動作例 考察 コメントを適宜補い, 各関数の動作を説明すること 動作例 プログラムが正しく動作することを示すのに ふさわしい例を考えること 考察 考察不要と指定されている場合を除き, 必ず入れる