“Extensible Pattern Matching via a Lightweight Language Extension” の Survey POPL meeting 7/25 Kazuhiro Inaba

Slides:



Advertisements
Similar presentations
オレと型推論と 少年オッカムル 関数型言語 OCaml 再帰関数 リスト プログラミングの基礎 ダイクストラ法 Windows で文字化け F# モジュール ファンクタ 副作用 アキュームレータ.
Advertisements

プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Scala + Liftフレームワーク その2.
(Rubyistのための) 超音速:ML入門
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
プログラミング言語としてのR 情報知能学科 白井 英俊.
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
型宣言 (Type Declarations)
OCommand : 型安全な シェルプログラミングのための 領域特化言語の提案
型宣言(Type Declarations)
Natural Semantics 実行過程の、最初と最後の状態(state)の関係を考える。
C言語講座 第4回 ポインタ.
プログラミング言語論 第4回 手続きの引数機構 変数の有効範囲
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
条件式 (Conditional Expressions)
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
Tokuda Lab. NISHIMURA Taichi
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
ML 演習 第 3 回 新井淳也、中村宇佑、前田俊行 2011/04/26.
プログラミング言語論 第12回 関数型プログラミング 情報工学科 篠埜 功.
Solving Shape-Analysis Problems in Languages with Destructive Updating
プログラミング言語論 第2回 情報工学科 篠埜 功.
“Purely Functional Data Structures” セミナー
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
PROGRAMMING IN HASKELL
第3回 2007年4月27日 応用Java (Java/XML).
プログラミング言語論 第9回 Hoare論理の練習問題 手続きの引数機構 変数の有効範囲
関数の定義.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
1 T 行きがけ順: A B D F I J C G H 通りがけ順: D B I F J A G C H
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
お仕事にまったく役にたたない内容のコードレビューやりたいと思います。
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
コンパイラ演習 第11回 2006/1/19 大山 恵弘 佐藤 秀明.
第5回放送授業.
Cプログラミング演習 第10回 二分探索木.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
Eliminating Amortizations PurelyFunctionalDataStrctures 輪講 第6回
 型推論3(MLの多相型).
Type Systems and Programming Languages
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
ポインタとポインタを用いた関数定義.
Type Systems and Programming Languages ; chapter 13 “Reference”
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
PROGRAMMING IN HASKELL
第5回 プログラミングⅡ 第5回
2006/7/18(通信コース)2006/7/26(情報コース) 住井
PROGRAMMING IN HASKELL
Eijiro Sumii and Naoki Kobayashi University of Tokyo
18. Case Study : Imperative Objects
全体ミーティング 2010/05/19 渡邊 裕貴.
~sumii/class/proenb2010/ml5/
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
Haskell Programming Language
全体ミーティング(9/15) 村田雅之.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
Static Enforcement of Security with Types
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

“Extensible Pattern Matching via a Lightweight Language Extension” の Survey POPL meeting 7/25 Kazuhiro Inaba

出典 “Extensible Pattern Matching via a Lightweight Language Extension” Don Syme, Gregory Neverov, James Margetson Accepted for ICFP 2007 F# の “Active Pattern” という拡張に関する論文 現在公開されているバージョンで使うことができます ( Submitted Draft を Web から入手可能)

Motivation

Abstract Data Type でもパターンマッチした い 複数の View でパターンマッチしたい type complex = {abstract} let my_function c obj = match c with Polar(r, t) -> zoom r (rotate t obj) let another_function c = match c with Rect(x, y) -> x + y

Motivation なぜパターンマッチ?これでは不十分? パターンマッチ形式の利点は 読みやすい 特に Case-Analysis が必要な場合読みやすい (nil?, head, tail 関数によるリスト操作と比較せよ ) Exhaustiveness のチェックもできて安全 type complex = {abstract} let my_function c obj = zoom (abs c) (rotate (arg c) obj)

Examples

Active Patterns by Examples Total Patterns Single Total Patterns Decomposition with Recognizers Partial Patterns

Single Total Patterns (| 識別子 |) という名前の関数を定義  type complex = Rect of float * float ;; type complex = Rect of float * float  let (|Polar|) c = match c with Rect(x,y) -> (atan2 y x, sqrt(x*x+y*y)) ;; val (|Polar|) : complex -> float * float  let my_function c obj = match c with Polar(r, t) -> zoom r (rotate t obj) ;; パターンとして使用 ( let (r,t) = (|Polar|) c in … と同義 )

Decomposition (| 識別子 | 識別子 |…| 識別子 |) という名前の関数を定 義  let (|Snoc|Nil|) lst = if lst = [] then Nil else Snoc(rev(tl(rev lst)), hd(rev lst)) ;; val (|Snoc|Nil|) : ‘a list -> Choice  match [1;2;3] with Nil -> [] | Snoc(hh, t) -> hh ;; Val it : int list = [3; 1; 2] パターンとして使用

Decomposition パターンの完全性の静的検査  match [1;2;3] with Snoc(hh,t) -> hh ;; match [1;2;3] with Snoc(hh,t) -> hh ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stdin(59,0): warning FS0025: Incomplete pattern match. val it : int list = [3; 1; 2]

Partial Patterns 次のようなパターンマッチを書きたいことが ある 元々 complete でない 各 case が distinct でもない 後から case を付け足したくなる可能性がある type value = IntVal of int | FloatVal of float | ColorVal of int * int * int match str with | ParseInt i -> IntVal i | ParseFloat f -> FloatVal f | ParseColor c -> ColorVal c | _ -> failwith “invalid input”

Partial Patterns (| 識別子 |_|) という名前の関数を定義  let (|ParseInt|_|) s = let i = ref 0 in if Int32.TryParse (s,i) then Some !i else None ;; val (|ParseInt|_|) : string -> int option

Advanced Topics Parameterized Patterns Recursive Definition of Patterns

Parameterized Patterns パターンはパラメタライズできる  let (|ParseRegex|_|) re s = if match re s then Some s else None ;; val (|ParseRegex|_|) : regex -> string -> string option  match str with | ParseRegex “\\d+” s -> dec s\\d+ | ParseRegex “0x[\\dA-Fa-f]+” s -> hex s

Recursive Definition 実体は普通の関数なので、再帰的定義も可能  type ‘a joinlist = Empty | Single of ‘a | Join of ‘a joinlist * ‘a joinlist ;;  let rec (|Nil|Cons|) = function | Empty -> Nil | Single(x) -> Cons(x, Empty) | Join(Nil, Nil) -> Nil | Join(Nil,Cons(x,xs))-> Cons(x,xs) | Join(Cons(x,xs),ys) -> Cons(x,Join(xs,ys));;

Semantics

Naïve Operational Semantics Okasaki Condition Implementation

Naïve Operational Semantics 上から順に試す pat1 と v がマッチするか試す マッチしたら環境を拡張して expr1 を評価。しなかっ たら pat2 と v がマッチするか試す マッチしたら環境を拡張して expr2 を評価。しなかっ たら … match v with | pat1 -> expr1 | pat2 -> expr2 | …

Naïve Operational Semantics “pat1 と v がマッチするかどうか ” パターンに関して構造帰納的に ( ほぼ自明に ) 定義される Active Pattern p と値 v がマッチするかどうかは、 関数呼び出し式 (|p|) v の評価結果で決まる

Naïve Semantics ( 例 )  let (|Snoc|Nil|) = … ;;  match [1;2;3] with Nil -> [] | Snoc(hh, t) -> hh (* Nil -> [] *) match (|Snoc|Nil|) [1;2;3] with Choice_2_1 () -> [] | _ -> (* Snoc(hh,t) -> hh *) match (|Snoc|Nil|) [1;2;3] with Choice_2_2 (hh,t) -> hh

Okasaki Condition Naïve Semantics には一つ問題あり 副作用 (* Nil -> [] *) match (|Snoc|Nil|) [1;2;3] with Choice_2_1 () -> [] | _ -> (* Snoc(hh,t) -> hh *) match (|Snoc|Nil|) [1;2;3] with Choice_2_2 (hh,t) -> hh

Okasaki Condition Active Pattern はユーザーが自由に定義でき る関数であるため、 (|Snoc|Nil|) が参照透明 とは限らない 元のプログラムでは Exhaustive な match 文だが、 以下の semantics では fail する可能性がある (* Nil -> [] *) match (|Snoc|Nil|) [1;2;3] with Choice_2_1 () -> [] | _ -> (* Snoc(hh,t) -> hh *) match (|Snoc|Nil|) [1;2;3] with Choice_2_2 (hh,t) -> hh

Okasaki Condition Chris Okasaki, “Views for Standard ML”, 1998 Sensible な Semantic とするためには、「同じ引数 には高々1回しかユーザー定義パターンを適用し てはならない」 という制約が必要 一つの match 文の実行中は、ユーザー定義パター ン関数の1回目の呼び出し結果をテーブルに記憶 しておき、2回目以降は関数を呼ばずにその値を 返す

Implementation ※ 現在 ( 論文執筆時点 ) の実装は Okasaki Condition を満たしていない → Future Work [Scott and Ramsey 2000] Algorithm ( 効率的 に Decision Tree を作る Heuristics) を Active Pattern の追加に対応させるためちょっと変 更

Conclusion

Related Work データ構造に対する View の研究は最近盛んで 多くの関連研究がある ( Reference は略 ) [Peyton Jones 2007] による分類 Parameterized Patterns Partial Patterns Total Patterns Nesting Patterns as first-class values を全て兼ね備えているのは Active Pattern だけらしい

Future Work 主に、 F# にない Haskell 等の言語機能で Active Pattern と相性がいいものがないか探 りたい、としている E.g. “Monadic Pattern Matching” Partial Pattern と、それによる match 文は Maybe モ ナドとみなすことができる。これを任意の MonadPlus に拡張することは可能 / 有意義か?