datatype suit = Hearts | Clubs | Spades | Diamonds; (* datatype rank = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace; *) datatype rank = Numbered of int | Jack | Queen | King | Ace; (* type card = rank * suit; *) datatype card = Card of (rank * suit); val suits = [Hearts, Clubs, Spades, Diamonds]; fun intsFromTo (l,h) =if l>h then [] else l::(intsFromTo(l+1,h)); val ranks = [Jack,Queen,King,Ace] @ (map Numbered (intsFromTo(2,10))); fun cross xs ys = foldr (op @) [] (map (fn x => map (fn y => (x,y)) ys) xs); val deck = map Card (cross ranks suits); fun whatSuit (Card (r,s)) = s;