* [Caml-list] Partial module include
@ 2012-09-21 16:37 Pierre-Etienne Meunier
2012-09-21 16:41 ` David House
0 siblings, 1 reply; 6+ messages in thread
From: Pierre-Etienne Meunier @ 2012-09-21 16:37 UTC (permalink / raw)
To: caml-list
Hi,
Is it possible in ocaml to redefine a part of an included module, like in the following code ?
module A=struct
let a=0
let b=1
end
module B=struct
include A
let b=2
end
Thanks
Pierre
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Caml-list] Partial module include
2012-09-21 16:37 [Caml-list] Partial module include Pierre-Etienne Meunier
@ 2012-09-21 16:41 ` David House
2012-09-21 16:43 ` Pierre-Etienne Meunier
0 siblings, 1 reply; 6+ messages in thread
From: David House @ 2012-09-21 16:41 UTC (permalink / raw)
To: Pierre-Etienne Meunier; +Cc: caml-list
Sure. That exact code will work just fine.
It's a special case of "shadowing", where bindings override any
previous ones, for the duration of their scope. E.g.:
let x = 5 in
let x = 4 in
(* here x is 4 *)
also:
let x = 5 in
let () =
let x = 4 in
printf "%d " x
in
printf "%d\n" x
Prints "4 5", because the inner binding only has effect during the
time that it is in scope, and afterwards the original binding is
"uncovered" again.
On Fri, Sep 21, 2012 at 5:37 PM, Pierre-Etienne Meunier
<pierreetienne.meunier@gmail.com> wrote:
> Hi,
>
> Is it possible in ocaml to redefine a part of an included module, like in the following code ?
>
> module A=struct
> let a=0
> let b=1
> end
>
> module B=struct
> include A
> let b=2
> end
>
>
> Thanks
> Pierre
> --
> Caml-list mailing list. Subscription management and archives:
> https://sympa-roc.inria.fr/wws/info/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Caml-list] Partial module include
2012-09-21 16:41 ` David House
@ 2012-09-21 16:43 ` Pierre-Etienne Meunier
2012-09-21 16:47 ` David House
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Pierre-Etienne Meunier @ 2012-09-21 16:43 UTC (permalink / raw)
To: caml-list
No, sorry, what I wanted to override was a module:
module A=struct
let a=0
module B=struct let b=1 end
end
module B=struct
include A
module B=struct let b=2 end
end
Em 21/09/2012, às 18:41, David House escreveu:
> Sure. That exact code will work just fine.
>
> It's a special case of "shadowing", where bindings override any
> previous ones, for the duration of their scope. E.g.:
>
> let x = 5 in
> let x = 4 in
> (* here x is 4 *)
>
> also:
>
> let x = 5 in
> let () =
> let x = 4 in
> printf "%d " x
> in
> printf "%d\n" x
>
> Prints "4 5", because the inner binding only has effect during the
> time that it is in scope, and afterwards the original binding is
> "uncovered" again.
>
> On Fri, Sep 21, 2012 at 5:37 PM, Pierre-Etienne Meunier
> <pierreetienne.meunier@gmail.com> wrote:
>> Hi,
>>
>> Is it possible in ocaml to redefine a part of an included module, like in the following code ?
>>
>> module A=struct
>> let a=0
>> let b=1
>> end
>>
>> module B=struct
>> include A
>> let b=2
>> end
>>
>>
>> Thanks
>> Pierre
>> --
>> Caml-list mailing list. Subscription management and archives:
>> https://sympa-roc.inria.fr/wws/info/caml-list
>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Caml-list] Partial module include
2012-09-21 16:43 ` Pierre-Etienne Meunier
@ 2012-09-21 16:47 ` David House
2012-09-21 16:55 ` Markus Mottl
2012-09-21 17:47 ` Jeremy Yallop
2 siblings, 0 replies; 6+ messages in thread
From: David House @ 2012-09-21 16:47 UTC (permalink / raw)
To: Pierre-Etienne Meunier; +Cc: caml-list
Ah, no, that cannot be done. Shadowing of modules is mysteriously
disallowed :) (I suspect there is a good reason for this, but I
confess I don't know it.)
If you say what you want to do with a bit more context, there might be
a decent workaround.
On Fri, Sep 21, 2012 at 5:43 PM, Pierre-Etienne Meunier
<pierreetienne.meunier@gmail.com> wrote:
> No, sorry, what I wanted to override was a module:
>
> module A=struct
> let a=0
> module B=struct let b=1 end
> end
>
> module B=struct
> include A
> module B=struct let b=2 end
> end
>
>
> Em 21/09/2012, às 18:41, David House escreveu:
>
>> Sure. That exact code will work just fine.
>>
>> It's a special case of "shadowing", where bindings override any
>> previous ones, for the duration of their scope. E.g.:
>>
>> let x = 5 in
>> let x = 4 in
>> (* here x is 4 *)
>>
>> also:
>>
>> let x = 5 in
>> let () =
>> let x = 4 in
>> printf "%d " x
>> in
>> printf "%d\n" x
>>
>> Prints "4 5", because the inner binding only has effect during the
>> time that it is in scope, and afterwards the original binding is
>> "uncovered" again.
>>
>> On Fri, Sep 21, 2012 at 5:37 PM, Pierre-Etienne Meunier
>> <pierreetienne.meunier@gmail.com> wrote:
>>> Hi,
>>>
>>> Is it possible in ocaml to redefine a part of an included module, like in the following code ?
>>>
>>> module A=struct
>>> let a=0
>>> let b=1
>>> end
>>>
>>> module B=struct
>>> include A
>>> let b=2
>>> end
>>>
>>>
>>> Thanks
>>> Pierre
>>> --
>>> Caml-list mailing list. Subscription management and archives:
>>> https://sympa-roc.inria.fr/wws/info/caml-list
>>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>>>
>
>
> --
> Caml-list mailing list. Subscription management and archives:
> https://sympa-roc.inria.fr/wws/info/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Caml-list] Partial module include
2012-09-21 16:43 ` Pierre-Etienne Meunier
2012-09-21 16:47 ` David House
@ 2012-09-21 16:55 ` Markus Mottl
2012-09-21 17:47 ` Jeremy Yallop
2 siblings, 0 replies; 6+ messages in thread
From: Markus Mottl @ 2012-09-21 16:55 UTC (permalink / raw)
To: Pierre-Etienne Meunier; +Cc: caml-list
On Fri, Sep 21, 2012 at 12:43 PM, Pierre-Etienne Meunier
<pierreetienne.meunier@gmail.com> wrote:
> No, sorry, what I wanted to override was a module:
>
> module A=struct
> let a=0
> module B=struct let b=1 end
> end
>
> module B=struct
> include A
> module B=struct let b=2 end
> end
You could try first class modules:
module type B = sig val b : int end
module A = struct
let a = 0
let b = (module struct let b = 1 end : B)
end
module B = struct
include A
let b = (module struct let b = 2 end : B)
end
--
Markus Mottl http://www.ocaml.info markus.mottl@gmail.com
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Caml-list] Partial module include
2012-09-21 16:43 ` Pierre-Etienne Meunier
2012-09-21 16:47 ` David House
2012-09-21 16:55 ` Markus Mottl
@ 2012-09-21 17:47 ` Jeremy Yallop
2 siblings, 0 replies; 6+ messages in thread
From: Jeremy Yallop @ 2012-09-21 17:47 UTC (permalink / raw)
To: Pierre-Etienne Meunier; +Cc: caml-list
On 21 September 2012 17:43, Pierre-Etienne Meunier
<pierreetienne.meunier@gmail.com> wrote:
> module A=struct
> let a=0
> module B=struct let b=1 end
> end
>
> module B=struct
> include A
> module B=struct let b=2 end
> end
You can achieve this using destructive substitution and 'module type
of' in recent versions of OCaml:
module A =
struct
let a = 0
module B = struct let b = 1 end
end
module B =
struct
include (A : module type of A with module B := A.B)
module B = struct let b = 2 end
end
The 'with module B := B' construct removes the 'B' component from the
type of the 'A' module, allowing you to introduce a replacement:
# module type ASIG = module type of A;;
module type ASIG = sig val a : int module B : sig val b : int end end
# module type ASIG = module type of A with module B := A.B;;
module type ASIG = sig val a : int end
Jeremy.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2012-09-21 17:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-21 16:37 [Caml-list] Partial module include Pierre-Etienne Meunier
2012-09-21 16:41 ` David House
2012-09-21 16:43 ` Pierre-Etienne Meunier
2012-09-21 16:47 ` David House
2012-09-21 16:55 ` Markus Mottl
2012-09-21 17:47 ` Jeremy Yallop
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox