2

scala でリストをフィルタリングする「or」を実装しようとしています。

    list.filter(_ % 3 ==0 || _ % 5 ==0)

しかし、私はこのエラーが発生しています:

エラー: パラメータの数が間違っています。期待値 = 1

では、これを 1 つのパラメーターとしてグループ化するにはどうすればよいでしょうか。

4

4 に答える 4

10

必要以上に簡潔にしようとしないでください。

list.filter(x => x % 3 ==0 || x % 5 ==0)

次のように n 番目の _ が n 番目の引数に展開されるため、アンダースコアは機能しません。

list.filter((x,y) => x % 3 ==0 || y % 5 ==0)
于 2013-07-16T13:55:34.427 に答える
2

パラメーターが関数式で 1 ​​回だけ使用される場合は、プレースホルダー構文のみを使用できます。それ以外の場合は、関数パラメーターを明示的に宣言する必要があります。

list.filter(x => x % 3 == 0 || x % 5 == 0)

複数のプレースホルダーは、複数のメソッド パラメーターに展開されます。

于 2013-07-16T13:55:25.597 に答える
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))
于 2013-07-16T17:12:27.140 に答える