10

私は最近、Scalaに2回目のチャンスを与え、私が常に実装しているプロジェクト(関数型または疑似関数型言語)から始めました。命題論理(および後の述語論理)の自動推論です。

今、私は言語自体の命題論理の表記をできるだけきれいにしようとしました、そして私はこれまでに-暗黙の変換(文字列->アトム)で得ました:

("A" and "B") implies "C"

関数「and」と「implies」(および「or」と「equivalent」)は、関連するケースクラスコンストラクターを呼び出す単純なメソッドです。ただし、「not」を実装すると、次の2つの表記のいずれかに固執します。

("A" and "B").not
Not("A" and "B")

Scalaをだまして希望を受け入れる方法はありますか?

not("A" and "B")

将来的には、クラスの名前を「Not」から「not」に変更せずに、「¬」などと呼びたいと思うかもしれません。

4

4 に答える 4

22

別の質問に対するこの回答unary_で、あなたがやろうとしていることを達成するために、演算子名の前に接頭辞を付けることができるように思われることに気づきました。(を参照してくださいunary_!。)

編集:この記事は構文を確認します。

于 2010-09-06T12:42:32.743 に答える
14

not次のように、シングルトンオブジェクトのメソッドとして定義できます。

object Logic {
  def not(x:Expr) = Not(x)
}
import Logic._
not("A" and "B")

(ここで、、、およびExprの一般的なスーパークラスがあるはずです)AndOrNotAtom

編集:これを1回のインポートで使用する方法の例を次に示します。

object Logic {
  abstract class Expr {
    def and(e: Expr) = Conjunction(this, e)
    def or(e: Expr) = Disjunction(this, e)
    def implies(e: Expr) = Implication(this, e)
  }
  case class Conjunction(e1: Expr, e2: Expr) extends Expr
  case class Disjunction(e1: Expr, e2: Expr) extends Expr
  case class Implication(e1: Expr, e2: Expr) extends Expr
  case class Negation(e: Expr) extends Expr
  case class Atom(name: String) extends Expr

  def not(e: Expr) = Negation(e)
  implicit def string2atom(str: String) = Atom(str)
}

// use site
import Logic._
not("A" and "B") implies (not("A") or not("B"))
于 2010-09-06T12:35:27.393 に答える
8

なぜNot代わりにnot?あなたがこれをするのを止めるものは何もありません:

object not {
  def apply(expr: T) = ...
}

そして、を使用しますnot("A" and "B")

于 2010-09-06T14:22:34.603 に答える
5

2014年2月の時点で、not式に対してプレフィックスのような操作を定義する最もクリーンな方法は、あらゆる種類の余分なクラフト/ラッピングを回避しながら、他のすべての関数、クラスとともに、パッケージスコープで関数を直接宣言することだと思います。 、typesなど:これはパッケージオブジェクトを定義することによって行われます(Scalaでは、ファイルのルートレベルに関数を配置することはできません.scala(理由を知りたいのですが、Javaの足跡をたどるだけですか?))。

package org.my.logiclib

implicit class Atom(s: String) { ... }
class MyType1
class MyType2

object `package` {
  def not(expr: Expr) = ...
}

このようにするimport org.my.logiclib._と、を含むすべてがインポートされますnot()

上記はと同じです

package org.my

package logiclib {
  implicit class Atom ...
  ...

  def not(expr: Expr) = ...
}
于 2014-02-13T12:49:33.957 に答える