2016-04-29 4 views
2

私は今のところ正しく働いている機能を持っています... 残念ながら、表示する前に非常に大きな文字列を構成しています。SML:文字列を直接印刷することによって連結を置換する

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 
     ) 

この機能は、すべて連結されています

私はそれらをconcateningの代わりに、直接、すべての文字列を表示したいと思いますが、私はどのように行うのか分からない...ここで

機能です可能w'、その後:af

fun af w = print(getBlocked(w)) 

私は1つのノードを表示することができますよ。そして、最終的なコードで、私は

app af (Nodestore.listNodes()) 

を呼んでいると、私の機能 appは私の listNodes()のすべて Nodeafを呼び出します。

私が言ったように、このコードは動作していますが、リストが巨大になるともう使用できません... 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'にアクセスすることができます:/ –

関連する問題