[linux-l] Ocml vs. Java

Oliver Bandel oliver at first.in-berlin.de
Do Sep 22 17:40:13 CEST 2005


On Thu, Sep 22, 2005 at 10:20:23AM +0200, Axel Wei wrote:
> Oliver Bandel schrieb:
> > Man hat z.B. ein Modul Set in der OCaml-Standardlib.
> > Das bietet Sets an, implementiert als "balanced binary trees".
> > Das Modul bietet eine "Funktion" Make, die ein Funktor ist.
> >
> > Der Funktor bekommt als Argument ein eigens ersteltes Modul,
> > dessen Interface einen Typ "t" und eine Funktion "compare"
> > enthalten muß. Die Funktion compare muß den Typ
> > t -> t -> int
> > haben.
> > Es kann also jeder beliebige Typ t benutzt werden.
> > [ein schickes Beispiel für die Anwendung des Konzepts Polymorphie]
> 
> Und das geht mit Java nicht? Ich habe zwar seit zwei jahren kein 
> Java-Programm mehr angefasst - aber es soll jetzt doch sowas wie 
> Templates geben. In C++ jedenfalls macht man das mit Templates.

"Templates" (und auch "soll jetzt sowas...geben") klingt irgendwie nach
Workaround für schlecht durchdachte Programmiersprachen. :->


> 
> Oliver, was Du beschrieben hast, ist nicht das Modulkonzept, sondern das 
> Polymorphiekonzept objektorientierter Sprachen. (SCNR)

Ach, meinst Du? Ich dachte im OO-bereich nennt man es Polymorphie,
wenn Objekte aus unterschiedlichen Klassen die selbe Message erhalten
können, also wenn es gleichnamige Methoden gibt, in versch. Klassen,
und man denen allen eine spezifische Message senden kann.

Das da oben mit den Typen t -> t-> int ist zwar auch Polymorphie,
aber erstens sind das da im Beispiel keine Objekte, sondern Typen
und zweitens war das ein kleiner Schlenker, eine meiner so beliebten
Abschweifungen. :)

Das Konzept der Funktoren war es, was ich da oben eigentlich erklären wollte,
und das nahm auch den meisten Platz ein. Daß Du nun ausgerechnet auf meinen
kleine Exkurs Dich beziehst, finde ich schon seltsam.

Wie definiert man denn in einer klass. OO-Sprache eine
List.map oder List.iter für verschiedene Typen, also eine
polymorphe?
Geht das? Wenn ja: wie? Templates? (komisch, Templates klingt so statisch...)

Was ich meine ist folgendes:


===================================================================
        Objective Caml version 3.08.0

# let liste_1 = [1;5;33;6;2;88];;
val liste_1 : int list = [1; 5; 33; 6; 2; 88]
# let liste_2 = [12.9;4.9;4.87;12.8671;22.098];;
val liste_2 : float list = [12.9; 4.9; 4.87; 12.8671; 22.098]
# let liste_3 = ["Na";"diesmal";"also";"ein";"string";"!"];;
val liste_3 : string list = ["Na"; "diesmal"; "also"; "ein"; "string"; "!"]
# List.iter (fun i -> Printf.printf "%d\n" i) liste_1;;
1
5
33
6
2
88
- : unit = ()
# List.iter (fun f -> Printf.printf "%f\n") liste_2;;
This expression has type float -> unit but is here used with type unit
# (* ach so... vergessen, den Parameter anzugeben ;-) *)
  List.iter (fun f -> Printf.printf "%f\n" f) liste_2;;
12.900000
4.900000
4.870000
12.867100
22.098000
- : unit = ()
# List.iter (fun s -> Printf.printf "%s\n" s) liste_3;;
Na
diesmal
also
ein
string
!
- : unit = ()
# List.iter;;
- : ('a -> unit) -> 'a list -> unit = <fun>
# Printf.printf;;
- : ('a, out_channel, unit) format -> 'a = <fun>
# Printf.printf "%s\n" 88;;
This expression has type int but is here used with type string
# Printf.printf "%f\n" 99;;
This expression has type int but is here used with type float
# 
===================================================================

Nach dem Polymorphism bzgl. Typen habe ich noch mal was
bei Printf.printf bzgl. falscher Typen mit beigelegt
(die 88 und 99 sind im Tolevel unterstrichen, nach Copy&Paste
ist das hier nicht zu sehen).

Was würde wohl in C passieren, wenn man printf() mit einem
Formatstring bestückt, der nicht dem Typ des Arguments
entspricht?! :)

(Wie wäre sowas in Java oder C++ ?? (sofern printf() vorhanden))

Gruß,
   Oliver



Mehr Informationen über die Mailingliste linux-l