Survey: First-Class Structures for Standard ML 米澤研究室修士1年 増山隆 [email protected] 発表の概要 MLのModuleの概要 拡張 Moduleの型付け Semantic Object Denotation Judgements Classification Judgements MLのModuleの概要 MLのModule Core言語 アルゴリズムを記述する Module言語 Coreでかかれた定義をまとめる 型を抽象化する structure signature functor structure 型や変数の定義のリス ト Module言語における値 structure TwoOnwards = struct type state = int; val start = 2; val start2 = 100; val next = fn i => succ i; val value = fun i => i; end 型を定義 値を定義 signature structureのインターフェイス Module言語における型(のようなもの) signature Stream = sig type state; 型の指定 val start: state; 変数名とその型を指定 val next: state; val value: state -> int; end signatureの役割 structureに 型を抽象化 structureの要素を隠蔽 structure Start = TwoOnwards :> State; 例) Startは 抽象型state (int で実装されていることは隠蔽) start, next, valueという変数 があるstructure (start2は隠蔽される) functor structureからstructureへの関数 functor Value (S: Stream) = struct val value = S.value (S.start) end 不満な点1 Module言語には条件分岐がない structure A = if isDebug then struct ... end else struct ... end のようにできるとうれしい 不満な点2 Module言語ではループが書けない 例: Fig4のEratostenesの篩 functorの適用回数が定数回になってしまう Next(Next(Next(Start))) functorの適用が実行時にできると、Module言語を 汎用の計算に用いることができる 拡張 拡張 Core言語を拡張する package typesを導入 pack, open 式を追加 pack pack s as S structure s を signature Sで制限してpackage化 する。 mosmlでは [structure s as S] open (unpack) open s as X : S in e’ e’の中で X = s :> S としてstructure Xを使用でき るようにする mosmlでは [let] structure X as S = s [in e’ end] (structure XがCoreの式のスコープの中で宣言される) packageの使用例 Sieve.nextのおかげでfunctor Nextを実行時に繰り返し適用できる 型付け Semantic Objects structure, functorに型としてSemantic Objectを割り当てる SignatureをDenotation Judgementによって Semantic Objectに変換する ∃P.S signature ΛP.S functor ∀P.( S -> ∃P.S ) structure signature matchingなどはこのSemantic Objectレベルで行う c.f. A Modular Module Systemではstructureにsignatureを付 けていた Semantic Object (signature) sig type state val start : state val next : state -> state val value : state -> int end Λ{α}. ( state |> α, start : α, next : α -> α, value : α -> int ) Semantic Object (structure) 内部で導入された抽象型に 対する型変数 struct type state = int; val start = 2; val next = fn x => x + 1; val value = fn x => x end end :> Stream ∃{β}. ( state |> β, start : β, next : β -> β, value : β -> int ) Semantic Object (functor) パラメター化された型 functor Next (S : Stream) = struct (* Streamにマッチする structure *) end ∀{γ}. ((state |>γ, start :γ, next : γ -> γ, value : γ -> int) -> ∃φ.( state |>γ, start :γ, next : γ -> γ, value : γ -> int)) RussoのModule言語設計 structure functor Classification Judgements ∃P.S signature Denotation Judgements ∀P.( S -> ∃P.S ) ΛP.S semantic object パス (p.t) が現れない(structureの値によらない型表現 → non-dependent type) 型変数で依存性を表現 MLの文法では書き表せない Harper,Lillibridge,Leroyの Module言語設計 structure functor signature 型としてsignatureを使う 型の表現にパスが現れる パスを使用して依存性を表現 (1st order dependent type) MLの文法で表現可能 2つの方式の比較 structure A = struct type t = int end :> sig type t end structure B = struct type u = A.t end Semantic Object A : ( t |> α) B : ( u |> α) Bを見終わった後の環境 Signature A : sig type t end B : sig type t = A.t end Semantic Objectを型として使用する 利点 Principal typeをもつ package typesの等価性比較は決定可能 Enrichment を定義 Relation(subtyping)によって等価性 Denotation Judgements Classification Judgements (1/3) Classification Judgements (2/3) Classification Judgements (3/3) package typeのDenotation Judgement packのClassification Judgement openのClassification Judgement 5行目: 返値の型にpackage eの中の抽象型が含まれない まとめ Coreに単純な拡張(pack, open)を加えること でFirst-Class structureの機能を提供できた structureを実行時に差し替える 一般の計算に使用できる 型システムには悪い影響を及ぼさない Semantic Objectを使用して意味を定義 (Non-dependent type) 型付けは決定可能 参考文献 First-Class Structures for Standard ML Claudio Claudio V. Russo, ICFP 1999 Non-Dependent Types for Standard ML Modules Claudio V. Russo, PPDP 1999 Types for Modules Claudio V. Russo, 1998 Moscow ML http://www.dina.dk/~sestoft/mosml.html
© Copyright 2024 ExpyDoc