SML:通过直接打印字符串来替换concat

时间:2016-04-29 11:29:47

标签: algorithm optimization sml smlnj

我现在有一个正常工作的功能...... 但不幸的是,在显示之前构建一个非常大的字符串。

我想直接显示每个字符串而不是连接它们但我不知道该怎么做...

这是功能:

fun getBlocked w =
    case BlockingMgr.listBlockedSuccessors w
    of nil => ""
    |  ws  =>
        concat (
            List.map (
                fn (r, w') => ( 
                   " v " ^ r ^ 
                   " w " ^ Int.toString (Node.getId w ) ^ 
                   " w"  ^ Int.toString (Node.getId w') ^ "\n" 
            ) ws
        )

此功能将所有w'连接起来,然后连接:

fun af w = print( getBlocked(w) )

使用af,我可以显示一个节点。然后在最后的代码中我打电话给

app af ( Nodestore.listNodes() ) 

我的函数app会在af的所有Node上致电listNodes()

正如我所说,这段代码正在运行,但是当列表开始变得庞大时,它就不再可用了......我的猜测是concat绝对不是一个好主意,所以我想替换它并能够直接显示每个w'的每个w后继者。但不幸的是,我是SML的新手,我不知道该怎么做......

提前感谢您的帮助:)

最诚挚的问候。

1 个答案:

答案 0 :(得分:3)

有点不清楚你真正想要的是什么,但据我所知,以下内容可以解决你的问题:

fun displayBlocked w =
  let
    fun renderW (r, w') =
      " v " ^ r ^
      " w " ^ Int.toString (Node.getId w ) ^
      " w"  ^ Int.toString (Node.getId w') ^ "\n"
  in
    case BlockingMgr.listBlockedSuccessors w
    of nil => ()
    |  ws  => List.app (fn w => print (renderW w)) ws
  end

显示计数:

fun displayBlocked w =
  let
    fun renderW (r, w') =
      " v " ^ r ^
      " w " ^ Int.toString (Node.getId w ) ^
      " w"  ^ Int.toString (Node.getId w') ^ "\n"

    fun renderAndInc (w, count) =
      (
        print (renderW w);
        count + 1
      )
  in
    case BlockingMgr.listBlockedSuccessors w
    of nil => 0
    |  ws  => List.foldl renderAndInc 0 ws
  end