Pourquoi ma fonction n'est-elle pas de type int ?

Version imprimable

  • let resultat=somme_tableau_entiers [|1;2;3;4|] in
  • read_int resultat;


  • This expression has type int but is here used with type unit

    Comment résoudre ce problème (en castant ?) ?

    Je vous remercies de bien vouloir m'aider.
  • 03/03/2007, 23h23
    Steki-kun
    Je ne comprends pas ce que tu veux faire avec ce "read-int",
    tu calcules le résultat et tu veux l'afficher ou le renvoyer non ?
    read_int a le type suivant
    Code:

    1
    2
     
    val read_int : unit -> int

    et s'appelle avec largument () de type unit, et renvoie un entier lu sur l'entrée standard.
    Comme tu l'appelles avec resultat qui est un entier, ca explique l'erreur de typecheck.
    Je pense que tu veux écrire "print_int" à la place.
  • 04/03/2007, 00h48
    LLB
    Comme l'a dit Steki-kun, utilise print_int si tu veux afficher le résultat.

    Astuce : ta fonction somme_tableau_entiers peut s'écrire plus simplement :
    Code:

    let somme_tableau_entiers = Array.fold_left (+) 0;;
    D'une manière générale, évite autant que possible l'impératif et les effets de bords (notamment les ref et les mutable).
    Citation:

    Comment résoudre ce problème (en castant ?) ?
    Noooon !
    Je suppose que tu as appris le C (ou un langage du même genre) pour avoir de si mauvais réflexes ? Un cast sert à tromper un système de typage : c'est une très mauvaise chose qu'il faut éviter à tout prix. En Caml, tu n'auras jamais besoin de faire cela.
    Pour les conversions de types, il y a *_of_* (mais ce sont de vraies conversions, pas des casts).

    (à titre purement informatif, c'est la fonction Obj.magic qui joue le rôle d'un cast)
  • 04/03/2007, 09h34
    ty311
    Merci, mon problème était en effet juste d'avoir confondu read_int et print_int. Elle était si primaire que je ne l'avais même pas trouvée.:?