From: John Prevost <jprevost@libcom.com>
To: wrader@OCF.Berkeley.EDU
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] A class that contains instances of itself?
Date: Sat, 5 Jan 2002 08:15:32 -0500 [thread overview]
Message-ID: <20020105081532.C79198@libcom.com> (raw)
In-Reply-To: <200201051245.g05Cjxp24150@war.OCF.Berkeley.EDU>
On Sat, Jan 05, 2002 at 04:45:59AM -0800, wrader@OCF.Berkeley.EDU wrote:
>class someClass =
> object
> var mutable anotherInstanceOfSomeClass ???????
>
> method talk () =
> print_string("Hello.\n")
>
> method setInstance x =
> anotherInstanceOfSomeClass <- x
>
> method useInstance () =
> if anotherInstanceOfSomeClass is set to a
> usable value, then do
> anotherInstanceOfSomeClass#talk
> else
> do nothing
> end;;
>
>
>One must call anotherInstanceOfSomeClass#setInstance
>before using anotherInstanceOfSomeClass#talk.
>
>What do I put in place of the ?????? to indicate
>that the value is not yet usable? I could create
>a "dummy" someClass object to use as the "NULL" value,
>let's say called someClassNULL. someClassNULL must
>already be defined if I use it in the body of
>someClass, but I can't create it before the
>definition of someClass because the compiler doesn't
>know what someClass _is_ yet. Catch-22!!
>
>I've been staring at this problem for hours, so any
>help would be fantastic! (If only I spoke French and
>could read the many books available about OCaml...)
In this case, I would write:
object ('s)
val mutable anotherInstanceOfSomeClass = (ref None : 's option)
method talk () =
print_string("Hello.\n")
method setInstance x =
anotherInstanceOfSomeClass <- Some x
method useInstance () =
match anotherInstanceOfSomeClass
| Some x -> anotherInstanceOfSomeClass#talk ()
| None -> ()
end
The ('s) part binds the "self type" of the class so you can refer
to it. "foo option" is either "None" or "Some x" where x is a
value of type foo. The option type is the wonderful way that
languages with reasonably powerful type systems allow us to add
something like "NULL" only where we want it, instead of having it
everywhere.
Another way of looking at things (in this case) is that you only
need some object with a talk method in that value--not necessarily
the same type object as your class, so you could do:
class doNothing =
object
method talk () = ()
end
and then use an instance of that as a placeholder. But, this will
lead to other typing issues, as you'll have to cast everything to
only include the talk method before you pass them in. (Ignore this
for now if it doesn't make sense to you, and read through all of
the object examples in the manual.)
Do read the O'Caml manual. It's written in English, and while it
doesn't recommend ways of doing everything like this, actually
reading through it from end to end can suggest a lot of ways to do
things.
John.
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
next prev parent reply other threads:[~2002-01-07 9:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-01-05 12:45 wrader
2002-01-05 13:15 ` John Prevost [this message]
2002-01-05 13:16 ` Alain Frisch
2002-01-05 23:27 ` [Caml-list] IMAP library for Caml? Will Benton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20020105081532.C79198@libcom.com \
--to=jprevost@libcom.com \
--cc=caml-list@inria.fr \
--cc=wrader@OCF.Berkeley.EDU \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox