• [^] # Re: Reason

    Posté par (site web personnel) . En réponse à la dépêche OCaml 4.04 et 4.05. Évalué à 5.

    Je peux me permettre d'éclaircir les deux questions que tu soulèves (et qui suscitent débat parmi les gens qui découvrent OCaml).

    La notation 2. est une version abrégée de 2.0, et permet de définir un nombre flottant.

    Puisqu'OCaml est un langage avec un typage très fort, ce nombre est associé avec un type : float. On le voit en entrant la commande dans le repl :

    # let i = 2.;;
    val i : float = 2.

    La fonction +, elle de son côté, est une fonction définie ainsi (toujours obtenu à travers le repl) :

    # (+);;
    - : int -> int -> int = <fun>

    C'est à dire qu'il s'agit d'une fonction, prenant un type int, suivi d'un deuxième int, et retourne un autre type int (je laisse de côté la Curryfication pour l'instant), du sucre syntaxique permet d'écrire 5 + 5 ou (+) 5 5 et produire le même résultat (la deuxième notation ayant l'avantage de faire correspondre l'ordre des paramètres avec le type de la fonction).

    Pour en revenir à notre nombre flottant, je répète que le typage est très fort, et il est inutile de chercher à donner un paramètre de type float à une fonction qui attend un int. Aussi, l'addition a été définie deux fois :

    • Une fois pour les entiers : +
    • Une fois pour les flottants : +.

    (au final la même primitive C est appelée, il ne s'agit donc pas de code dupliqué).

    Ça fait parti de la rigidité du langage (et peut surprendre au début), mais une fois que l'on a compris le principe, les choses sont beaucoup plus claires, ce qui est valable pour ces deux types est généralisé à tous les types que l'on peut définir dans le langage : une fonction ne peut recevoir en paramètre que les types pour lesquelles elle a été définies — il n'y a pas de conversion implicite, ni de surcharge de fonction.