链表样式函数调用的 CPS 样式
CPS style for linked-list style function calls
我正在尝试将以下代码转换为连续传递样式。代码最初返回一个 String
,所以我将其更改为调用一个采用 String
的 continue lambda。我想知道如何删除 next
字段并改用 CPS 样式。
class Foo(val x: Double) {
var next: Foo = _
def bar(y: Double, returnLambda: (String => Unit)): Unit = {
if (x * y > 0) {
returnLambda("Bad")
} else if (next == null) {
returnLambda("Good!")
next = new Foo(y)
} else {
next.bar(y, returnLambda)
}
}
}
看起来你构建了一个 Foo
值的单链表;只要新值的符号不同于现有值,就会在列表末尾添加新值。
在函数式方法中,您不会将列表管理嵌入到列表中的对象中。相反,您将单独维护一个列表,var next: List[Foo]
,并通过以下方式执行追加:
if ( next.all( _ * y <= 0) )
returnLambda("Bad")
else {
returnLambda("Good")
next = next :+ Foo(y)
}
由于我们已经扁平化了列表操作,CPS 的使用就失去了它的好处;你可以简单地 return 字符串 "Good" 或 "Bad".
假设您真的非常需要 CPS,您可以通过将 next
字段移动到伴随对象中来删除它:
object Foo {
val listOfFoo: ListBuffer[Foo] = ListBuffer[Foo].empty
def bar(y: Double, returnLambda: (String => Unit)): Unit =
if ( listOfFoo.all(_ * y <= 0) )
returnLambda("Bad")
else {
listOfFoo += Foo(y)
returnLambda("Good")
}
}
我正在尝试将以下代码转换为连续传递样式。代码最初返回一个 String
,所以我将其更改为调用一个采用 String
的 continue lambda。我想知道如何删除 next
字段并改用 CPS 样式。
class Foo(val x: Double) {
var next: Foo = _
def bar(y: Double, returnLambda: (String => Unit)): Unit = {
if (x * y > 0) {
returnLambda("Bad")
} else if (next == null) {
returnLambda("Good!")
next = new Foo(y)
} else {
next.bar(y, returnLambda)
}
}
}
看起来你构建了一个 Foo
值的单链表;只要新值的符号不同于现有值,就会在列表末尾添加新值。
在函数式方法中,您不会将列表管理嵌入到列表中的对象中。相反,您将单独维护一个列表,var next: List[Foo]
,并通过以下方式执行追加:
if ( next.all( _ * y <= 0) )
returnLambda("Bad")
else {
returnLambda("Good")
next = next :+ Foo(y)
}
由于我们已经扁平化了列表操作,CPS 的使用就失去了它的好处;你可以简单地 return 字符串 "Good" 或 "Bad".
假设您真的非常需要 CPS,您可以通过将 next
字段移动到伴随对象中来删除它:
object Foo {
val listOfFoo: ListBuffer[Foo] = ListBuffer[Foo].empty
def bar(y: Double, returnLambda: (String => Unit)): Unit =
if ( listOfFoo.all(_ * y <= 0) )
returnLambda("Bad")
else {
listOfFoo += Foo(y)
returnLambda("Good")
}
}