2017-04-22 1 views
0

Ich bin zu SML sehr neu und ich versuche, einige Elemente zu einer Liste Artikel SML zur Liste hinzufügen

fun foo(inFile : string, outFile : string) = let 
val file = TextIO.openIn inFile 
val outStream = TextIO.openOut outFile 
val contents = TextIO.inputAll file 
val lines = String.tokens (fn c => c = #"\n") contents 
val lines' = List.map splitFirstSpace lines 
fun helper1(lis : string list) = 
    case lis of 
      [] => (TextIO.closeIn file; TextIO.closeOut outStream) 
     | c::lis => (TextIO.output(outStream, c); 
    helper1(lis)) 
fun helper(lis : (string * string) list, stack : string list) = 
    case lis of 
      [] => stack 
     | c::lis => (act(#1 c, #2 c)::stack; 
    helper(lis, stack)) 
val x = helper(lines', []) 
in 
helper1(x) 
end; 

Ich erhalte eine leere Ausgabedatei, wenn ich den Code ausführen und ich

hinzufügen m Mühe, herauszufinden, warum, aber ich weiß, dass die Hilfsfunktion, die richtigen Werte aus der „Handlung“ -Funktion wird immer, weil ich es getestet, indem das drucken mit (Aktion (...))

Dank

Antwort

2

der Problem ist mit diesem Teil:

(act(#1 c, #2 c)::stack; helper(lis, stack)) 

Dies erstellt eine neue Liste und verwirft diese sofort, bevor der rekursive Aufruf ausgeführt wird. Was Sie wollen, anstatt zu tun ist,

helper(lis, act(#1 c, #2 c)::stack) 

Zusätzlicher Hinweis: sowohl Ihre Helferfunktionen können durch einfache Verwendung von List.app und List.foldl ersetzt werden.

Edit: Weiterer Tipp: In der Tat kann man das nur als

helper(lis, act(c)::stack) 

, da eine Funktion mit „zwei Argumenten“ schreiben ist einfach eine Funktion ein Paar nehmen.

Verwandte Themen