1

Scala に Imaginary(x) クラスと Real(y) クラスがあるとします。ComplexNumber = Real(3) + Imaginary(2) の代わりに ComplexNumber = 3 + 2i を実行する方法はありますか?

ありがとう。

4

4 に答える 4

4

2iを意味し2*iます。scala2*aでは withを置き換えることができないため、 operator を使用する必要があります。2a*

case class ComplexNumber(re: Int, im: Int){
  def +(that: ComplexNumber) = ComplexNumber(re + that.re, im + that.im)
  def -(that: ComplexNumber) = ComplexNumber(re - that.re, im - that.im)
  def *(that: ComplexNumber) = ComplexNumber(re*that.re - im*that.im, re*that.im + im*that.re)
}
implicit def intToComplec(i: Int): ComplexNumber = ComplexNumber(i, 0)
object I extends ComplexNumber(0, 1)

使用法:

scala> 3 + 2*I
res0: ComplexNumber = ComplexNumber(3,2)

scala> 4 - I
res1: ComplexNumber = ComplexNumber(4,-1)
于 2013-07-01T13:33:11.657 に答える
1

いいえ、これは不可能です。fコンパイラの字句解析フェーズは、 ( Float)、d( Double) 、 l( )などの数値文字列の接尾辞を「所有」しておりLong、この表記には拡張性がありません。

新しい文字列補間メカニズムを使用して定数に注釈を付けることを検討してください。それらの解析を受け入れる必要があり、必要に応じて「フラグ」iを接頭辞の位置で使用する必要があります。それはあなたに次のようなものを与えるでしょう:

val imaginary = i"1.2+3.4i"

私は新しいコンパイラのマクロの機能について最新の情報を持っていませんが、おそらくコンパイル時に解析を行うことができます。これにより、実行時に不正な形式の値を操作しようとするのを防ぐことができます。

このアプローチ (コンパイル時または実行時に解析されるかどうか) は柔軟です (受け入れられた形式に好きなだけ適応できる限り) が、人々が数学のテキストで使用する表記法とは明らかに一致しません。

于 2013-06-29T16:41:36.057 に答える