caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: brogoff@speakeasy.net
To: Olivier Andrieu <andrieu@ijm.jussieu.fr>
Cc: onlyclimb <onlyclimb@163.com>, "caml-list@inria.fr" <caml-list@inria.fr>
Subject: Re: [Caml-list] How to throw away oop?
Date: Mon, 9 Dec 2002 10:43:59 -0800 (PST)	[thread overview]
Message-ID: <Pine.LNX.4.44.0212091028530.25287-100000@grace.speakeasy.net> (raw)
In-Reply-To: <15860.42055.229312.122122@akasha.ijm.jussieu.fr>

On Mon, 9 Dec 2002, Olivier Andrieu wrote:
>  onlyclimb [Monday 9 December 2002] :
>  >   DNA and Protein can be a subclass of Seq. And in fact there are many 
>  >  kind of sequences , so we can suppose the number of the kind of Seq is 
>  > infinite. ie. the subclasses of Seq can be infinite.  and DNA and 
>  > Protein are just two of them
> 
> Do you really think you'll have to subclass your Seq often ? I mean,
> you have DNA, proteins and this is it (you can add RNA if you want to
> nitpick). In this case, ie when your datatypes are fixed and you're not
> going to extend them, you can simply use a variant type.

In the case of a function like "length", there are certainly a lot of things 
which satisfy it. Most of the time, writing Foo.length is OK, but there 
are certainly times when it is less clear IMO. It seems what the original 
poster misses here isn't so much OOP but overloading, since there is no 
late-binding/open-recursion/implementation-inheritance though it turns out 
that OCaml's object system gives you something like overloading. I prefer 
Olivier's solution in this case

> module DNA = 
>   type t = ...
>   let length = ...
> end
> 
> module Protein = 
>   type t = ...
>   let length = ...
> end
> 
> and you can build a generic module for functions common in DNA and
> Protein :
> 
> module Seq = 
>   type t = 
>    | DNA of DNA.t
>    | Protein of Protein.t
>   let length = function
>    | DNA s -> DNA.length s
>    | Protein s -> Protein.length s
> end

and, if we had true generics as in GCaml, we could write this 

generic length = 
  DNA.t -> DNA.length
| Protein -> Protein.length

directly without the tagging and untagging. This would be my preferred 
solution if it were in the language. 

-- Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


      reply	other threads:[~2002-12-09 18:44 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-12-09 21:20 onlyclimb
2002-12-09 13:45 ` Didier Le Botlan
2002-12-09 14:10 ` Olivier Andrieu
2002-12-09 18:43   ` brogoff [this message]

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=Pine.LNX.4.44.0212091028530.25287-100000@grace.speakeasy.net \
    --to=brogoff@speakeasy.net \
    --cc=andrieu@ijm.jussieu.fr \
    --cc=caml-list@inria.fr \
    --cc=onlyclimb@163.com \
    /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;
as well as URLs for NNTP newsgroup(s).