/ / SML: Nahradenie konkata tlačou reťazca priamo - algoritmus, optimalizácia, sml, smlnj

SML: Nahradenie konkata tlačou reťazca priamo - algoritmus, optimalizácia, sml, smlnj

Mám funkciu, ktorá práve pracuje správne ... Ale čo bohužiaľ vytvára veľmi veľký reťazec pred zobrazením.

Chcel by som zobraziť každý reťazec priamo namiesto toho, aby som ho zosilnil, ale neviem, ako to urobiť ...

Tu je funkcia:

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
)

Táto funkcia zlučuje všetky w"možné a potom:

fun af w = print( getBlocked(w) )

s af Ja som schopný zobraziť jeden uzol a potom vo finálnom kóde, ktorý volám

app af ( Nodestore.listNodes() )

A moju funkciu app zavolám af na všetkých Node môjho listNodes().

Ako som povedal, tento kód funguje, ale keď zoznam začína byť obrovský, už nie je použiteľný ... Myslím, že concat určite nie je dobrý nápad, preto by som ho chcel nahradiť a dať si ho priamo zobraziť w" nástupcu každého z nich w, Ale bohužiaľ som úplne nováčik v SML a neviem ako to urobiť ...

Ďakujeme vopred za vašu pomoc :)

S Pozdravom.

odpovede:

3 pre odpoveď č. 1

Je to trochu nejasné, čo naozaj chcete, ale podľa toho, čo chápem, by ste mali vyriešiť váš problém:

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

S počtom zobrazení:

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