gpt4 book ai didi

Scala扩展while循环到do-until表达式

转载 作者:行者123 更新时间:2023-12-03 08:37:18 24 4
gpt4 key购买 nike

我正在尝试对Scala进行一些实验。我想重复此实验(随机化),直到得出预期结果并得到该结果。如果我使用while或do-while循环执行此操作,则需要编写(假设'body'代表实验,而'cond'代表是否期望):

do {
val result = body
} while(!cond(result))

但是,由于最后一个条件不能从循环体中引用局部变量,因此它不起作用。我们需要对控件抽象进行如下修改:
def repeat[A](body: => A)(cond: A => Boolean): A = {
val result = body
if (cond(result)) result else repeat(body)(cond)
}

它以某种方式有效,但对我来说并不完美,因为我需要通过传递两个参数来调用此方法,例如:
val result = repeat(body)(a => ...)

我想知道是否有更有效,更自然的方法来使它看起来更像内置结构:
val result = do { body } until (a => ...)

在这篇文章中找到了一种对于没有返回值的 body 的绝佳解决方案: How Does One Make Scala Control Abstraction in Repeat Until?,最后的一线答案。该答案中其 body部分不返回值,因此 until可以是新 AnyRef对象的方法,但是该技巧不适用于此处,因为我们要返回 A而不是 AnyRef。有什么办法可以做到这一点?谢谢。

最佳答案

稍作修改,您就可以将当前方法转换为一种迷你流利的API,从而产生与您想要的语法接近的语法:

class run[A](body: => A) {
def until(cond: A => Boolean): A = {
val result = body
if (cond(result)) result else until(cond)
}
}
object run {
def apply[A](body: => A) = new run(body)
}

由于 do是保留字,因此我们必须使用 run。结果现在看起来像这样:
run {
// body with a result type A
} until (a => ...)

编辑:

我刚刚意识到,我几乎重新发明了链接的 question中已经提出的内容。扩展该方法以返回 A类型而不是 Unit的一种可能性是:
def repeat[A](body: => A) = new {
def until(condition: A => Boolean): A = {
var a = body
while (!condition(a)) { a = body }
a
}
}

关于Scala扩展while循环到do-until表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13553127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com