ML Datatypes: Standard and Concrete

ML Datatypes: Standard and Concrete

Discover the two types of ML datatypes: standard and concrete. Learn how they differ, their examples, and how to use them in your code.

  • Uploaded on | 0 Views
  • juliya juliya

About ML Datatypes: Standard and Concrete

PowerPoint presentation about 'ML Datatypes: Standard and Concrete'. This presentation describes the topic on Discover the two types of ML datatypes: standard and concrete. Learn how they differ, their examples, and how to use them in your code.. The key topics included in this slideshow are ML datatypes, standard, concrete, constructors, expressions, patterns,. Download this presentation absolutely free.

Presentation Transcript

1. ML Datatypes. 1 Standard ML Standard ML Data types Data types

2. ML Datatypes. 2 Concrete Data Concrete Data Consists of constructions that can be inspected, taken apart, or joined to form larger constructions Examples of concrete data: Lists Test whether or not empty Divide (a non-empty list) into its head and tail Join in new elements Trees, Logical proposition, etc. datatype Defines a new type along with its constructors A constructor In an expression: creates a value of a datatype In a pattern: describe how to take a value apart

3. ML Datatypes. 3 Types of Drinks Types of Drinks Cataloguing all types of drinks Coffee has a brand, number of sugar lumps and w/o milk e.g. Elite, 2 sugars, with milk - type Coffee = string*int*bool; Wine has vineyard name. e.g Shato-Lablan - type Wine = string; Beer has brand name. e.g. Paulaner. - type Beer = string; Water is simply water. There is nothing more to say. - type Water = unit; The datatype declaration for the type drink: datatype drink = Water | Coffee of string*int*bool | Wine of string | Beer of string;

4. ML Datatypes. 4 Values of a datatype Values of a datatype May belong to compound data structures - val drinks = [Water, Coffee (Elite,2,true), Beer Paulaner"]; val drinks = [Water,Coffee ("Elite",2,true),Beer "Paulaner"] : drink list May be arguments and results of functions Remember Patterns?

5. ML Datatypes. 5 Constructors in Patterns Constructors in Patterns Create titles for drinks: fun title Water = Natures best Drink!" | title (Beer brand) = brand^ Beer | title (Wine brand) = brand^ Wine | title (Coffee (brand, sugars, true)) = brand^ Coffee with ^ Int.toString(sugars)^ lumps, with milk | title (Coffee (brand, sugars, false)) = brand^ Coffee with ^ Int.toString(sugars)^ lumps, no milk; > val title = fn : drink -> string Get brand names of drinks in a list : fun pname [] = [] | pname ((Beer s)::ps) = s::(pname ps) | pname ((Wine s) ::ps) = s::(pname ps) | pname ((Coffee (s,_,_)) ::ps) = s::(pname ps) | pname (p :: ps) = pname ps; > val pname = fn : drink list -> string list

6. ML Datatypes. 6 Patterns in Value Declarations Patterns in Value Declarations val P = E Defines the variables in the pattern P to have the corresponding values of expression E . Extracting a brand name - val p = Beer Paulaner"; - val (Beer s) = p; val s = " Paulaner " : string - val (Wine s) = Beer "Paulaner"; uncaught exception nonexhaustive binding failure What will happen for the following: - val Water = Water; - val Water = Paulaner"; val declaration fails if the matching fails (* OK *) (* FAIL - types mismatch *) Can't ruin constructors

7. ML Datatypes. 7 Enumeration Datatypes Enumeration Datatypes Enumeration types A datatype consisting of a finite number of constants datatype bool = true | false; fun not true = false | not false = true But no order on the elements like Pascal, C

8. ML Datatypes. 8 Polymorphic Datatypes Polymorphic Datatypes We can use datatypes to unite two different types: datatype number = whole of int | fraction of real ; We can abstract on this idea, and create a datatype uniting any two types; a and b datatype ('a,'b)union = type1 of 'a | type2 of 'b; Three things are declared as a result: the type operator union the two constructors type1 : 'a -> ('a,'b)union type2 : 'b -> ('a,'b)union

9. ML Datatypes. 9 Datatype ('a,'b)union Datatype ('a,'b)union ('a,'b) union is a disjoint union of 'a and 'b Contains a copy of 'a OR a copy of 'b type1 and type2 can be viewed as labels that distinguish 'a from 'b Allows several types where only a single type is allowed: ((string,int)union)list comprises string and integers [type2 Water,type1 "Technion"] : ((string,drink)union) list [type1 "Audi",type2 80,type1 "Technion"] : ((string,int)union)list type1 "Technion" : (string, 'a) union

10. ML Datatypes. 10 The Disjoint union The Disjoint union Pattern-matching can test whether type1 or type2 is present - fun concat1 [] = "" | concat1 ((type1 s)::l) = s ^ concat1 l | concat1 ((type2 _)::l) = concat1 l; val concat1 = fn:(string, 'a)union list -> string The disjoint union can express any other non-recursive datatype The type drink can be represented by: ((unit,string*int*bool)union,(string,string)union)union With the following constructors: Water = type1(type1()) Coffee(b,s,m)= type1(type2(b,s,m)) Wine(b)= type2(type1(b)) Beer(b)= type2(type2(b))

11. ML Datatypes. 11 Trees Trees datatype 'a tree = Lf | Br of 'a * 'a tree * 'a tree - val tree2 = Br(2,Br(1,Lf,Lf),Br(3,Lf,Lf)); val tree2 = Br (2,Br (1,Lf,Lf),Br (3,Lf,Lf)) : int tree - val tree5 = Br(5,Br(6,Lf,Lf),Br(7,Lf,Lf)); val tree5 = ... : int tree - val tree4 = Br(4,tree2,tree5); val tree4 = Br(4,Br(2,Br(1,Lf,Lf),Br(3,Lf,Lf)), Br(5,Br(6,Lf,Lf),Br(7,Lf,Lf))) : int tree - fun count Lf = 0 | count (Br(v,t1,t2)) = 1 + count t1 + count t2; val count = fn : a tree -> int

12. ML Datatypes. 12 Binary Search Trees Binary Search Trees The search tree will hold pairs of (key,value). The key will be an int. The tree is sorted so any key on the left sub-tree is smaller than the current key (larger for the right sub-tree) 7 3 1 5 6 9 10 Remember: We will work on trees of pairs

13. ML Datatypes. 13 Binary Search Trees - Search & Insert Binary Search Trees - Search & Insert exception Bsearch of string; fun blookup(Br((a,x),t1,t2), b) = if b val blookup = fn:(int * a) tree * int -> a fun binsert(Lf, b, y) = Br((b,y), Lf, Lf) | binsert(Br((a,x),t1,t2),b,y) = if b val binsert = fn:(int * a)tree * int * a -> (int * a)tree

14. ML Datatypes. 14 Question from a test (2004) Question from a test (2004) 1 ' : datatype ('a,'b) union = type1 of 'a | type 2 of 'b; -- foo - ML : ( unit , ( bool ->'a) * ( bool ->'b) ) union -> ( unit , ( ( bool , bool ) union -> ('a,'b) union ) ) union . : fun foo (type1___) = _____ | foo (type2 (f: bool->'a, g: bool->'b) ) = ____________________________ _____________________________________; fun foo (type1()) = type1() | foo (type2((f: bool ->'a,g: bool ->'b))) = type2( fn (type1(b)) => type1(f(b)) | (type2(b)) => type2(g(b)) );