Search code examples
sml

Turning a string into a char list list using SML


I'm trying to turn a string into a char list list and I have the following code:

fun linelist file =
                     let
                       val instr = TextIO.openIn file
                       val str   = TextIO.inputAll instr
                     in 
                       String.tokens (fn x => x = #"\n")str
                     before
                       TextIO.closeIn instr
                     end;

fun getsudo file   = map explode (linelist file);

I need to turn a file (sudo.txt) with the following

53**7****\n6**195***\n*98****6*\n8***6***3\n4**8*3**1\n7***2***6\n*6****28*\n***419**5\n****8**79\n

into

[[#"5",#"3",#"*",#"*",#"7",#"*",#"*",#"*",#"*",],
[#"6",#"*",#"*",#"1",#"9",#"5",#"*",#"*",#"*",],
[#"*",#"9",#"8",#"*",#"*",#"*",#"*",#"6",#"*",],
[#"8",#"*",#"*",#"*",#"6",#"*",#"*",#"*",#"3",],
[#"4",#"*",#"*",#"8",#"*",#"3",#"*",#"*",#"1",],
[#"7",#"*",#"*",#"*",#"2",#"*",#"*",#"*",#"6",],
[#"*",#"6",#"*",#"*",#"*",#"*",#"2",#"8",#"*",],
[#"*",#"*",#"*",#"4",#"1",#"9",#"*",#"*",#"5",],
[#"*",#"*",#"*",#"*",#"8",#"*",#"*",#"7",#"9",]]

but I get this instead

[[#"5",#"3",#"*",#"*",#"7",#"*",#"*",#"*",#"*",#"\\",#"n",#"6",
  #"*",#"*",#"1",#"9",#"5",#"*",#"*",#"*",#"\\",#"n",#"*",#"9",
  #"8",#"*",#"*",#"*",#"*",#"6",#"*",#"\\",#"n"#"8",#"*",#"*",
  #"*",#"6",#"*",#"*",#"*",#"3",#"\\",#"n",#"4",#"*",#"*",#"8",
  #"*",#"3",#"*",#"*",#"1",#"\\",#"n",#"7",#"*",#"*",#"*",#"2",
  #"*",#"*",#"*",#"6",#"\\",#"n",#"*",#"6",#"*",#"*",#"*",#"*",
  #"2",#"8",#"*",#"\\",#"n",#"*",#"*",#"*",#"4",#"1",#"9",#"*",
  #"*",#"5",#"\\",#"n",#"*",#"*",#"*",#"*",#"8",#"*",#"*",#"7",
  #"9",#"\\",#"n"]]

How do I fix it?


Solution

  • You need to locate or write the lines function. It takes a string and break it into an array of strings according to where the Newline characters occur.

    It's called lines in haskell. Other than that; instead of inutAll, you'll have to input line-by-line while accumulating an array of strings.

    Also, it appears you input file has the actual '\' \n' characters instead of newlines.

    The input should be:

    53**7****
    6**195***
    *98****6*
    8***6***3
    4**8*3**1
    7***2***6
    *6****28*
    ***419**5
    ****8**79
    

    lines.sml:

    open Char;
    open String;
    open List;
    
    fun linelist file =
        let val instr = TextIO.openIn file
            val str   = TextIO.inputAll instr
        in tokens isSpace str
           before
           TextIO.closeIn instr
        end;
    
    
    fun getsudo file   = map explode (linelist file);
    
    
    fun  main args = 
       getsudo "sudo.txt";
    

    Session:

    - main 1;
    val it =
      [[#"5",#"3",#"*",#"*",#"7",#"*",#"*",#"*",#"*"],
       [#"6",#"*",#"*",#"1",#"9",#"5",#"*",#"*",#"*"],
       [#"*",#"9",#"8",#"*",#"*",#"*",#"*",#"6",#"*"],
       [#"8",#"*",#"*",#"*",#"6",#"*",#"*",#"*",#"3"],
       [#"4",#"*",#"*",#"8",#"*",#"3",#"*",#"*",#"1"],
       [#"7",#"*",#"*",#"*",#"2",#"*",#"*",#"*",#"6"],
       [#"*",#"6",#"*",#"*",#"*",#"*",#"2",#"8",#"*"],
       [#"*",#"*",#"*",#"4",#"1",#"9",#"*",#"*",#"5"],
       [#"*",#"*",#"*",#"*",#"8",#"*",#"*",#"7",#"9"]] : char list list
    -