caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Gabriel Scherer <gabriel.scherer@gmail.com>
To: "\"Mark\"" <mark@proof-technologies.com>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] accessing the type of a polymorphic parameter
Date: Fri, 26 Oct 2012 21:58:04 +0200	[thread overview]
Message-ID: <CAPFanBHt8YdFioc+51i5QNcdVhxMwiP0eUY=eyhBY2KyAgHmoQ@mail.gmail.com> (raw)
In-Reply-To: <1351280342705@names.co.uk>

If you can formulate your problems with ('a ops), the module defining
an abstract type t can provide a (t ops) from inside the abstraction
boundary. Handling composite data types is also rather easy, just
provide for example an ('a ops -> 'a list ops) function.

The runtime type representation idea of Alain can also be extended to
deal with private types, but you need either to pre-plan the required
operation in advance and provide them from inside the abstraction
boundary, or expose the runtime type representation of the abstract
type which lessen encapsulation (but you can hardly do worse than
using Obj.magic in this case). This is present in "ocaml-ty", a
prototype work on runtime type representation by Pierre Chambart and
Grégoire Henry which has been presented during the last OCaml Users
and Developers Meeting back in September. It's experimental work and a
moving target, and comes with a "modification of the language" part
that isn't really the concern here, but you could think of looking at
their work (and providing them feedback!) if you really insist on
making heavy use of ad-hoc polymorphism.
  https://gitorious.org/ocaml-ty



On Fri, Oct 26, 2012 at 9:39 PM, "Mark" <mark@proof-technologies.com> wrote:
> Superb, thanks David, Lilian, Gabriel.  This may be just about sufficient
> for my purposes.  I'll have a play.
>
> As well as predefined OCaml primitive datatypes, what would perfect for me
> would be the ability to also do newly created abstract datatypes, and
> composite datatypes like lists of strings.  Are either of these possible
> with your solutions?
>
> Mark.
>
> on 26/10/12 7:29 PM, David Allsopp <dra-news@metastack.com> wrote:
>
>> ...
>> For this explicit example, you could write:
>>
>> let foo x =
>> match Obj.tag (Obj.repr x) with
>> x when x = Obj.int_tag -> ...
>> | x when x = Obj.string_tag -> ...
>>
>> but this probably isn't what you're after. The type of foo will also be 'a
>> -> '_b so you won't get any help from the type system in the calling of
> foo.
>> ...
>
>
> on 26/10/12 7:50 PM, Lilian Jean BESSON <lilian.besson@ens-cachan.fr> wrote:
>
>> ...
>> In my code "surcharge.ml", the main functions are "typage" : 'a ->
>> string, and "dump" : a' -> string.
>> Examples:
>> #9> Surcharge.typage;;
>> - : 'a -> string = <fun>
>> #10> Surcharge.typage 4  (* ok *);;
>> - : string = "int"
>> #11> Surcharge.typage 8.7  (* ok *);;
>> - : string = "float"
>> #12> Surcharge.typage "ok";; (* ok *)
>> - : string = "string"
>> #13> Surcharge.typage 'k'  (* not ok *);;
>> - : string = "int"
>> #14> Surcharge.typage [4]  (* not ok *);;
>> - : string = "array"
>> #15> Surcharge.typage [|4|];;
>> - : string = "array"
>> #16> Surcharge.typage cos  (* not ok *);;
>> - : string = "unknown"
>> But this function "typage" is very limited : no difference between arrays
>> and strings etc...
>> ...
>
>
> on 26/10/12 8:24 PM, Gabriel Scherer <gabriel.scherer@gmail.com> wrote:
>
>> ...
>> Long answer: I presume that your implementation works for any type
>> providing some fixed set of operations, but that you wish those
>> operations to be implemented differently for each type. You can define
>> a type ('a ops) describing these operations on the type 'a (as a
>> record of functions for example), and use the polymorphic type ('a ->
>> 'a ops -> foo) instead of ('a -> foo) to write your function.
>> Depending on your specific needs there may be slightly different
>> approaches (using a algebraic representation of runtime types rather
>> than a typeclass-like dictionary), a very general way being described
>> in this blog post by Alain Frisch :
>> http://www.lexifi.com/blog/dynamic-types
>> It could help to have more details on your needs to suggest a better
>> solution.
>>
>> Wrong answer: yes, using Obj.magic you can access the runtime
>> representation of values. You can't distinguish between boolean and
>> integers and the empty list, but worrying about that is for the
>> coward, let's shoot yourself in the foot -- starting by reading the
>> documentation on the representation of OCaml values, chapter
>> "interacting with C" in the manual.
>> ...

  reply	other threads:[~2012-10-26 19:58 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-26 19:39 "Mark"
2012-10-26 19:58 ` Gabriel Scherer [this message]
2012-10-26 20:01   ` Gabriel Scherer
  -- strict thread matches above, loose matches on Subject: below --
2012-10-26 18:01 "Mark"
2012-10-26 19:23 ` Gabriel Scherer
2012-10-26 21:31 ` Anil Madhavapeddy

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='CAPFanBHt8YdFioc+51i5QNcdVhxMwiP0eUY=eyhBY2KyAgHmoQ@mail.gmail.com' \
    --to=gabriel.scherer@gmail.com \
    --cc=caml-list@inria.fr \
    --cc=mark@proof-technologies.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).