File: Test086.ML

package info (click to toggle)
polyml 5.6-8
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 31,892 kB
  • ctags: 34,453
  • sloc: cpp: 44,983; ansic: 24,520; asm: 14,850; sh: 11,730; makefile: 551; exp: 484; python: 253; awk: 91; sed: 9
file content (29 lines) | stat: -rw-r--r-- 811 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(* Tests on coercions that apply between structures and signatures. *)

functor F():
    sig
        val a: exn and b: string->exn
        val checkA: (unit -> unit) -> unit
        val checkB: (unit -> unit) -> string
        type t
        val c: t and d: int->t
        val checkC: t -> unit and checkD: t -> unit
    end
=
    struct
        exception a and b of string
        datatype t = c | d of int
        
        fun checkA f = f() handle a => ()
        fun checkB f = (f(); "bad") handle b s => s
        fun checkC c = () | checkC _ = raise Fail "bad"
        fun checkD (d 1) = () | checkD _  = raise Fail "bad"
        
    end;

structure S = F();

S.checkA(fn () => raise S.a);
if S.checkB(fn () => raise S.b "test") = "test" then () else raise Fail "failed";
S.checkC S.c;
S.checkD (S.d 1);