1

私はScalaを学び始めており、Scala for the Impatientを読みながら、演習の1つに対する次の解決策にたどり着きました。

//No function
def positivesThenZerosAndNegatives(values: Array[Int]) = {
    Array.concat(for (value <- values if value > 0) yield value,
        for (value <- values if value == 0) yield value,
        for (value <- values if value < 0) yield value)
}

しかし今、私はparamとして、以下の各包括的関数にフィルターを適用する関数を渡そうとしていました。

//Trying to use a function (filter)
def positivesThenZerosAndNegatives2(values: Array[Int]) = {
    Array.concat(filter(values, _ > 0), filter(values, _ == 0), filter(values, _ < 0))
}

def filter[T: Int](values: Array[T], f: (T) => Boolean) = {
    for (value <- values if f(value)) yield value
}

要素配列を参照する正しい方法が見つかりませんでした。

4

1 に答える 1

3

filter次のようにメソッドを書くことができます:

import scala.reflect.ClassTag

def filter[T: ClassTag](values: Array[T], f: T => Boolean): Array[T] = {
  for(value <- values; if f(value)) yield value
}

またはこのように:

def filter(values: Array[Int], f: Int => Boolean): Array[Int] = {
  for(value <- values; if f(value)) yield value
}

とにかく、次のようにメソッドを書き直すだけですpositivesThenZerosAndNegatives

scala> def positivesThenZerosAndNegatives(values: Array[Int]) = {
     |   values.filter(0 <) ++ values.filter(0 ==) ++ values.filter(0 >)
     | }
于 2013-03-11T00:25:25.807 に答える