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;
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 = () end
and 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;