添加项目到列表SML

时间:2017-04-22 13:36:42

标签: list functional-programming sml smlnj

我是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”函数中获取了正确的值,因为我通过使用它来测试它打印(动作(...))

由于

1 个答案:

答案 0 :(得分:2)

问题出在这一部分:

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

这是创建一个新列表,然后在执行递归调用之前立即将其丢弃。你想做的是

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

其他提示:只需简单使用List.appList.foldl即可替换您的辅助功能。

编辑:进一步提示:事实上,您可以将其写为

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

因为带有“两个参数”的函数只是一对函数。