2006/7/18(通信コース)2006/7/26(情報コース) 住井

Slides:



Advertisements
Similar presentations
プログラミング演習B ML編 第1回 2006/6/20 (通信コース) 2006/6/28 (情報コース) 住井 ~sumii/class/proenb2006/ml1/
Advertisements

プログラミング演習( 2 組) 第 9 回
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
7/10 if 文課題 力作が多くて感心! 演習1:キーボードから2つの整数を入力し、小さい方の数字を 表示せよ。
情報処理実習 看護2班 レポート課題 情報(実習) レポート課題 2016年6月29日(水).
演算、整数型と浮動小数点型 第3回目 [4月27日、H.16(‘04)] 本日のメニュー 1)前回の課題・宿題 2)ファイルサーバの利用
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
プログラミング演習(1組) 第7回
関数(1) 第11回 [6月29日、H.16(‘04)] 今日のメニュー 1 前回の課題 2 前回の宿題 3 いろいろな関数の演習 4 課題
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
プログラミング基礎I(再) 山元進.
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
コンパイラ 2011年10月17日
ソフトウェア基礎科学 授業資料: 論理関係(logical relations)のお話
ファーストイヤー・セミナーⅡ 第8回 データの入力.
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング基礎I(再) 山元進.
多重ループ 繰り返し構造:補足事項 第8回目 [6月8日、H.16(‘04)] 本日のメニュー 1)前回の課題について
多重ループ 繰り返し構造:補足事項 第8回目 [6月12日、H.15(‘03)] 本日のメニュー 1)前回の課題について
型宣言 (Type Declarations)
型宣言(Type Declarations)
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
第8回 プログラミングⅡ 第8回
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
条件式 (Conditional Expressions)
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
~sumii/class/proenb2010/ml4/
コンパイラ 2012年10月15日
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
プログラミング言語論 第12回 関数型プログラミング 情報工学科 篠埜 功.
第10回 プログラミングⅡ 第10回
2007/6/5(通信コース)2007/6/6(情報コース) 住井
~sumii/class/proenb2010/ml1/
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
プログラミング演習(2組) 第8回
第10回関数 Ⅱ (ローカル変数とスコープ).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
~sumii/class/proenb2009/ml1/
4.リスト,シンボル,文字列.
第4回 ファイル入出力方法.
C言語 はじめに 2016年 吉田研究室.
15.cons と種々のデータ構造.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
Type Systems and Programming Languages
プログラミング演習I 2003年7月2日(第11回) 木村巌.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
PROGRAMMING IN HASKELL
~sumii/class/proenb2010/ml2/
~sumii/class/proenb2009/ml4/
2006/6/27(通信コース)2006/7/5(情報コース) 住井
2008/7/16(情報コース)2008/7/22(通信コース) 住井
~sumii/class/proenb2009/ml6/
PROGRAMMING IN HASKELL
~sumii/class/proenb2010/ml5/
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
2007/6/26(通信コース)2007/6/27(情報コース) 住井
Presentation transcript:

2006/7/18(通信コース)2006/7/26(情報コース) 住井 プログラミング演習B ML編 第5回 2006/7/18(通信コース)2006/7/26(情報コース) 住井 http://www.kb.ecei.tohoku.ac.jp/ ~sumii/class/proenb2006/ml5/

今日のポイント 「組」とパターンマッチングの続き 多相データ型 モジュールとライブラリ

レポートについて 課題の解答を ml-enshu@kb.ecei.tohoku.ac.jp にメールせよ。件名(Subject)は必ず kadai5:A1TB2345:東北太郎 の形にすること(氏名以外半角)。 締め切りは2006年8月22日(火)正午厳守。 質問は上述のアドレスにメールせよ。 レポートの不正は試験の不正と同様に処置する。 第何回の課題か(一桁の数字) 自分の学籍番号 自分の氏名

前回の復習 レコード:複数の値を組み合わせた値(ラベルで区別) バリアント:複数の値のどれか一つを表す値(コンストラクタで区別) { surname = "Sumii", given = "Eijiro", age = 20 } バリアント:複数の値のどれか一つを表す値(コンストラクタで区別) datatype int_or_error = Int of int | Error

組 (pair, tuple) ラベルが番号であるような、 特殊なレコード - val t = ("Sumii", "Eijiro", 20) ; val t = ("Sumii","Eijiro",20) : string * string * int - #1 t ; val it = "Sumii" : string - #2 t ; val it = "Eijiro" : string - #3 t ; val it = 20 : int

組の構文 組:(式1, 式2, 式3, ..., 式n) 組の型:型1 * 型2 * 型3 * ... * 型n 引数や返値が不要な関数において、 ダミーの値としてよく用いられる 組の型:型1 * 型2 * 型3 * ... * 型n {1:型1, 2:型2, 3:型3, ..., n:型n} というレコード型と同じ 空のレコード型{}はunit型と同じ

前回の復習2 バリアントのパターンマッチング - datatype itree = = ILeaf of int = | INode of { left : itree, = right : itree } ; datatype itree = ILeaf of int | INode of {left:itree, right:itree} - fun isum t = case t of = ILeaf i => i = | INode r => isum (#left r) + = isum (#right r) ; val isum = fn : itree -> int

バリアント以外の パターンマッチング レコード 組 - fun isum t = case t of = ILeaf i => i = | INode { left = l, right = r } => = isum l + isum r ; val isum = fn : itree -> int 組 - val t = ("Sumii", "Eijiro", 20) ; val t = ("Sumii","Eijiro",20) : string * string * int - case t of (s1, s2, _) => s2 ^ " " ^ s1 ; val it = "Eijiro Sumii" : string

"Don't care" (どうでも良い) を表すパターン バリアント以外の パターンマッチング レコード - fun isum t = case t of = ILeaf i => i = | INode { left = l, right = r } => = isum l + isum r ; val isum = fn : itree -> int 組 - val t = ("Sumii", "Eijiro", 20) ; val t = ("Sumii","Eijiro",20) : string * string * int - case t of (s1, s2, _) => s2 ^ " " ^ s1 ; val it = "Eijiro Sumii" : string "Don't care" (どうでも良い) を表すパターン

バリアント以外の パターンマッチング(続き) 整数 - fun fib n = case n of = 0 => 0 = | 1 => 1 = | n => fib (n - 1) + fib (n - 2) ; val fib = fn : int -> int 参考:パターンマッチングは 関数定義に直接記述することもできる fun fib 0 = 0 | fib 1 = 1 | fib n = fib (n - 1) + fib (n - 2) 上の二つに当てはまらないとき

多相データ型 例題:次のデータ型を定義せよ。 整数を葉とする木itree 文字列を葉とする木stree 浮動小数を葉とする木rtree

解答例? 同じことを何度も書いていて無駄! - datatype itree = ILeaf of int = | INode of itree * itree ; datatype itree = ILeaf of int | INode of itree * itree - datatype stree = SLeaf of string = | SNode of stree * stree ; datatype stree = SLeaf of string | SNode of stree * stree - datatype rtree = RLeaf of real = | RNode of rtree * rtree ; datatype rtree = RLeaf of real | RNode of rtree * rtree 同じことを何度も書いていて無駄!

葉の型が多相的(型変数)である 木のデータ型 - datatype 'a tree = = Leaf of 'a | Node of 'a tree * 'a tree ; datatype 'a tree = Leaf of 'a | Node of 'a tree * 'a tree - fun size t = (* 共通して使える関数の例 *) = case t of = Leaf _ => 1 = | Node(l, r) => size l + size r ; val size = fn : 'a tree -> int - size (Node(Leaf 3, Leaf 5)) ; val it = 2 : int - size (Node(Leaf true, Leaf false)) ;

課題5. 1 式Node(Leaf 3, Leaf 5)とNode(Leaf true, Leaf false)の型は、それぞれ何になるか、確かめよ。 型がstring treeになるような式を三つ挙げよ。 式Node(Leaf 3, Leaf "abc")の評価を試みて、結果を考察せよ。 sizeが1, 3, 10になるような木の例を、一つずつ作れ。それぞれ違う型にすること。

課題5. 2 先の'a tree型の値を受け取って、それがLeafだったらtrueを、Nodeだったらfalseを返す関数is_leafを定義せよ。

課題5. 3 (optional) option型とは、 type 'a option = SOME of 'a | NONE と定義された多相データ型である。前回のデータ型int_or_errorのかわりに、option型を用いて、前回のmy_divやmy_modに相当する関数を定義せよ。

リストとリスト型 ある一つの型の値を、順にいくつか並べたもの [式1, 式2, 式3, ..., 式n] 多相データ型の一種とみなせる datatype 'a list = nil | :: of 'a * 'a list 空のリスト 先頭要素と、残りのリストを つなげたノード(consセル)

例 - [1, 2, 3] ; val it = [1,2,3] : int list - [true, false] ; val it = [true,false] : bool list - [] ; val it = [] : 'a list - nil ; - 1 :: [2, 3] ; - true :: false :: [] ;

注意 ::は要素とリストを接続する リストとリストを連結するのは@ - 1 :: [2, 3] ; val it = [1,2,3] : int list - [1, 2] :: [3, 4] ; stdIn:2.1-2.17 Error: operator and operand don't agree [literal] ... リストとリストを連結するのは@ - [1, 2] @ [3, 4] ; val it = [1,2,3,4] : int list

課題5. 4 長さ(要素の数)が3であるような、型の異なるリストを4つ挙げよ。 123 :: xと"abc" :: xの どちらも型エラーにならない、というリストxは存在するか?

リストのパターンマッチング リストも多相データ型の一種なので、パターンマッチングが使える 例: fun length x = case x of nil => 0 | _ :: y => 1 + length y

課題5. 5 (optional) 関数fとリスト[v1, v2, v3, ..., vn]を受け取って、それぞれの要素にfを適用したリスト[f v1, f v2, f v3, ..., f vn]を返す、という関数mapを書け。また、その型を考察せよ。 先の関数lengthと上の関数mapについて、任意のリストxと関数fに対し、length xとlength (map f x)の返り値が(もしあれば)等しいことを、 xの長さに関する数学的帰納法で示せ。

モジュールとライブラリ モジュールの名前.関数などの名前 CやJavaと同様に、MLにもあらかじめ用意されている関数や値の集まり(ライブラリ)がある。 MLのライブラリはモジュールないしストラクチャという単位に分割されており、 モジュールの名前.関数などの名前 のような形で用いることができる。

Standard MLおよびStandard ML of New Jerseyのライブラリ マニュアルのコピー http://www.kb.ecei.tohoku.ac.jp/ ~sumii/class/proenb2006/library/ 例:Mathモジュールについては "SML" → "SML Basis Manual Pages" → "The MATH signature"と辿れば良い シグネチャ:モジュール(ストラクチャ)のインターフェースのこと

例題:K教授の算数トレーニング 次のようなプログラムを書け。 1桁の非負整数x, yをランダムに作る。 画面に「x + y = ?」と出力する。ただしxとyは実際の数字でおきかえる。 キーボードから整数を入力する。 入力された整数がx + yと等しければCorrect、等しくなければWrongと画面に出力する 1.に戻る

解答例 http://www.kb.ecei.tohoku.ac.jp/ ~sumii/class/proenb2006/ training.sml 注: use "ファイル名"でファイルからプログラムを読み込める (式1;式2;...;式n)は、まず式1, 式2, ...を評価し、それらの値を無視して、それから式nを評価する、という構文

課題5. 6 training.smlを改造し、問題を10回出題したら、何問正解だったか表示して終了するようにせよ。

課題5. 7 (optional) Standard MLまたはObjective Camlで、自分の役に立つプログラムを何か書け。