坚持实施自定义控制结构

时间:2013-03-18 11:25:42

标签: scala

我的任务是编写一个可以像这样使用的自定义repeat控件结构:

var i = 0
repeat {
    i = i + 1
}(i > 5)

我目前有以下代码:

def repeat(f: => Unit): ((=> Boolean) => Unit) = {
    (x) => {
        while (x) f
    }
}

运行时,似乎永远不会执行f(i = i + 1)。

我必须诚实,我不完全确定当前x的类型。这显然不正确,但我没有足够的知识知道从这里去哪里。

我以前有这个:

def repeat(f: => Unit): ((=> Boolean) => Void) = {
    (x: (=> Boolean)) => {
        while (x) f
    }
}

虽然Scala显然不正确,但我认为它更好地证明了我的意图。

我很抱歉,如果我的问题有点宽泛/表现出轻松,但是名字参数的概念对我来说是非常新的,并且在我的书(Scala编程)中没有解释基础知识。

1 个答案:

答案 0 :(得分:2)

您还应该知道Scala支持多个参数列表。所以你可以

def compare(a: Int, b: Int)(p: (Int,Int) => Boolean) = p(a,b)

然后写

compare(5,2)(_ > _)

这种策略将简化您的逻辑。

另外,你的向后比较。 i0开始,您的循环条件为i > 5,而不是=> X

一些额外的注释:((=> Boolean) => Unit)表示“每次需要时计算一个X”,因此Boolean需要根据需要计算i > 5的内容((=> Boolean) => Unit如果每次都进行检查,那就可以做到这一点。 Boolean表示一个函数,它将产生Unit s的输入作为输入,并且不提供输出。 (严格来说,()类型是一个输出,即void,这是为了保持一致性。但它与{{1}}具有相同的作用。)