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

SML : Replacing a concat by printing the string directly

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

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

函数如下:

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 将在我的 listNodes() 的所有 Node 上调用 af

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

提前感谢您的帮助:)

此致。

有点不清楚你到底想要什么,但据我了解,以下应该可以解决你的问题:

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