2016-04-29 81 views
2

我有一個正在正確工作的函數... 但是,不幸的是在顯示它之前構造了一個很大的字符串。SML:通過直接打印字符串替換連續字符

我想顯示每個字符串,而不是直接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將調用aflistNodes()的所有Node

所以,正如我所說的,這段代碼正在工作,但是當列表開始變得龐大時,它不再可用了......我的猜測是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':/ –