ML 演習 第 4 回

Similar documents
Microsoft PowerPoint - CproNt02.ppt [互換モード]

Parametric Polymorphism

# let st1 = {name = "Taro Yamada"; id = };; val st1 : student = {name="taro Yamada"; id=123456} { 1 = 1 ;...; n = n } # let string_of_student {n

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

Microsoft PowerPoint - 09.pptx

プログラミング基礎

# let rec sigma (f, n) = # if n = 0 then 0 else f n + sigma (f, n-1);; val sigma : (int -> int) * int -> int = <fun> sigma f n ( : * -> * ) sqsum cbsu

ML Edinburgh LCF ML Curry-Howard ML ( ) ( ) ( ) ( ) 1

Fortran 勉強会 第 5 回 辻野智紀

Dive into Algebraic Effects

Jacques Garrigue

プログラミング実習I

Microsoft PowerPoint - chap10_OOP.ppt

memo

PowerPoint プレゼンテーション

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

プログラミング言語 8 字句解析器(lexer)と構文解析器(parser)

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

JavaプログラミングⅠ

PowerPoint プレゼンテーション

メディプロ1 Javaプログラミング補足資料.ppt

: gettoken(1) module P = Printf exception End_of_system (* *) let _ISTREAM = ref stdin let ch = ref ( ) let read () = (let c =!ch in ch := inp

Microsoft Word - Javacc.docx

プログラミング基礎I(再)

JavaプログラミングⅠ

スクールCOBOL2002

Javaの作成の前に

Java言語 第1回

Java知識テスト問題

Microsoft PowerPoint - 01_Vengineer.ppt

テキストファイルの入出力1

情報技術 Java の特徴 Java は現在 事務処理計算用プログラミング言語として開発された COBOL に取って代わり C 言語や C++ と並んで 現在最も使われているプログラミング言語の一つである Java は Write Once, Run Anywhere( プログラムを一度作成したらど

プログラミング及び演習 第1回 講義概容・実行制御

Microsoft PowerPoint - A1-2_株式会社ネクスト_藤澤正通_S _005.pptx

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

HCI プログラミング 8 回目ボタン チェックボックス ラジオボタン 今日の講義で学ぶ内容 ボタンとアクションイベント ボタンのカスタマイズ チェックボックスとラジオボタン ボタンとアクションイベント 1 ボタンを配置してみましょう ボタンは ラベルと同じようにフォントやその色 画像の貼り付けなど

開発・運用時のガイド JDK8への移行に伴う留意点 [UNIX]

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

Android Layout SDK プログラミング マニュアル

PowerPoint Presentation

sinfI2005_VBA.doc

kiso2-03.key

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

Microsoft Word - Win-Outlook.docx

24th Embarcadero Developer Camp

EXCEL VBA講座

第8回 関数

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

プログラミング入門1

Chromeleon 7 for Chromeleon 7.2 全バージョン共通 Build: --- 新しいシーケンスの作成に使用できるワークリストファイル (.wlex) Doc. Nr: FAQ_CM7_2SS_00009 Doc. Ver.: Doc. Type

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

FW ファイルアップロード ダウンロード機能利用ガイド Version 年 9 月 21 日富士通株式会社 i All Right Reserved, Copyright FUJITSU LIMITED

A 既製のプロジェクトがある場合

Transcription:

ML 演習第 4 回 おおいわ Mar 6, 2003

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

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

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 と結合している ) 4

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

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

structure (1) 変数や型などの定義の集合 例 : 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 7

structure (2) open: structure を 開く structure 内の定義を. 無しでアクセス # open MultiSet;; # add empty 5;; - : int MultiSet.set = Node (5, Leaf, Leaf) # member (add empty 5) 10;; - : bool = false 8

signature structure に対する 型 公開する / 隠蔽する変数や型の指定 例 : MULTISET: 重複集合の抽象化 type a set は存在だけが示されている remove_top は定義にない 9

signature の適用 (1) signature を structure に適用 # 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> 抽象データ型の内容は隠蔽される 10

signature の適用 (2) # 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 11

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

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

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 14

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) 15

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

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

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

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

分割コンパイル (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* 順序が重要 : モジュールの定義 / 依存順 20

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

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

課題 0 myuniq の例を自分でやってみること 実行ファイル生成 myset.cmo をインタプリタに読み込んでみる 次回以降使えないと困ります 自習課題です 23

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

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

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

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

課題 3 ( 例 1) # module NCStringAssociation = Association(NCString);; module NCStringAssociation : 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 28

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

提出方法 〆切 : 2003 年 5 月 20 日火曜日 13:00 提出先 : ml-report@yl.is.s.u-tokyo.ac.jp 題名 : Report 4 xxxxx ( 学生証番号 ) 30