首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CPS转换[Scala]

CPS转换[Scala]
EN

Stack Overflow用户
提问于 2018-06-26 19:26:41
回答 1查看 622关注 0票数 0

我正在尝试使用我在网上找到的其他语言的示例,在Scala中将一些函数转换为CPS。

我们只上了一堂关于CPS的课,所有的东西都应该是非常基础的,但我仍然不太明白如何正确地进行转换。

这些是我在网上找到的例子,我正尝试用Scala来做这些事情。

代码语言:javascript
运行
复制
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‘,看起来像这样:

代码语言:javascript
运行
复制
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),这导致了奇怪的结果。

接下来,我尝试添加‘,目前看起来像这样:

代码语言:javascript
运行
复制
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转换和延续?我发现的大多数例子要么太短,没有例子,要么太复杂了。我觉得对于我正在尝试转换的这些简单函数来说,这并不是那么复杂……

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-06-27 02:49:17

代码语言:javascript
运行
复制
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中没有的函数

(f: Float):Float =f*f

  • A类型中使函数泛型;将函数的第二个参数从旧函数的结果类型添加到A;将函数的结果类型更改为A

???

  • Everywhere cpsSquareA:a= def你的函数“返回”了一个值(当然请注意,Scala中的return具有奇怪的语义,所以return是一个非常糟糕的代码气味),传递将被返回给函数的值(我将这个函数称为ret,它暗示了发生了什么)

def cpsSquareA:a= ret(f * f)

基本上,在CPS中,不是返回值,而是调用一个带有返回值的已传递函数(延续)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51041768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档