4

scala で論理的な含意を実装する可能性があるかどうか疑問に思っていました。例えば:

a implies b

に翻訳:

!a || b

ここでabは に評価されるいくつかの式ですBoolean

私は最初に次のことから始めましたが、それは間違ったアプローチです

  implicit def extendedBoolean(a : Boolean) = new {
    def implies(b : Boolean) = {
      !a || b
    }
  }

の値に関係なく両方aを評価するためです。正しい解は、が true の場合にのみ評価されます。baba

4

2 に答える 2

7

名前による呼び出しパラメーターを使用したい場合は、次で十分だと思います。

implicit def extendedBoolean(a : Boolean) = new {
    def implies(b : => Boolean) = {
      !a || b
    }
  }

説明:

for に何らかの値を渡す必要がありbますが、その式を評価したくありません。Scala は、式を引数を取らず、式に評価される関数に自動的に変換できます。演算子impliesは、必要に応じてその nullary (ゼロ引数) 関数を評価します。

コンパイラは、指定した型シグネチャにより、この変換を実行できることを認識しています=> Boolean。この投稿ではより詳細に説明していますが、そのタイトルだけでも何が起こっているかを簡潔に説明しています: "Automatic Type-Dependent Closure Construction" .

Scala のこの機能により、おそらく他の言語でマクロを使用して記述するのと同じくらい簡単に、制御構造を記述できます。2 つの名前による呼び出しパラメーター (1 つは条件用、もう 1 つは本体用) を使用して、while ループをいかに簡単に再実装しているかを観察してください。

object TargetTest2 extends Application {
  //type signature not too terribly mysterious
  def whileLoop(cond: => Boolean)(body: => Unit): Unit =
    if (cond) {
      body
      whileLoop(cond)(body)
    }

  //about as easy to use as a plain-old while() loop
  var i = 10
  whileLoop (i > 0) {
    println(i)
    i -= 1
  }
}
于 2012-04-20T16:15:46.387 に答える
4

b評価する必要がある関数を作成したい。そうすれば、実際にアクセスされた場合にのみ評価されます。

これを行うには、型を に変更します。これは、入力を必要とせず=> Booleanに評価されるものを意味します。Boolean

implicit def extendedBoolean(a: Boolean) = new {
  def implies(b: => Boolean) = {
    !a || b
  }
}

使用方法は次のとおりです。

scala> true implies { println("evaluated"); true }
evaluated
res0: Boolean = true

scala> false implies { println("evaluated"); true }
res1: Boolean = true

aisの場合true、が評価されることに注意してくださいb(「評価済み」と表示されます)。しかし、aisfalseの場合は評価されません (何も出力されません)。

于 2012-04-20T16:13:48.293 に答える