75 lines · 2.1 KB · Standard ML
RawDownload
functor F(A:sig val a : unit end)(B:sig val b: unit end)(C:sig val c: unit end) = struct end;structure A = struct val a = () endand B = struct val b = () end and C = struct val c = () end; functor F = F;functor FA = F A;functor FAB = F A B;structure FABC = F A B C; functor H(F:functor(X:sig end)->sig end)= op F;structure X =H(functor(X:sig end)=>X)(struct end); signature A = sig type a val a : a end;signature B = sig type b val b : b end;signature C = sig type c val c : c end; functor X = functor(X:A)=>X;functor X:functor(X:A)->A = functor(X:A)=>X;functor X:>functor(X:A)->A = functor(X:A)=>X;functor X(A:A)(B:B)(C:C) = A;functor X(A:A)(B:B)(C:C):>A = A;functor X(A:A)(B:B)(C:C):>A = A;  signature F = functor(X:A)->B;signature G = functor(F:F)->C;signature H = functor(G:G)->G;  structure A = struct type a = int val a = 1 end;structure B = struct type b = int val b = 2 end;structure C = struct type c = int val c = 3 end; functor F (X:A) = B;structure FA = F(A); functor G (F:F) = let structure B = F(A) in C end;structure GF = G(F);  functor F (X:sig end) = struct end;structure FA = F(A); functor F (X:sig type a val a : a end) = struct end;structure FA = F(A);  functor F (X:sig type a val a : a end) = struct end;structure FA = F(A);  (* derived forms *)signature A = sig type a val a : a end;signature B = sig type b val b : b end;signature C = sig type c val c : c end; signature S = sig functor F1 : functor(X:A)->B;                  functor F2 (X:A):B;                  functor F3 (X:A)(B:B):C;(*                functor F4 X:A :C;                   functor F5 X:A X:B : C;                   functor F6 (X:A) X:B : C;                  functor F7 X:A (X:B) : C *)              end; (* applicative functors and signatures *)signature F = functor X:sig type t end ->sig end;signature F = functor X:sig  end ->sig type u end;signature F = functor X:sig type t end ->sig type u end;functor F  X:sig type t type w type x end= struct datatype u = C datatype v = D end;functor F  X:sig type t type w type x end= struct datatype 'a u = C of 'a datatype 'b v = D of 'b end;