4 ms·
OCaml's first-class modules allow you to do this: https://ocaml.org/play#code=bW9kdWxlIHR5cGUgRk9PID0gc2lnCiAgdmFsIGZvbyA6IGludAplbmQKCm1vZHVsZSB0eXBlIEJBUiA9IH
by derdi 2y ago
OCaml's first-class modules allow you to do this: https://ocaml.org/play#code=bW9kdWxlIHR5cGUgRk9PID0gc2lnCiAgdmFsIGZvbyA6IGludAplbmQKCm1vZHVsZSB0eXBlIEJBUiA9IHNpZwogIHZhbCBiYXIgOiBzdHJpbmcKZW5kCgptb2R1bGUgdHlwZSBGT09CQVIgPSBzaWcKICBpbmNsdWRlIEZPTwogIGluY2x1ZGUgQkFSCmVuZAoKbGV0IG1ha2VfZm9vYmFyIGZvbyBiYXIgPQogIChtb2R1bGUgc3RydWN0CiAgICBsZXQgZm9vID0gZm9vCiAgICBsZXQgYmFyID0gYmFyCiAgZW5kIDogRk9PQkFSKQoKbGV0IG15X2Zvb2JhciA9IG1ha2VfZm9vYmFyIDQyICJmb3J0eXR3byI%3D https://ocaml.org/play#code=bW9kdWxlIHR5cGUgRk9PID0gc2lnCiAg...
- octachron 2y agoOcaml object system can also achieve this in a quite lightweight way type foo = < foo:int > type bar = < bar:int > type k = < foo; bar > type u = < k; baz:int > let f (x: <u; ..>) (\* the type annotation is not needed \*) = x#m
- mahguy 2y agoThe most consistent solution with the least ceremony. Now it is a module, not a type though.
- derdi 2y agoYou can create first-class values of this module type, and since values have types, "it" is a type. Specifically, my_foobar has type (module FOOBAR). Actually getting values out of such a module-typed structure does involve some ceremony, however: let f = let module M = (val my_foobar) in M.foo