~sumii/class/proenb2010/ml5/

Slides:



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

情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
7/10 if 文課題 力作が多くて感心! 演習1:キーボードから2つの整数を入力し、小さい方の数字を 表示せよ。
プログラミング演習(1組) 第7回
ヒープソートの演習 第13回.
関数(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回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング基礎I(再) 山元進.
型宣言 (Type Declarations)
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
型宣言(Type Declarations)
第8回 プログラミングⅡ 第8回
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
条件式 (Conditional Expressions)
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月6日、H.16(‘04)] 今日のメニュー 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回関数 Ⅱ (ローカル変数とスコープ).
プログラミング演習I 2003年5月7日(第4回) 木村巌.
情報とコンピュータ 静岡大学工学部 安藤和敏
~sumii/class/proenb2009/ml1/
4.リスト,シンボル,文字列.
プログラミングⅠ 平成30年10月22日 森田 彦.
C言語 はじめに 2016年 吉田研究室.
15.cons と種々のデータ構造.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
Type Systems and Programming Languages
プログラミング演習I 2003年7月2日(第11回) 木村巌.
PROGRAMMING IN HASKELL
~sumii/class/proenb2010/ml2/
~sumii/class/proenb2009/ml4/
2006/7/18(通信コース)2006/7/26(情報コース) 住井
2006/6/27(通信コース)2006/7/5(情報コース) 住井
2008/7/16(情報コース)2008/7/22(通信コース) 住井
~sumii/class/proenb2009/ml6/
PROGRAMMING IN HASKELL
Eijiro Sumii and Naoki Kobayashi University of Tokyo
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング 平成28年10月25日 森田 彦.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング言語論 プログラミング言語論 演習7 解答と解説 演習7 解答と解説 1.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
2007/6/26(通信コース)2007/6/27(情報コース) 住井
Presentation transcript:

http://www.kb.ecei.tohoku.ac.jp/ ~sumii/class/proenb2010/ml5/ プログラミング演習B ML編 第5回 2010/7/6(コミ) 2010/7/7(情報・知能) 住井 http://www.kb.ecei.tohoku.ac.jp/ ~sumii/class/proenb2010/ml5/

今日のポイント 「組」とパターンマッチングの続き 多相データ型 リストとリスト型

レポートについて 電気・情報系内のマシンから http://130.34.188.208/ (情報・知能) にアクセスし、画面にしたがって提出せよ。締め切りは一週間後厳守。 初回は画面にしたがい自分のアカウントを作成すること。 「プログラム」のテキストボックスがある課題では、 プログラムとしてsmlに入力した文字列のみを 過不足なく正確にコピー&ペーストして提出せよ。 (smlの出力は「プログラム」ではなく考察に含めて書くこと。) プログラムの課題でも必ず考察を書くこと。 提出したレポートやプログラムの実行結果は「提出状況」から 確認できる。 質問はml-enshu@kb.ecei.tohoku.ac.jpにメールせよ。 レポートの不正は試験の不正と同様に処置する。

前回の復習 レコード:複数の値を組み合わせた値(ラベルで区別) バリアント:複数の値のどれか一つを表す値(コンストラクタで区別) { 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になるような式を三つ挙げよ。 string treeとstreeは別の型なので気をつけよ 式Node(Leaf 3, Leaf "abc")の評価を試みて、結果を考察せよ。 sizeが1, 3, 10になるような木の例を、一つずつ作れ。それぞれ違う型にすること。

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

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

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

例 - [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 次の考え方に基づき、'a tree型の値tを深さ優先探索して'a list型の値に変換する関数dfsを定義せよ。 tがLeaf xの形だったら、xのみを要素とする、長さ1のリストを返す。 tがNode(l,r)の形だったら、左の木lの変換結果と、右の木rの変換結果を連結する。

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