2016-09-26 1 views
0

Cette fonction écrit une liste de reals dans un fichier:SML: Comment écrire deux listes dans des fichiers avec ML

fun writeReal (real, filename) = 
    let val fd = TextIO.openOut filename 
     val _ = map (fn i => TextIO.output (fd, Real.toString i^"\r\n")) real 
     val _ = TextIO.closeOut fd 
    in() end 

appel de la fonction:

writeReal ([1.0,2.0,3.0,4.0], "hello.txt") 

écrit ce qui suit au fichier hello.txt:

1.0 
2.0 
3.0 
4.0 

Si j'avais deux listes, l'une contenant une liste de reals , et l'autre une liste de mots, comment puis-je lire et écrire les deux listes dans le fichier? Par exemple:

writeReal ([1.0,2.0,3.0,4.0], [one, two, three, four] , "hello.txt") 

devrait écrire ce qui suit au fichier hello.txt:

1.0 one 
2.0 two 
3.0 three 
4.0 four 

Répondre

1

Tout d'abord, voici quelques commentaires généraux:

  1. Il est bon coutume attribute your sources, ce qui dans ce cas fournirait un contexte.

  2. Une fonction qui écrit beaucoup de réels dans un fichier devrait peut-être s'appeler writeReals (pluriel). Comme vous avez ignoré les résultats de List.map, utilisez List.app

Si j'avais deux listes, l'une contenant une liste de nombres réels, et l'autre une liste de mots, comment puis-je lire et écrire les deux listes au fichier?

  • Je recommande que vous écrivez en fait une liste de paires, plutôt que d'une paire de listes. Une liste de paires, par ex. [(1.0, "Hello"), (2.0, "World")], aura toujours un nombre égal de réels et de chaînes. Une paire de listes, par ex. ([1.0, 2.0, 3.0], ["Hello", "World"]) n'aura pas nécessairement cela.

    Si vous êtes obligé de travailler avec une paire de listes, vous pouvez les convertir en une liste de paires en utilisant la fonction bibliothèque intégrée ListPair.zip comme ceci:

    - ListPair.zip ([1.0, 2.0, 3.0], ["Hello", "World"]); 
    > val it = [(1.0, "Hello"), (2.0, "World")] : (real * string) list 
    
  • Rédaction d'une liste de paires , voici quelques conseils:

    1. Ecrire une fonction, pairToString : (real * string) -> string qui convertit une seule paire en une ligne qui peut être écrit dans le fichier. Par exemple, pairToString (1.0, "Hello") doit produire la chaîne "1.0 Hello\r\n".

    2. Appliquer cette fonction en utilisant votre fonction cadre ci-dessus:

      fun writeRealStringPairs (pairs, filename) = 
          let val fd = TextIO.openOut filename 
           val _ = List.app ... pairs 
           val _ = TextIO.closeOut fd 
          in() end 
      

      où vous remplacez ... avec quelque chose de sensé.

  • La lecture d'une liste de paires, voici quelques conseils:

    1. écrire une fonction pairFromString : string -> (real * string) qui convertit une ligne de fichier dans une paire. Par exemple, pairFromString "1.0 Hello\r\n" doit produire la paire (1.0, "Hello").

      Cette fonction est ce que l'on appelle un analyseur et n'est pas complètement triviale à écrire. Vous pourriez avoir de la chance en jouant avec la fonction String.tokens en combinaison avec par exemple. Char.isSpace et Real.fromString. Notez que Real.fromString renvoie réellement une valeur de type l'option réelle en cas d'échec, vous devez donc effectuer une correspondance de modèle à l'aide, par exemple.

      case Real.fromString word1 of 
          NONE => raise Fail ("Couldn't parse as number: "^word1) 
          | SOME r => r 
      
    2. Appliquez cette fonction à chaque ligne d'un fichier, par ex. en faisant:

      fun isLinebreak c = c = #"\r" orelse c = #"\n" 
      fun readRealStringPairs filename = 
          let val fd = TextIO.openIn filename 
           val content = TextIO.inputAll fd 
           val _ = TextIO.closeIn fd 
           val lines = String.tokens isLinebreak content 
           val pairs = List.map ... lines 
          in pairs end 
      

      où vous remplacez ... avec quelque chose de sensé.