scala でリストをフィルタリングする「or」を実装しようとしています。
list.filter(_ % 3 ==0 || _ % 5 ==0)
しかし、私はこのエラーが発生しています:
エラー: パラメータの数が間違っています。期待値 = 1
では、これを 1 つのパラメーターとしてグループ化するにはどうすればよいでしょうか。
scala でリストをフィルタリングする「or」を実装しようとしています。
list.filter(_ % 3 ==0 || _ % 5 ==0)
しかし、私はこのエラーが発生しています:
エラー: パラメータの数が間違っています。期待値 = 1
では、これを 1 つのパラメーターとしてグループ化するにはどうすればよいでしょうか。
必要以上に簡潔にしようとしないでください。
list.filter(x => x % 3 ==0 || x % 5 ==0)
次のように n 番目の _ が n 番目の引数に展開されるため、アンダースコアは機能しません。
list.filter((x,y) => x % 3 ==0 || y % 5 ==0)
パラメーターが関数式で 1 回だけ使用される場合は、プレースホルダー構文のみを使用できます。それ以外の場合は、関数パラメーターを明示的に宣言する必要があります。
list.filter(x => x % 3 == 0 || x % 5 == 0)
複数のプレースホルダーは、複数のメソッド パラメーターに展開されます。
機能的代替:
val or = (xs: List[Int => Boolean]) => (x: Int) => xs.exists(_(x))
List(0, 1, 2, 3, 4, 5, 6).filter(or(List(_ % 3 == 0, _ % 5 == 0)))
またはさらに簡単:
val or = { def or(xs: (Int => Boolean)*) = (x: Int) => xs.exists(_(x)); or _}
List(0, 1, 2, 3, 4, 5, 6).filter(or(_ % 3 == 0, _ % 5 == 0))
更新: 2 番目のバージョンは Scala 2.10 では動作しないようです。そのため、次のメソッドを使用することをお勧めします。
def or[T](xs: (T => Boolean)*) = (x: T) => xs.exists(_(x))