File: functors.ml

package info (click to toggle)
ocaml 5.3.0-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 43,124 kB
  • sloc: ml: 355,439; ansic: 51,636; sh: 25,098; asm: 5,413; makefile: 3,673; python: 919; javascript: 273; awk: 253; perl: 59; fortran: 21; cs: 9
file content (48 lines) | stat: -rw-r--r-- 955 bytes parent folder | download | duplicates (2)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
(* TEST
 setup-ocamlc.byte-build-env;
 flags = "-dlambda -dno-unique-ids";
 ocamlc.byte;
 check-ocamlc.byte-output;
*)

module type S = sig
  val foo : int -> int
end

module O (X : S) = struct
  let cow x = X.foo x
  let sheep x = 1 + cow x
end [@@inline always]

module F (X : S) (Y : S) = struct
  let cow x = Y.foo (X.foo x)
  let sheep x = 1 + cow x
end [@@inline always]

module type S1 = sig
  val bar : int -> int
  val foo : int -> int
end

module type T = sig
  val sheep : int -> int
end

module F1 (X : S) (Y : S) : T = struct
  let cow x = Y.foo (X.foo x)
  let sheep x = 1 + cow x
end [@@inline always]

module F2 : S1 -> S1 -> T = functor (X : S) -> functor (Y : S) -> struct
  let cow x = Y.foo (X.foo x)
  let sheep x = 1 + cow x
end [@@inline always]

module M : sig
  module F (X : S1) (Y : S1) : T
end = struct
  module F (X : S) (Y : S) = struct
    let cow x = Y.foo (X.foo x)
    let sheep x = 1 + cow x
  end [@@inline always]
end