web-dev-qa-db-ja.com

論理値とブール値のリストへの適用

次のScalaのブール値のリストを検討してください。

List(true, false, false, true)

FoldRightまたはfoldLeftを使用して、リスト内のすべての値に対して論理ANDを実行する機能をどのようにエミュレートしますか?

18
user3277752
val l = List(true, false, false, true)
val andAll = l.foldLeft(true)(_ && _)
14
Lee

_foldLeft/Right_を使用する代わりに、論理ANDの場合はforall(identity)を、論理ORの場合はexists(identity)を使用することもできます。

編集:これらの関数の利点は早期終了です。 forallfalseまたはexiststrueにヒットすると、すぐに戻ります。

54
drexin

foldLeftのように初期値がない場合、

List(true, false, false, true).reduce(_&&_)

しかし、これはList.empty[Boolean]

5
elm

ユースケースに適合する限り、forAllアプローチが最も好きです。それは素晴らしいです。ただし、それがここに収まらない場合は、もう1つ、ほんのわずかに複雑なアプローチです。

ReduceOptionを使用すると、早期終了はありませんが、リストが空の場合の値を明確に指定できます。

val l = List(true, false, false, true)
val andAll = l.reduceOption(_ && _).getOrElse(false)
5
sfosdal