0

Python のバックグラウンドを持つ私は、実行時に型をオブジェクトとして使用できるようにすることに慣れています。それと、少なくともintおよびfloatこれらの型オブジェクトの場合、パーサーとして機能する呼び出し可能オブジェクト (たとえばint("234") == 234、Scala の など"234".toInt == 234) であるという事実と組み合わせると、たとえば、いずれかの行列を解析するための解決策を思いつくことができます。テキスト ファイルからの整数または浮動小数点数。私がしなければならない唯一のことは、パラメータを設定することです:

 ITEM_TYPE = int  # or float

そして、私は行く準備ができています:

 with open('matrix.dat') as f:
   matrix_data_raw = parse_raw_matrix(f.read())
 matrix = [map(ITEM_TYPE, row) for row in matrix]

の値ITEM_TYPEfloatすぐに変更すると、実行時listに oflistfloats が返されます (静的型付けはありませんが、 の内容は依然として or のいずれかmatrixに強く型付けされています)。list[list[int]]list[list[float]]

matrixScala では、の静的型は、たとえばMatrix[Int]or Matrix[Double](より一般的な から) であると予想しますtype Matrix[T: Numeric] = Vector[Vector[T]]。ただし、Scala の比較的初心者である私は、これを達成する方法について少し迷っています。パラメーターの値を から に切り替える明白で簡単な方法はありませんclassOf[Int]—たとえ私がそれを行い、それに応じてパーサー関数を動的に選択したとしても (これは簡単です)、実行時の型をfrom から、たとえばtoclassOf[Double]に変更するにはどうすればよいでしょうか? ? の静的型を <code>Matrix[Numeric]と宣言するにはどうすればよいでしょうか?matrixMatrix[Int]Matrix[Double]matrix

質問の素朴さを判断する前に、Scala 風のソリューションにはおそらく多少異なるアプローチが必要であることを認識していることを認めますが、(IMO ではなくエレガントな) Python から考えを始めるというアイデアが好きでした。解決。

4

3 に答える 3

0

マトリックスの実行時型は常に Matrix[Object] であることを指摘する価値があると思います-JVMで実行され、ジェネリック型は実行時に消去されます。

とはいえ、マトリックス内の要素のランタイム タイプを指定することもできます。ただし、関数でこれを行う必要があると思います。これを説明するためにリストを使用します。

val int: (String => Number) = _.toInt
val float: (String => Number) = _.toFloat

実行時に使用する可能性のあるこれらのいずれかを定義する必要があります。これで、使い方は簡単です。

val NUM_TYPE: (String => Number) = int // or whichever you choose

...

val list = List("1", "2", "3") map (NUM_TYPE)

これにより、常に List[Number] が返されますが、(この場合は) Int が入力されます。

于 2013-09-20T16:21:18.623 に答える
0

これはできません。私が提案できる最善のことは、intまたはfloatのいずれかを取得することがわかっている場合は、両方を行うことです。

trait Matrix[+A]

def parseRawData[A : Numeric](fp: io.Source, parseNum: String => A): Matrix[A]...

def manipulateRawData[A : Numeric](fp: io.Source): Matrix[A] = {
  val mat = parseRawData
  val numeric = implicitly[Numeric[A]]
  ...
}

if (ints) {
  manipulateRawData[Int](fp, _.toInt)
}
else if (doubles) {
  manipulateRawData[Double](fp, _.toDouble)
}

最終的に Matrix[AnyVal] になることがわかりますが (型には注意してください)、中間で正しいことを行います。

于 2013-09-20T16:21:19.780 に答える