slide1 n.
Download
Skip this Video
Download Presentation
ML 演習 第 4 回

Loading in 2 Seconds...

play fullscreen
1 / 35

ML 演習 第 4 回 - PowerPoint PPT Presentation


  • 101 Views
  • Uploaded on

ML 演習 第 4 回. 末永 幸平 , 遠藤 侑介 , 大山 恵弘 2005/06/21. 識別子について. 利用可能文字 先頭文字: A ~ Z, a ~ z, _ ( 小文字扱い) 2 文字目以降: A ~ Z, a ~ z, 0 ~9, _ , ’ ( プライム ) 先頭の文字の case で2つに区別 小文字: 変数, 型名, レコードの field 名 ( ラベル, クラス名, クラスメソッド名) 大文字: Constructor 名, モジュール名 任意: モジュール型名. alias pattern.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'ML 演習 第 4 回' - stesha


Download Now An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

ML 演習 第 4 回

末永 幸平, 遠藤 侑介, 大山 恵弘

2005/06/21

slide2
識別子について
  • 利用可能文字
    • 先頭文字: A~Z, a~z, _(小文字扱い)
    • 2文字目以降: A~Z, a~z, 0~9, _, ’ (プライム)
  • 先頭の文字のcase で2つに区別
    • 小文字: 変数, 型名, レコードの field 名

(ラベル, クラス名, クラスメソッド名)

    • 大文字: Constructor 名, モジュール名
    • 任意: モジュール型名
alias pattern
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 と結合している)

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

 今日使うソースは演習ホームページに 置いてあります

slide5
今回の内容
  • Ocaml のモジュールシステム
    • structure
    • signature
    • functor
  • Ocaml コンパイラの利用
slide6
大規模プログラミングとモジュール
  • 大規模プログラミングに必要な機能
    • 名前の衝突の回避
      • 適切な「名前空間」の分離
    • 仕様と実装の切り分けの明確化
      • 細かい実装の変更から利用者を守る
      • 仕様を変えない範囲で実装の変更を自由にする
    • 部品の再利用
      • 同じ構造を持つコードを共通化する
ocaml
Ocaml のモジュールシステム
  • structure : 名前空間を提供
    • プログラムをモジュールとして分離
  • signature : interface 仕様を定義
    • プログラムの実装 (値・型など) の隠蔽
  • functor : structure を受け取る 「関数」
    • 共通の構造をもった structure の生成
structure 1
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

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

抽象データ型の内容は隠蔽される

signature 2
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
functor
  • structure から structure への「関数」
    • 例: lecture4-2.ml
      • signature ORDERED_TYPE
        • 一般の全順序・等値関係つきの型
      • functor MultiSet2
        • ORDERED_TYPE を持つ structure に対する集合の定義
functor signature
functor と signature
  • functor に対する signature の定義
    • SETFUNCTOR: MultiSet2 に対するfunctor signature
      • elem の型は concrete (Elt.t)
      • t の型は abstract
    • AbstractSet2: SETFUNCTOR で制限したfunctor MultiSet2
functor signature 2
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

functor signature 3
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 を作れる

slide17
今回の内容
  • Ocaml のモジュールシステム
    • structure
    • signature
    • functor
  • Ocaml コンパイラの利用
ocaml 1
Ocaml のコンパイラ (1)
  • モジュール単位の分割コンパイルをサポート
  • Unix の実行形式ファイルを作成
    • 複数の backend
      • ocamlc: バイトコードコンパイラ
        • バイトコードインタプリタ (ocamlrun) を実行に使用
        • デバッガをサポート
      • ocamlopt: ネイティブコードコンパイラ
        • SPARC や x86 などの機械語を直接生成
ocaml 2
Ocaml のコンパイラ (2)
  • 拡張子一覧
    • ソースファイル
      • .ml → module の実装 (structure)
      • .mli → module のインタフェース (signature)
    • オブジェクトファイル
      • .cmo → 実装のバイトコード
      • .cmi → インタフェース定義のバイトコード
      • .cmx → 実装のネイティブコード
      • .cma, .cmxa → ライブラリ
slide20
分割コンパイル (1)
  • *.ml と *.mli
    • 実装とインタフェースをそれぞれ記述
      • module SomeThing : sig [someThing.mli の内容]end= struct [someThing.ml の内容]endに相当 (モジュール名の先頭を小文字化)
    • .mli をコンパイル → .cmi を生成
    • .ml をコンパイル → .cmi が無ければ制約無しで生成、あれば型チェック
slide21
分割コンパイル (2)
    • mySet.mli, mySet.ml
      • module MySet の定義
    • uniq.ml
      • メインプログラムのモジュール
slide22
分割コンパイル (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 myuniqmySet.cmo uniq.cmo

% ls -F myuniq

myuniq*

順序が重要: モジュールの定義/依存順

slide23
分割コンパイル (4)
  • 実行例 (1)

% ./myuniq

OCaml

Standard ML

C++

OCaml

^D

1 C++

2 OCaml

1 Standard ML

%

slide24
分割コンパイル (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>

slide25

第 4 回 課題

締め切り: 7/513:00

slide26
課題0
  • myuniq の例を自分でやってみること。
      • 実行ファイル生成
      • mySet.cmo をインタプリタに読み込んでみる
    • 次回以降のインタプリタの課題で使えないと困ります。
    • 提出はしなくて結構です。
slide27
課題1
  • リストなどの別のデータ構造を使って signature MULTISET に対する別の実装を与えよ。
    • structure の書き方の練習。そんなに難しくはないと思います。
slide28
課題2
  • lecture4-ex2 は簡単なパスワード付き銀行口座の例であるが、fst a1 や BankAccountImpl.accounts などで、秘密の情報である暗証や口座一覧が操作可能である。そこで、この moduleに適用する signature を作り、これらの情報を隠蔽せよ。
    • signature の練習。割と簡単。
slide29
課題2 (仕様)
  • 公開すべきもの
    • deposit, withdraw, balance, bank_statistics
    • 型 account の存在
  • 隠蔽すべきもの
    • 型 t の実装: 残高を操作できる
    • 値 accounts: 他口座の instance が得られる
    • その他の関数: 認証を回避できる
3 optional
課題3 (optional)
  • ORDERED_TYPE で表現される型の key と、任意の型の値についての連想配列を作り出す functor を作れ。
    • functor の練習。前2問よりは難しいか?
slide31
課題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

slide32
課題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 = “(* *)”

4 optional
課題 4 (optional)
  • 環 (ring) を表すモジュールを受け取ってその環を係数とする多項式の環を返すfunctor を実装する課題
    • 詳しくは別紙
slide34
レポート提出上の注意 (1)
  • 提出方法: 電子メール
    • 宛先: ml-report@yl.is.s.u-tokyo.ac.jp
      • 受領通知が届くと思うので確認のこと
  • Subject を Report <レポート番号> <学生証番号> とすること
    • 今回の場合 “Report 4510xx”
  • 地下以外から提出する場合, 地下計算機のアカウントを書くこと
  • レポートは添付ファイルにせず, メール本文に記述すること
slide35
レポート提出上の注意 (2)
  • レポート本文に含めるべきもの
    • 氏名, 学生証番号
    • ソース
      • コメントを適宜補い, 各関数の動作を説明すること
    • 動作例
      • プログラムが正しく動作することを示すのにふさわしい例を考えること
    • 考察
      • 考察不要と指定されている場合を除き, 必ず入れる