【问题标题】:SML : Replacing a concat by printing the string directlySML:通过直接打印字符串来替换连接
【发布时间】:2016-08-24 13:10:15
【问题描述】:

我有一个现在可以正常工作的功能... 但不幸的是,在显示之前构建了一个非常大的字符串。

我想直接显示每个字符串而不是连接它们,但我不知道该怎么做...

函数如下:

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'possible 然后:

fun af w = print( getBlocked(w) )

使用af 我可以显示一个节点。然后在我调用的最终代码中

app af ( Nodestore.listNodes() ) 

我的函数app 将在我的listNodes() 的所有Node 上调用af

正如我所说,这段代码可以工作,但是当列表开始变得很大时,它就不再可用了......我的猜测是concat 绝对不是一个好主意,所以我想替换它并能够直接显示每个w' 的每个w 的继任者。但不幸的是,我是 SML 的新手,我不知道该怎么做......

提前感谢您的帮助:)

最好的问候。

【问题讨论】:

    标签: algorithm optimization sml smlnj


    【解决方案1】:

    有点不清楚你真正想要什么,但据我了解,以下应该可以解决你的问题:

    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
    

    【讨论】:

    • 谢谢! -- 这正是我想要的 :) 我现在只需要你写的一个函数,它给了我我们称之为“renderW”的时间,我将完全解决我的问题 :) 任何想法我怎么能做到这一点?如果不介意的话,你已经做了很多我会从这里管理的:)
    • @ValentinMontmirail 我为此添加了一个版本。希望对您有所帮助。
    • 看起来很不错 :) 但我首先需要知道它将有多少,然后我需要显示它:/ 在这段代码中,它同时执行这两个操作:/ 我没有我真的不知道如何访问这个count:/
    • @ValentinMontmirail List.length 为您提供列表的大小。在迭代 ws 之前使用它。
    猜你喜欢
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多