/ / SML: Zastępowanie konkatala przez bezpośrednie drukowanie ciągu znaków - algorytm, optymalizacja, sml, smlnj

SML: Zastępowanie konkata przez bezpośrednie drukowanie ciągu znaków - algorytm, optymalizacja, sml, smlnj

Mam teraz funkcję, która działa poprawnie ... Ale który niestety tworzy bardzo duży ciąg przed wyświetleniem go.

Chciałbym wyświetlić każdy ciąg bezpośrednio, zamiast je łącząc, ale nie wiem jak to zrobić ...

Oto funkcja:

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
)

Ta funkcja łączy wszystkie w"możliwe, a następnie:

fun af w = print( getBlocked(w) )

Z af Mogę wyświetlić jeden węzeł, a następnie w ostatnim kodzie, do którego dzwonię

app af ( Nodestore.listNodes() )

I moja funkcja app zadzwonię af na wszystkich Node z mojego listNodes().

Tak jak powiedziałem, ten kod działa, ale kiedy lista zaczyna być ogromna, nie jest już użyteczna ... Domyślam się, że concat zdecydowanie nie jest dobrym pomysłem, więc chciałbym go zastąpić i móc wyświetlać bezpośrednio każdy w" następca każdego w. Ale niestety, jestem całkiem nowy w SML i nie wiem jak to zrobić ...

Z góry dziękuje za twoją pomoc :)

Z poważaniem.

Odpowiedzi:

3 dla odpowiedzi № 1

To trochę niejasne, czego naprawdę chcesz, ale z tego, co rozumiem, następujące rozwiązania powinny rozwiązać twój problem:

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

Przy liczbie wyświetleń:

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