45

次のように、Scala でブール関数の否定を使用しようとしています。

def someFunction(x: Set, p: Int => Boolean): Boolean = 
    someOtherFunction(x, !p)

しかし、私はエラーが発生します:

 value unary_! is not a member of Int => Boolean

p の否定をどのように参照できますか?

4

4 に答える 4

57

の否定は、その引数にp適用され、結果を否定する関数です。p

x => !p(x)

あなたが書くことができるようにしたい場合、!pまたはさまざまな論理演算子でboolを返す関数をpimpするこのライブラリp && qを使用することができます。

于 2012-10-01T21:50:31.607 に答える
21

p の最短否定: !p(_)

述語pを引数として別の関数に適用すると、次のようになります。

  • p または p(_) は、ラムダ式の省略形です: (x) => p(x)
  • !p(_) はラムダ式の省略形: (x) => !p(x) であり、!p だけではコンパイラーが失われます。

たとえば、整数のセットを使用します (Scala ワークシートで試してください)。

  def someOtherFunction (x: Set[Int], p: Int => Boolean):Boolean = x.forall(p)
  def someFunction(x: Set[Int], p: Int => Boolean): Boolean =
    someOtherFunction(x, !p(_))

  val x = Set(1,2,3)
  var p: Int => Boolean = (_ > 0)
  //_ > 0 is an abbreviaton of (x) => x > 0

  someFunction(x, p)        //false
  someOtherFunction(x, p)   //true

  p = _ > 1
  someFunction(x, p)        //false
  someOtherFunction(x, p)   //false

  p = _ > 3
  someFunction(x, p)        //true
  someOtherFunction(x, p)   //false
  println
于 2014-09-23T16:47:05.797 に答える
5

匿名関数を使用せずにそれを解決する別の方法は、このタスクの具体的な関数を定義することです。

def even(x:Int):Boolean = x%2==0
def not(f: Int => Boolean): Int => Boolean = !f(_)
def odd = not(even)
odd(1) // true
odd(2) // false

定義することもできます!あなた自身

def even: Int => Boolean = _%2==0
implicit def bangy(f: Int => Boolean) = new { def unary_! : Int => Boolean = !f(_) }
def odd = !even
odd(1) // true
odd(2) // false

ただし、これはInt => Boolean型の関数でのみ機能し、(Int)=>Booleanでは機能しないようです。not(even)ソリューションは両方で機能します。

于 2012-10-06T06:24:10.267 に答える