2016-09-26 9 views
0

该函数将实数的列表保存到文件:SML:如何写在文件两个清单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 

调用函数:

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

将以下内容写入文件hello.txt的

1.0 
2.0 
3.0 
4.0 

如果我有两个表,一个包含实数的列表,另一个是单词列表,我如何读取和写入这两个列表到文件中?例如:

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

应该写下面的文件hello.txt的

1.0 one 
2.0 two 
3.0 three 
4.0 four 

回答

1

首先,这里是一些一般性的反馈:

  1. 这是很好的习惯attribute your sources,在这种情况下会提供一些上下文。

  2. 一个函数可以将多个实数写入一个文件,也许应该叫做writeReals(复数)。

  3. 由于您丢弃了List.map的结果,请考虑使用List.app

如果我有两个表,一个包含实数列表,文字的另一列表,我怎么读,写两个列表的文件吗?

  • 我会建议你实际上写对的列表,而不是对列表。成对的列表,例如[(1.0, "Hello"), (2.0, "World")],将始终有相同数量的实数和字符串。一对列表,例如([1.0, 2.0, 3.0], ["Hello", "World"])不一定会那样。

    如果你被迫用一对名单的工作,你可以将它们转换成使用内置的库函数ListPair.zip像这样对的列表:

    - ListPair.zip ([1.0, 2.0, 3.0], ["Hello", "World"]); 
    > val it = [(1.0, "Hello"), (2.0, "World")] : (real * string) list 
    
  • 写对的列表,这里有一些提示:

    1. 写一个函数,pairToString : (real * string) -> string是一对转换成可以写入文件中的一行。例如,pairToString (1.0, "Hello")应产生字符串"1.0 Hello\r\n"

    2. 使用上面的框架功能应用此功能:

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

      ,你的东西明智的替代...

  • 读对的列表,这里有一些提示:

    1. 写一个函数pairFromString : string -> (real * string)从文件中的行转换成一对。例如,pairFromString "1.0 Hello\r\n"应该产生这对(1.0, "Hello")

      这个功能是所谓的解析器,并不是完全微不足道的写。结合例如功能String.tokens,您可能会玩得很开心。 Char.isSpaceReal.fromString。请注意,Real.fromString实际上返回实际选项的值(如果它失败),因此您需要使用例如

      case Real.fromString word1 of 
          NONE => raise Fail ("Couldn't parse as number: "^word1) 
          | SOME r => r 
      
    2. 将此函数应用于文件中的每一行,例如,通过这样做:

      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 
      

      你在哪里用合理的东西代替...