1

我的任务是编写一个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 编程)中没有解释超出基础知识。

4

1 回答 1

2

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

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

然后写

compare(5,2)(_ > _)

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

此外,你有你的比较倒退。 i开始于0,你的循环条件是i > 5,它不是。

一些额外的注意事项:=> X表示“每次需要时计算一个 X”,因此((=> Boolean) => Unit)需要一些可以Boolean根据需要计算 a 的东西(并且i > 5可以这样做,如果每次都执行检查,它将是)。 (=> Boolean) => Unit表示一个函数,它将产生Booleans 的东西作为输入并且不给出输出。(好吧,严格来说,Unittype 是一个输出,即(),它是为了一致性而完成的。但它的作用与 相同void。)

于 2013-03-18T11:34:03.720 回答