2016-04-29 6 views
2

У меня есть функция, которая корректно работает на данный момент ... Но это, к сожалению, создает очень большую строку перед ее отображением.SML: Замена concat путем прямой печати строки

Я хотел бы, чтобы отобразить каждую строку непосредственно вместо concatening их, но я не знаю, как это сделать ...

Вот функция:

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

Это немного неясно, что вы действительно хотите, но от того, что я понимаю, следующий должен решить проблему:

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 
+0

Спасибо! * - * Это именно то, что я хочу :) Мне просто нужна функция из того, что вы написали, что дает мне количество времени, которое мы называем «renderW», и я полностью разрешу свою проблему :) Любая идея как я мог это сделать? Если неважно, вы уже много сделали, я справлюсь с этим :) –

+0

@ValentinMontmirail Я добавил для этого версию. Надеюсь, поможет. –

+0

Кажется очень приятным :), но сначала мне нужно знать, сколько будет, и тогда мне нужно будет его отобразить:/ И в этом коде он делает оба в одно и то же время:/и я действительно не знаю, как я может получить доступ к этому 'count':/ –

 Смежные вопросы

  • Нет связанных вопросов^_^