采用文件名和列表的SML函数

时间:2017-10-03 06:52:46

标签: string function char sml

我想编写一个函数,它将文件名作为字符串和一对字符列表。此函数必须打开命名文件,读取文件内容,并将字符回显到屏幕。必须在对的第一个位置中出现任何字符作为该对中第二个位置的字符。例如,调用诸如fileSubst“inputFile”[(#“a”,#“b”),(#“b”,#“z”)]之类的调用将回显inputFile的内容,并替换所有出现的字符a由字符b和字符b的所有出现替换为字符z。

    fun fileSubst (fileName : string, []) = nil
  | fileSubst (fileName, (a,b)::cs) = let 
    val stream = TextIO.openIn fileName    
     TextIO.input1 = fileSubst (fileName,cs) in if isSome a 
    then print(Char.toString(a)) else TextIO.print end ;

1 个答案:

答案 0 :(得分:2)

正如@molbdnilo建议的那样,将其分成几个可能在其他环境中有用的函数。您可以将其划分为一个函数,将文件的内容读入字符串

fun readFile fname =
    let val fd = TextIO.openIn fname
        val contents = TextIO.inputAll fd
        val _ = TextIO.closeIn fd
    in contents end

一个在字符对列表中搜索正确映射的函数,

fun lookup [] needle = NONE
  | lookup ((key,value)::haystack) needle =
    if needle = key then SOME value else lookup haystack needle

此函数的变体,将键作为默认值返回

fun lookupDefault haystack needle =
    Option.getOpt (lookup haystack needle, needle)

和一个将字符串中的每个字符映射到另一个字符的函数,

fun subst mapping = String.map (lookupDefault mapping)

然后,您可以编写这些文件以获取对文件进行操作的文件。我不确定我会假设函数调用fileSubst "foo.txt"可能会读取文件的内容,执行替换将结果打印到屏幕。为什么不将它写回文件或将其作为字符串返回?

由于您可以对文件内容执行许多操作,因此您还可以创建更通用的文件处理功能,

fun withFile fname f =
    let val fd = TextIO.openIn fname
        val contents = TextIO.inputAll fd
        val _ = TextIO.closeIn fd
    in f contents end

然后,例如,

- withFile "helloworld.txt" (print o subst [(#"l", #"L")]);
HeLLo, WorLd!

通过制作通用的函数,您不必使用高度专业化的函数来填充库,这些函数可能不会被重复使用。