def pow2_k[A](f: Float, k: Float => A): A = k(f * f) def pow2_cont(n: Float): Float = pow2_k(n, identity) scala> pow2_cont(2.0f) res0: Float = 4.0 scala> pow2_k(4.0f, println) 16.0
想象CPS变换的最简单方法可能是:
采取不在CPS中的功能
def square(f: Float): Float = f * f
在一个类型中使函数通用 A ;从旧函数的结果类型添加函数的第二个参数 A ;并将您的函数的结果类型更改为 A
A
def cpsSquare[A](f: Float, ret: Float => A): A = ???
你的功能到处都“返回”了一个值(当然注意到了这一点) return 在Scala中有奇怪的语义,所以 return 是一个非常糟糕的代码气味),传递将返回给函数的值(我称之为此函数 ret 暗示正在发生的事情)
return
ret
def cpsSquare[A](f: Float, ret: Float => A): A = ret(f * f)
基本上,在CPS中,不是返回值,而是使用您返回的值调用传递的函数(延续)。