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ですが、私の意図をよりよく示していると思います。

私の質問が少し広範で、楽なことを示している場合は申し訳ありませんが、名前によるパラメーターの概念は私にとって非常に新しいものであり、私の本(Programming in 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を計算する」という意味なので、必要に応じてX((=> Boolean) => Unit)を計算するものを取りBooleanます(i > 5チェックが毎回実行される場合は、それを実行できます)。 sを生成し、出力を与えない(=> Boolean) => Unitものを入力として受け取る関数を意味します。Boolean(厳密に言えば、Unitタイプは出力です。つまり()、一貫性を保つために実行されます。ただし、タイプはと同じ役割を果たしますvoid。)

于 2013-03-18T11:34:03.720 に答える