IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages fonctionnels Discussion :

OCaml vs F# : que pensez-vous de ce débat ?


Sujet :

Langages fonctionnels

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut OCaml vs F# : que pensez-vous de ce débat ?
    Salut,


    pour ceux qui suivent un peu les news OCaml, vous aurez remarqué ce débat :
    http://neilmitchell.blogspot.com/200...41541999023235


    Citation Envoyé par Vesa Karvonen
    I too have been using F# for a few months. Before doing any programming
    in F# I've programmed in both SML and (somewhat less in) O'Caml.

    > many of the weaknesses in F# come from ML

    Depends on which weaknesses you are referring to and what do you mean by
    ML. Personally, I think that F# is an ML wannabee language that has been
    intentionally bastardized for both legacy .NET and legacy O'Caml
    interoperability for obvious reasons.

    > The type checker in F# is powerful, but unpredictable.

    I'm not sure whether I would call F#'s type checker powerful. I find F#'s
    type system overall less expressive than O'Caml's or Alice ML's, for
    example (although the type systems are likely to be technically
    incomparable). But, particularly compared to SML, I'd say that F#'s type
    system feels very fragile and rough. Calling it unpredictable would be a
    misnomer, because it is quite deterministic and after a while you learn
    the rough spots.

    There are many idioms that work in both SML and O'Caml (and,
    unsurprisingly, even in Haskell due to the H-M heritage), but fail
    spectacularly in F# due to the fragility of the type system. For example,
    in both SML and O'Caml, one can define the auxiliary function (here in SML
    syntax)

    fun undefined _ = raise Failure "undefined"

    with the spec

    val undefined : 'a -> 'b

    which is quite useful, among other things, as a dummy value for functions
    that you've specified in a module signature, but haven't yet implemented
    in the corresponding module (again in SML syntax):

    signature FOO = sig
    val bar : int -> int
    end
    structure Foo :> FOO = struct
    val bar = undefined
    (* Fine, as 'a -> 'b can be instantiated to int -> int. *)
    end

    Unfortunately, in F#, this doesn't type check.

    Another thing I took note of recently, is that F#'s type system is rather
    unprincipal, so to say. Suppose you have a variable, ls, which is a list
    of lists. One might assume that one could then write

    List.map (fun l -> l.Length) ls

    But this doesn't type check (without further annotations). On the other
    hand, the following does

    ls |> List.map (fun l -> l.length)

    This just basically follows from the fact that F#, with those pesky
    nominal .NET object types, has no notion of principal types or typings to
    speak of.

    These are just two isolated examples that I could recall immediately.
    While using F# for a few months, I've run into *many* rough corners like
    these. Compared to SML, it feels like I have to constantly spoon feed
    F#'s crybaby type checker.

    > The tuple type is treated specially in many cases, and this also leads
    > to surprise - inserting or removing a pair of brackets can effect the
    > type checker.

    This collection of deficiencies is inherited from both O'Caml and .NET.
    First of all, O'Caml's syntax allows one to omit parentheses from tuples
    (in both patterns and expressions) in a number of places, which can be
    quite confusing. In addition, what looks like a tuple type in a data
    constructor isn't actually a tuple type, even if it looks like one.
    (Neither of these warts exist in SML.) The same goes for multiple
    argument .NET functions.

    > In most cases, this state became problematic later.

    Details please. Where and how did you use state and when and how did it
    become problematic?

    > All of the standard .NET libraries work with arrays, but for a
    > functional program the list is a more natural type. F# provides both,
    > and it was never clear which I should use where, leading to lots of
    > conversions.

    I think that answer to that is to use sequences (IEnumerable) rather than
    arrays or lists in interfaces intended for interoperable code. Both
    arrays and lists can be trivially converted to sequences. Inside the
    abstraction boundary, you can then use whatever sequence type (arrays,
    lists, both, or something else) that has the desired properties.

    je préparerais une traduction plus tard...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Pour moi F# est le langage à privilégier sur la plateforme .Net.

    Je veux bien admettre l'idée que F# amène quelques idées intéressantes en programmation fonctionnelle.

    Cependant ce qu'il amène en premier lieu et avant tout c'est l'interopérabilité avec les langages et les outils .Net, et pour arriver à ce résultat nombres de concessions ont été faites qui le rapprochent de C#.
    Globablement (modulo la remarque précédente) c'est un langage qui jette des ponts plutôt qu'un langage qui s'aventure sur de nouveaux territoires.

    Pour moi, comme toujours avec ces plateformes à base de VM, la question OCaml vs. F# se ramène à la question code natif vs. code managé.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    Cependant ce qu'il amène en premier lieu et avant tout c'est l'interopérabilité avec les langages et les outils .Net, et pour arriver à ce résultat nombres de concessions ont été faites qui le rapprochent de C#.
    Globablement (modulo la remarque précédente) c'est un langage qui jette des ponts plutôt qu'un langage qui s'aventure sur de nouveaux territoires.
    selon moi, F# a surtout réussi à faire de l'inférénce de type sans casser la POO (ce que OCaml ne sait pas réellement faire )

    disons que l'équipe F# est plus petite que l'équipe C#, mais on voit que pas mal de notion théorique de haut niveau sont arrivées avec C# 3 (vraies fonctions anonymes), et bientot avec C# 4 (variance, covariance, contravariance)
    j'ai donc espoir que le système de type de F# devienne bien meilleur dès que l'équipe aura porter le langage pour .Net 4
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    selon moi, F# a surtout réussi à faire de l'inférénce de type sans casser la POO (ce que OCaml ne sait pas réellement faire )
    Je ne comprends pas bien ce que tu dis.

    Tu veux parler des coercions (les :> que l'on doit insérer en OCaml quand on fait du sous-typage) ?

    Citation Envoyé par gorgonite Voir le message
    disons que l'équipe F# est plus petite que l'équipe C#, mais on voit que pas mal de notion théorique de haut niveau sont arrivées avec C# 3 (vraies fonctions anonymes), et bientot avec C# 4 (variance, covariance, contravariance)
    j'ai donc espoir que le système de type de F# devienne bien meilleur dès que l'équipe aura porter le langage pour .Net 4
    Non, la notion de variance et contra-variance existe depuis longtemps en OCaml... mais c'est vrai que c'est une nouveauté pour un langage impératif.

    De toute façon, moi je retiens surtout ceci...

    Citation Envoyé par Vesa Karvonen
    Personally, I think that F# is an ML wannabee language that has been
    intentionally bastardized for both legacy .NET and legacy O'Caml
    interoperability for obvious reasons.
    ... d'accord avec TOUTE la phrase.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par InOCamlWeTrust Voir le message
    Je ne comprends pas bien ce que tu dis.

    Tu veux parler des coercions (les :> que l'on doit insérer en OCaml quand on fait du sous-typage) ?
    on fait encore pareil en F#... et j'espère que cela va changer
    (alors qu'il est presque certain qu'OCaml ne changera pas avant TRES longtemps )


    je parlais du calcul des interfaces minimales pour typer les objets... c'est pratique, mais en POO on s'attend parfois à autres choses


    Citation Envoyé par InOCamlWeTrust Voir le message
    Non, la notion de variance et contra-variance existe depuis longtemps en OCaml...
    exemples ?

    Citation Envoyé par InOCamlWeTrust Voir le message
    De toute façon, moi je retiens surtout ceci...

    ... d'accord avec TOUTE la phrase.

    arguments ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    je parlais du calcul des interfaces minimales pour typer les objets... c'est pratique, mais en POO on s'attend parfois à autres choses
    comme ?



    Citation Envoyé par gorgonite Voir le message
    exemples ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # type a = [`A];;
    type a = [ `A ]
    # type b = [`B];;
    type b = [ `B ]
    # type ab = [a | b];;
    type ab = [ `A | `B ]
    # let a_sub_ab (x : a) = (x :> ab);;
    val a_sub_ab : a -> ab = <fun>
    # let foo (_ : ab) : a = `A;;
    val foo : ab -> a = <fun>
    # let varfoo = (foo :> ab -> ab);;
    val varfoo : ab -> ab = <fun>
    # let contrafoo = (foo :> a -> a);;
    val contrafoo : a -> a = <fun>
    # let bothfoo = (foo :> a -> ab);;
    val bothfoo : a -> ab = <fun>

  7. #7
    alex_pi
    Invité(e)
    Par défaut
    En peut être un peu plus intéressant :

    fichier myref.mli
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type (-'set, +'get) myref (* covariant en get, contra en set *)
    val new_ref : 'a -> ('a, 'a) myref
    val set : ('a, 'b) myref -> 'a -> unit
    val get : ('a, 'b) myref -> unit -> 'b
    fichier myref.ml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type ('set, 'get) myref = {set : 'set -> unit ; get : unit -> 'get}
    
    let new_ref x = let rx = ref x in {set = (:=) rx; get = fun () -> !rx}
    
    let set mr = mr.set
    On compile et on utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    alex_pi@alex_pi contravar % ocaml myref.cmo
            Objective Caml version 3.10.2
    
    # open Myref;;
    # type a = [`A]
    and ab = [`A|`B]
    and abc = [`A|`B|`C];;
    type a = [ `A ]
    and ab = [ `A | `B ]
    and abc = [ `A | `B | `C ]
    # let nr = new_ref (`A : ab);;
    val nr : (ab, ab) Myref.myref = <abstr>
    # let nr_bis = (nr :> (a, abc) myref);;
    val nr_bis : (a, abc) Myref.myref = <abstr>
    # nr.get;; (* prouvons que le type n'est pas ouvert *)
    Unbound record field label get
    # get nr_bis;;
    - : unit -> abc = <fun>
    # set nr_bis;;
    - : a -> unit = <fun>

  8. #8
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    comme ?

    deux interfaces indentiques et pourtant qu'on ne souhaite pas mélanger

    faut avouer que la POO sous OCaml ne me plait guère, donc j'ai assez vite laché ce point


    EDIT :
    au passage, est-ce vraiment une classe OCaml ? si oui, je croyais que c'était un variant polymorphe, peux-tu m'expliquer la différence ? (j'ai pas vraiment étudié ces deux aspect de OCaml, le reste me suffit largement )
    tu peux me donner la même chose avec des class ['a] trucmuche ... pour que je vois mieux ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  9. #9
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    fun undefined _ = raise Failure "undefined"
    [...]
    Unfortunately, in F#, this doesn't type check.
    Il est possible de forcer des paramètres de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    > let undefined _ = failwith "undefined";;
    val undefined : 'a -> 'b
    > undefined<int,_>;;
    val it : (int -> 'a) = <fun:clo@0>
    > undefined<int,int>;;
    val it : (int -> int) = <fun:clo@0_1>
    Le code suivant est aussi valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > let foo : int -> int = undefined;;
    val foo : (int -> int)
    Pour ma part, je ne vois pas de problème.

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par LLB Voir le message
    Pour ma part, je ne vois pas de problème.
    selon moi, ce débat est surtout le genre de troll pour essayer d'éviter que des membres s'y attardent suffisamment pour switcher

    j'ai bien aimé la réponse de Jon Harrop, qu'on pourrait presque résumer à :
    ce n'est pas parce que F# n'utilise pas les mêmes méthodes qu'OCaml pour apporter des solutions à un problème donné, que cela signifie qu'il est forcemment moins bien
    et j'exagère à peine
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  11. #11
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    J'ai pas regardé dans le détail les exemples d'alex_pi, mais il y a quelques exemples qui peuvent être trouvés directement dans la librairie standard : Set et Map, par exemple (c'est l'utilisation du +'a et/ou du -'a dans la déclaration de type).

    Ensuite, concernant les coercions, je crois que la principale barrière est théorique, c'est-à-dire que l'on ne peut pas conserver le typage OCaml tel qu'on le connaît avec l'héritage si on ne spécifie pas ce genre de choses. Car c'est clair, si on avait pu s'en passer, on l'aurait fait il y a longtemps.

    Peut-être alex_pi pourrait donner plus d'informations ?

    Pour ce qui est de la supériorité de OCaml vs F#, je crois qu'elle est claire, et pas seulement en tant que langage en soi, mais aussi en tant qu'implantation.

    Pour autant, F# n'est pas un mauvais langage. Loin de là.

    F# est plus appliqué que théorique, et essaye de trouver des compromis de l'ordre pratique. Ce n'est surtout pas moi qui gueulerai sur cette façon de faire.

    Par contre, le vrai trõll, à mon avis, serait celui qui jurerait que F# est le langage ultime, bon à tout faire. Comme toujours, ce n'est jamais vrai.

    Que des personnes trouvent ça trop cool d'utiliser F#, très bien, et il en faut pour tous les goûts. Pour moi, F# c'est un peu comme Java. Si t'aimes Java, très bien, mais faut surtout pas croire que c'est une potion magique !
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  12. #12
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par InOCamlWeTrust Voir le message
    Peut-être alex_pi pourrait donner plus d'informations ?
    Si je ne m'abuse, l'inférence de type en présence de sous typage implicite n'est pas décidable. Mais à vérifier !

  13. #13
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    Si je ne m'abuse, l'inférence de type en présence de sous typage implicite n'est pas décidable. Mais à vérifier !
    http://www.springerlink.com/content/f44473961v8v758h/
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  14. #14
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    F# est plus appliqué que théorique, et essaye de trouver des compromis de l'ordre pratique.
    Précisément !

    Du coup, on ne peut pas dire qu'un langage soit "supérieur" à l'autre, dans le cas général (je ne suis pas sûr d'avoir compris ta phrase précédente).

    le vrai trõll, à mon avis, serait celui qui jurerait que F# est le langage ultime, bon à tout faire.
    OK. Pour moi, F# est juste un bon remplaçant de Java et des autres langages .Net. Je suis persuadé qu'il sera utilisé en entreprise (plus qu'OCaml, par exemple), même s'il ne dépassera évidemment pas les langages impératifs.

  15. #15
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Bonjour,

    Débat assez intéressant.

    Pour ma part, de ce que j'ai lu et appris sur F#, sa principale force c'est le FX .NET qu'il y a derrière.
    Il semble supporter pas mal de choses du monde fonctionnel et à côté de ça on dispose de toutes les choses permettant d'interopérer avec un SGBD, le réseau, IHM, j'en passe et des meilleures. Faudra que je fasse un peu "mumuse" avec un de ces jours.

    De ce fait, F# sera probablement plus utilisé en entreprise, étant livré avec le produit phare MS.

    Mais de là à décider qui de F#, OCaml voire Haskell, Lisp, Scheme est le meilleur, ça fait effectivement plus gros troll poilu qu'autre chose.

Discussions similaires

  1. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 10h17
  2. Que pensez vous de filemaker
    Par thpopeye dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 14/06/2007, 15h20
  3. Que pensez vous du nouveau kernel 2.6 ?
    Par GLDavid dans le forum Administration système
    Réponses: 58
    Dernier message: 02/08/2004, 15h45
  4. [Débat] Que pensez-vous des langages à typage dynamique?
    Par Eusebius dans le forum Langages de programmation
    Réponses: 14
    Dernier message: 16/06/2004, 12h12
  5. Que pensez vous du mariage ASP Flash?
    Par tyma dans le forum Flash
    Réponses: 4
    Dernier message: 09/07/2003, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo