私は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)
}
どういうわけか動作しますが、次の2つのパラメーターを渡してこのメソッドを呼び出す必要があるため、完全ではありません。
val result = repeat(body)(a => ...)
組み込みの構造のように見えるように、これを行うためのより効率的で自然な方法があるかどうか疑問に思っています。
val result = do { body } until (a => ...)
戻り値のないbodyの優れたソリューションの1つは、この投稿にあります。RepeatUntilでScalaコントロールの抽象化を行うにはどうすればよいですか?、最後のワンライナーの答え。そのbody
答えのその部分は値を返さないので、until
は新しいオブジェクトのメソッドである可能性がありますが、ではなくAnyRef
戻りたいので、そのトリックはここでは適用されません。これを達成する方法はありますか?ありがとう。A
AnyRef