我正在尝试使用我在网上找到的其他语言的示例,在Scala中将一些函数转换为CPS。
我们只上了一堂关于CPS的课,所有的东西都应该是非常基础的,但我仍然不太明白如何正确地进行转换。
这些是我在网上找到的例子,我正尝试用Scala来做这些事情。
pow2' :: Float -> (Float -> a) -> a
pow2' a cont = cont (a ** 2)
add' :: Float -> Float -> (Float -> a) -> a
add' a b cont = cont (a + b)
sqrt' :: Float -> ((Float -> a) -> a)
sqrt' a = \cont -> cont (sqrt a)
pyth' :: Float -> Float -> (Float -> a) -> a
pyth' a b cont = pow2' a (\a2 -> pow2' b (\b2 -> add' a2 b2 (\anb -> sqrt' anb cont)))现在我开始做pow2‘,看起来像这样:
def pow2_k(a:Float, k:(Float => Float)) : Float =
(a*a)
def pow2_cont(n: Float) = pow2_k(n, (x: Float) => x)起初,我使用k(a*a)而不是简单的(a*a),这导致了奇怪的结果。
接下来,我尝试添加‘,目前看起来像这样:
def add_k(a:Float, b:Float, k:(Float, Float => Float)) : Float =
(a+b)
def add_k_cont(n:Float,m:Float) = add_k(n,m (x: Float, y:Float => (n+m)))这显然是错误的。我很难写出正确的续集。有没有人知道一个好的网站,论文,视频等,可以解释CPS转换和延续?我发现的大多数例子要么太短,没有例子,要么太复杂了。我觉得对于我正在尝试转换的这些简单函数来说,这并不是那么复杂……
谢谢。
发布于 2018-06-27 02:49:17
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转换的最简单方法可能是这样的:
(f: Float):Float =f*f
A类型中使函数泛型;将函数的第二个参数从旧函数的结果类型添加到A;将函数的结果类型更改为A???
return具有奇怪的语义,所以return是一个非常糟糕的代码气味),传递将被返回给函数的值(我将这个函数称为ret,它暗示了发生了什么)def cpsSquareA:a= ret(f * f)
基本上,在CPS中,不是返回值,而是调用一个带有返回值的已传递函数(延续)。
https://stackoverflow.com/questions/51041768
复制相似问题