【问题标题】:Does it matter where a shift stands in a reset block?重置块中的移位是否重要?
【发布时间】:2011-09-05 01:24:00
【问题描述】:

假设,有一个reset 块和一个shift

val r = 重置 {
   // 做某事。 1
   转移 {...}
   // 做某事。 2
   // 做某事。 3
}

我将shift 放在“do smth.2”或“do smth.3”之后而不改变结果r 是否正确? shiftreset 块中的位置无关紧要是否正确?

【问题讨论】:

    标签: scala continuations delimited-continuations


    【解决方案1】:

    这在很大程度上取决于您在shift 中所做的事情。如果您只是像这样调用提供的函数:shift((k: Unit => Unit) => k(Unit)) 那么,在您的特定示例中,shift 的位置并不重要。

    Shift 函数只捕获其他函数中的代码(在我的示例中,此函数称为k)。换句话说,这段代码:

    val r = reset { 
       // do smth. 1
       shift((k: Unit => Unit) => k(Unit))
       // do smth. 2
       // do smth. 3
    }
    

    将由编译器以这样的方式重写(此代码仅展示一般概念,并不应该显示编译器插件实际生成的内容):

    val k = (Unit => Unit) => {
        // do smth. 2
        // do smth. 3
    } 
    
    val r = { 
       // do smth. 1
       k(Unit)
    }
    

    但是,如果您在 shift 内部有一些逻辑,例如有条件的 k 执行,那么这个 shift 的位置真的很重要。

    希望这会有所帮助(我希望我正确理解了您的问题)

    【讨论】:

      【解决方案2】:

      除了已经给出的答案之外,您可以在shift 中移动的地方是在班次之前有代码还是将其包含在您传递给shift 的函数中:

      reset { 
        foo(); bar();
        shift { k => stuff }
        baz()
      }
      

      相同
      reset {
        foo();
        shift { k => bar(); stuff }
        baz()
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-25
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        • 2016-09-18
        • 1970-01-01
        相关资源
        最近更新 更多