ML 演習 第 4 回

Similar documents
ML 演習 第 4 回

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

コンパイラ演習第 11 回 2006/1/19 大山恵弘 佐藤秀明 今回の内容 バリアント / レコード 表現方法 型付け パターンマッチ 型付け switch 文への変換 簡単な最適化 マッチング漏れ 以降のフェーズでの処理 発展 exhaustivenessinformation の利用 パター

Parametric Polymorphism

Microsoft PowerPoint - 09.pptx

Functional Programming

コンパイラ演習 第 7 回

プログラミング基礎

ex04_2012.ppt

Objective Caml 3.12 Jacques Garrigue ( ) with Alain Frisch (Lexifi), OCaml developper team (INRIA)

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

PowerPoint プレゼンテーション

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

Microsoft PowerPoint - ruby_instruction.ppt

memo

第9回 型とクラス

ML λ λ 1 λ 1.1 λ λ λ e (λ ) ::= x ( ) λx.e (λ ) e 1 e 2 ( ) ML λx.e Objective Caml fun x -> e x e let 1

プログラミングD - Java

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

Microsoft PowerPoint - ml1.ppt

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

第10回 モジュール

Dive into Algebraic Effects

jssst-ocaml.mgp

memo

2018年度「プログラミング言語」配布資料 (7)

# 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

4 ソフトウェア工学 Software Engineering 抽象データ型 ABSTRACT DATA TYPE データ抽象 (data abstraction) 目的 : データ構造を ( 実装に依存せずに ) 抽象的に定義 方法 : データにアクセス (read, write) する関数の仕様

Jacques Garrigue

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

目次 1. 教育ネットひむかファイル転送サービスについて ファイル転送サービスの利用方法 ファイル転送サービスを利用する ( ひむか内 ) ファイル転送サービスへのログイン ひむか内 PCでファイルを送受信する

プログラミング実習I

Microsoft PowerPoint - enshu4.ppt [äº™æ‘łã…¢ã…¼ã…›]

4-4- 基スクリプト言語に関する知識 コードの作成や修正が容易とされるスクリプト言語を学習し アプリケーション開発の手法を習得する 本カリキュラムでは まずスクリプト言語に位置づけされる Perl PHP Python JavaScript Ruby といった Ⅰ. 概要プログラミング言語の特徴に

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

基礎プログラミング2015

プログラミングD - Java

Formal Engineering Methods for Software Development --An Introduction to SOFL--

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

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

Fortran 勉強会 第 5 回 辻野智紀

第8回 関数

Microsoft PowerPoint - 計算機言語 第7回.ppt

JavaプログラミングⅠ

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

JavaプログラミングⅠ

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

PowerPoint Presentation

2018 年度前期プロジェクト活動 Ritsumeikan Compiler Construction 班活動報告書 佐々木章徳青木雅典西見元希松本幸大

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

計算機プログラミング

memo

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - ProD0107.ppt

本チュートリアルについて 14 部構成 比較的簡単なトピックから 各回 プログラミング言語 任意 チュートリアルで 新しい内容 宿題 プログラミング演習 次の週 結果について発表 もしくは話し合いをする スライドは Python で Python, C++, Java, Perl についての質問い答

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Java知識テスト問題

PowerPoint プレゼンテーション

Prog1_10th

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

Microsoft PowerPoint - 11.pptx

Prog1_2nd

Microsoft PowerPoint - prog03.ppt

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

sinfI2005_VBA.doc

pp2018-pp9base

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

PowerPoint プレゼンテーション

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

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

program7app.ppt

Taro-ポインタ変数Ⅰ(公開版).j

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - chap10_OOP.ppt

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

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

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

Microsoft PowerPoint - 12.ppt [互換モード]

PowerPoint プレゼンテーション

Programming D 1/15

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

プログラミング入門1

Prog1_3rd

PowerPoint プレゼンテーション

Microsoft PowerPoint ppt

データ構造

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

3-1 SPIRIT Gmail を使う メールアドレスの仕組み 自分のメールアドレスを確かめる V-Campus では V-Campus ID を利用したメールアドレスが 一人ひとりに用意されています メールアドレスとは 電子メールの利用者を識別するための宛名にあたるものです V-Campus で

C#の基本

PowerPoint プレゼンテーション

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

PowerPoint プレゼンテーション

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

ガイダンス

Prog1_15th

Transcription:

ML 演習第 4 回 佐藤春旗, 山下諒蔵, 前田俊行 2006/06/20

ICFP Programming Contest 過去の O'Caml プログラムの実績 1998: 2 位 (ENS Camlist, France) 1999: 1 位 (Camls R Us, O'Caml 作者グループ ) 2000: 1 位 (PLClub, U-Penn, 米澤研住井, 細谷参加 ) 2 位 (Camls R Us) 2001: 入賞選外 (3 位タイ ) 2002: 1 位 (TAPLAS, 米澤研 : 大岩, 関口, 住井 ) 2003: 入賞選外 2004: 入賞選外 (1 位から 4 位まで Haskell ) 2005: 入賞選外 (1 位 :Haskell, 6 位 :O'Caml) 2

等値演算子 (1) 2 種類の等値演算子がある = ( 否定 : <>): 構造的な一致 複合データの中身まで探索 Scheme の equal? に相当 == ( 否定 :!=): 物理的な一致 アドレス のみを見る Scheme の eq? に相当 より詳しい定義はマニュアル参照 == の方が識別力が強い (x == y) が成り立てば (x = y) も成り立つ 例外もある (nan など ) 3

等値演算子 (2) # let test x y = (x = y, x == y);; val test : a -> a -> bool * bool = <fun> # test 1 1;; - : bool * bool = true, true # test 1.0 1.0;; - : bool * bool = true, false # test string string ;; - : bool * bool = true, false float や string の定数は別々の場所に確保されることがある 4

等値演算子 (3) # test (ref 1) (ref 1);; - : bool * bool = true, false # let r = (ref 1) in test r r;; - : bool * bool = true, true 参照先が等しければ参照同士も等しい # (fun x -> x) = (fun x -> x);; Exception: Invalid_argument equal: functional value # (fun x -> x) == (fun x -> x);; - : bool = false # let f = (fun x -> x) in test f f;; Exception: Invalid_argument equal: functional value 異なる場所に確保された値への参照なので false 関数同士が内容的に等しいかどうかは一般に決定不能 5

比較演算子 <, >, <=, >= 型 : α α bool 何でも比べられる = と対応した演算子 整数 実数 数値で比較 文字列 文字 辞書式順序で比較 その他のオブジェクト 実装依存 注 : 循環参照を持つデータでは止まらないことがある 6

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

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

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

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

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

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

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 13

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 にアクセスできる 14

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

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> 抽象データ型の内容は隠蔽される 16

signature の適用 (2) # open AbstractMultiSet;; remove_top は外から見えない # 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 は違う型!! 17

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

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

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 20

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 = 渡す structure を変えるだけで新しい Set を作れる AbstractSet2(NCString).t but is here used with type AbstractStringSet.t = AbstractSet2(OrderedString).t 21

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

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

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

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

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

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

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

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

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

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

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

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

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

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

課題 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 36

課題 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 = (* *) 37

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

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

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