我是SML的新手,我正在尝试将一些项目添加到列表中
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;
每当我运行代码时,我都会得到一个空白的输出文件,但是我无法找出原因,但我确实知道帮助函数从“act”函数中获取了正确的值,因为我通过使用它来测试它打印(动作(...))
由于
答案 0 :(得分:2)
问题出在这一部分:
( act(#1 c, #2 c)::stack; helper(lis, stack) )
这是创建一个新列表,然后在执行递归调用之前立即将其丢弃。你想做的是
helper(lis, act(#1 c, #2 c)::stack)
其他提示:只需简单使用List.app
和List.foldl
即可替换您的辅助功能。
编辑:进一步提示:事实上,您可以将其写为
helper(lis, act(c)::stack)
因为带有“两个参数”的函数只是一对函数。