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ď č. 1Je 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