/ / SML: Заміна concat шляхом безпосереднього друку рядка - алгоритм, оптимізація, sml, smlnj

SML: Заміна concat шляхом безпосереднього друку рядка - алгоритм, оптимізація, 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, і я не знаю, як це зробити ...

Заздалегідь дякую за вашу допомогу :)

З найкращими побажаннями.

Відповіді:

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