У мене є функція, яка працює належним чином ... Але, на жаль, створюючи дуже великий рядок перед його відображенням.
Я хотів би відобразити кожен рядок безпосередньо, а не континентувати їх, але я не знаю, як це зробити ...
Ось функція:
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, і я не знаю, як це зробити ...
Заздалегідь дякую за вашу допомогу :)
З найкращими побажаннями.
Відповіді:
3 для відповіді № 1Це трохи незрозуміло, що ви дійсно хочете, але з того, що я розумію, наступне має вирішити вашу проблему:
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