在sml中复制文件

在sml中复制文件,sml,smlnj,Sml,Smlnj,我正在尝试学习sml中的输入输出。为了将与s1相同的ls字符串复制到文件l2中,我做了以下操作。我遇到了一些我无法理解的错误。有人能帮我解决吗 fun test(l2:string,ls:string list,s1:string) = if (String.isSubstring(s1 hd(ls))) then (TextIO.openOut l2; TextIO.inputLine hd(ls))::test(l2,tl(ls),s1) el

我正在尝试学习sml中的输入输出。为了将与
s1
相同的
ls
字符串复制到文件
l2
中,我做了以下操作。我遇到了一些我无法理解的错误。有人能帮我解决吗

fun test(l2:string,ls:string list,s1:string) = if (String.isSubstring(s1 hd(ls))) then

                       (TextIO.openOut l2; TextIO.inputLine hd(ls))::test(l2,tl(ls),s1) else 

                       test(l2,tl(ls),s1);

以下是一些一般提示:

  • 将变量命名为有意义的名称,如
    文件名
  • 函数
    TextIO.inputLine
    instream
    类型的值作为参数
  • 当您编写
    TextIO.inputLine hd(ls)
    时,实际解释为
    (TextIO.inputLine hd)ls
    ,意思是“将
    hd
    视为
    流内
    ,并且 试着从中读一行,把那一行当作函数, 并将其应用于
    ls
    ”,这当然完全是胡说八道

    在这种情况下,正确的括号应该是
    TextIO.inputLine(hd ls)
    ,它 仍然没有意义,因为我们决定
    ls
    字符串列表
    ,因此
    hdls
    将是
    字符串
    ,而不是
    流内

  • 下面是一些与您想做的事情相似但相反的事情:

    (* Open a file, read each line from file and return those that contain mySubstr *)
    fun test (filename, mySubstr) =
        let val instr = TextIO.openIn filename
            fun loop () = case TextIO.inputLine instr of
                              SOME line => if String.isSubstring mySubstr line
                                           then line :: loop () else loop ()
                            | NONE => []
            val lines = loop ()
            val _ = TextIO.closeIn instr
        in lines end
    

    您需要使用
    TextIO.openOut
    TextIO.output
    TextIO.inputLine
    是一种从文件中读取数据的程序。

    这很有帮助,但我不理解
    val=TextIO.closeIn instr
    。我不知道函数可以以
    ()
    为参数。你能在这里也谈谈
    ()
    吗。听起来你想读一本关于标准ML的书。
    ()
    是类型
    单位的单个值。请去查一下。