次のコードが有効な中置演算子として∙を認識しない理由を知っていますか?Scalaの中置演算子としてユニコード記号を使用する
object Main extends App {
val c = (I() ∙ I())
}
sealed abstract class Term
case class I() extends Term
case class ∙(x: Term, y: Term) extends Term
次のコードが有効な中置演算子として∙を認識しない理由を知っていますか?Scalaの中置演算子としてユニコード記号を使用する
object Main extends App {
val c = (I() ∙ I())
}
sealed abstract class Term
case class I() extends Term
case class ∙(x: Term, y: Term) extends Term
I
の方法として∙
定義します。
sealed abstract class Term
case class II(x: Term, y: Term) extends Term
case class I() extends Term {
def ∙(o: Term) = II(this, o)
}
I() ∙ I()
II
を返し、動作します。
あなたが達成しようとしていることはわかりませんが、
簡単に言えば、そうではないからです。 object
とclass
ですが、メソッドではなく、メソッドのみが演算子(インフィクスまたは非インフィット)になります。あなたがパターンにそれを使用することができ、オブジェクトとして
type X = Int ∙ String
case a ∙ b =>
、
これはユニコード記号の使用によるものではありません。私が認識している中立のコンストラクタ構文はありません。あなたはエミールが提案する何を(Term
またはI
に∙
メソッドを追加)、または暗黙的な変換を使用することができます中置構文を持つオブジェクトを作成したいのであれば:暗黙のバージョンを
sealed abstract class Term
case class I() extends Term
case class ∙(x: Term, y: Term) extends Term
class Ctor_∙(x: Term) {
def ∙(y: Term): ∙ = new ∙(x, y)
}
object Term {
implicit def to_∙(x: Term): Ctor_∙ = new Ctor_∙(x)
}
Predef.any2ArrowAssoc
のようなものですタプルを作成します。1 -> 2
List.::