2017-10-03 16 views
0

ファイル名を文字列とし、文字のペアのリストをとる関数を記述します。この関数は、指定されたファイルを開き、ファイルの内容を読み込み、文字を画面にエコーする必要があります。ペアの最初の位置にある文字は、そのペアの2番目の位置の文字としてエコーされなければなりません。たとえば、fileSubst "inputFile" [(# "a"、# "b")、(# "b"、# "z")]のような呼び出しは、置換された文字がすべて出現したinputFileの内容をエコーし​​ます文字bとすべての文字bの出現を文字zで置き換えます。 @molbdniloが示唆したようファイル名とリストを取るSML関数

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 ; 
+0

これを単一の機能で解決しようとしないでください。文字のリストを変換する問題を解決することから始めることは、実りあるものになる可能性があります。 – molbdnilo

答えて

2

は、他の文脈で有用であるかもしれないいくつかの機能にこれを分割します。あなたは、文字列の中に、ファイルの内容を読み込んで一つの機能、

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! 

便利な関数であれば、ライブラリを多くの場合には再利用されないような高度に特殊化された関数で埋める必要はありません。

関連する問題