我现在有一个正常工作的功能...... 但不幸的是,在显示之前构建一个非常大的字符串。
我想直接显示每个字符串而不是连接它们但我不知道该怎么做...
这是功能:
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的新手,我不知道该怎么做......
提前感谢您的帮助:)
最诚挚的问候。
答案 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