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

Caml Discussion :

Chaine de caractères vers Liste de caractères


Sujet :

Caml

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Chaine de caractères vers Liste de caractères
    Bonjour,
    Actuellement en CPGE, j'ai des difficultés en informatique (Language Caml). Je me suis ainsi inscrit dans ce forum afin de trouver un support d'aide le plus efficace possible (il n'y a aucune prétention là dedans ) et afin d'ameliorer au mieux mes médiocres résultats.

    J'aimerais donc savoir s'il y a ici des personnes fréquentant régulièrement ce forum et pouvant m'aider en Caml.

    Cordialement.
    Le ptit nouveau qui veut comprendre l'informatique.

  2. #2
    Membre actif
    Avatar de Ptival
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 70
    Points : 276
    Points
    276
    Par défaut
    Bonjour,

    Il y a peu de personnes actives sur ce forum, mais elles sont en général assez réactives et de bon conseil (l'un d'entre ceux-ci au moins donne des khôlles d'informatique, et devrait donc être particulièrement au fait de ce à quoi tu t'attaques).

    En pratique, on répond à des questions précises, et on évite de donner des solutions toutes prêtes : montre que tu t'es attaqué au problème, décris ce qui te gêne ou ce que tu ne comprends pas, et alors quelqu'un se fera le plaisir de t'éclairer.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Alors ben je vais commencer^^:

    On me demande de réaliser un programme transformant une chaine de caractères en liste de caractères... Voici ce que je propose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec ls l = match string_length l with
    0 -> []
    |n -> let u = sub_string (l 0 (n-1)) in (string_of_char (l.[n]))^ls u;;
    Le string_of_char c'est pour s'assurer qu'on ait bien une liste de caractères et non une liste de chaines de caractères...
    Le bémol c'est que Caml renvoie ( en pointant l.[n])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    This expression has type int -> int -> string,
    but is used with type string.
    Je ne comprend pas trop pourquoi une telle réponse...
    Cordialement

  4. #4
    Membre actif
    Avatar de Ptival
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 70
    Points : 276
    Points
    276
    Par défaut
    Quelques remarques :

    - l.[n] est un sucre syntaxique pour String.get l n. String.get a pour type string -> int -> char. Donc le résultat a pour type char, qui est un caractère. Puisque ton but semble être de retourner une liste de caractères (c'est différent de string !), tu n'as a priori pas besoin de passer par "string_of_char".

    - (^) est l'opérateur de concaténation de strings, qui a pour type string -> string -> string. Encore une fois, ça n'a pas l'air de correspondre au type du résultat que tu essaies de créer. A mon avis, tu veux utiliser ( :: ) : 'a -> 'a list -> 'a list, pour créer une liste à partir d'un élément et d'une sous-liste.

  5. #5
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Un indice avant d'aller plus loin : pourquoi sub_string ? La chaîne peut rester entière, il suffit juste de changer la valeur de l'indice. Regarde cette fonction qui peut te donner idées pour faire ce que tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let print_rev str =
      let rec loop = function
        | 0 -> ()
        | i -> let j = i - 1 in
          print_char str.[j]; print_newline ();
          loop j
      in loop (String.length str)
    Cordialement,
    Cacophrène

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour la réponse.
    Soit dit en passant, on utilise camllight. (Je fais cette remarque parce qu'il semble que le Caml qu'on utilise en TD ne reconnait pas "String.get" par exemple).

    Sinon en corrigeant le programme ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec ls l = match string_length l with
    0 -> []
    |n -> let u = sub_string (l 0 (n-1)) in l.[n]::ls u;;
    Caml renvoie toujours et encore...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    This expression has type int -> int -> string,
    but is used with type string.
    l.[n] ne devrait-il pas m'envoyer un élément de type char? Et pourquoi "is used with type string"?

  7. #7
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Citation Envoyé par carlesup3
    Soit dit en passant, on utilise camllight. (Je fais cette remarque parce qu'il semble que le Caml qu'on utilise en TD ne reconnait pas "String.get" par exemple)
    Oui, sub_string et d'autres fonctions indiquent bien Caml light. Comme beaucoup sur le forum, j'utilise exclusivement OCaml mais vous avez remarqué que la plupart des conversions sont quasi immédiates. Les notations comme String.get sont liées à la présence de modules dans OCaml, dont l'équivalent Caml light est souvent facile à trouver.

    Citation Envoyé par carlesup3
    Caml renvoie toujours et encore...
    Le problème vient de ces parenthèses (en rouge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let rec ls l = match string_length l with
    | 0 -> []
    | n -> let u = sub_string (l 0 (n-1)) in l.[n]::ls u
    Concernant plus précisément le code source proposé, essayez d'utiliser des noms moins confusifs. Par exemple, l pour une chaîne, c'est maladroit. Souvent, l désigne une liste et, de plus, on déconseille l'utilisation de cette lettre qui se confond facilement avec 1. Ça c'est pour la forme. C'est peu de choses et peut-être que ça paraît du pinaillage mais tu verras que ça te rendra de grands services par la suite.

    Concernant le fond maintenant : il n'y a pas besoin de sub_string. Pour écrire une fonction qui transforme une chaîne en liste de caractères, il suffit d'incrémenter une valeur n de 0 jusqu'à string_length - 1. Je vous propose de compléter ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let list_of_string str =
      let rec loop n =
        if n = ... then ...
        else ...
      in loop ...
    Cordialement,
    Cacophrène

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/07/2009, 11h44
  2. Réponses: 9
    Dernier message: 19/01/2009, 13h45
  3. Réponses: 2
    Dernier message: 26/11/2005, 13h44
  4. liste chainée :suppression milieu par rapport à un caractère
    Par Pouyou le caribou dans le forum C++
    Réponses: 4
    Dernier message: 06/06/2005, 18h49

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