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_TYPE
をfloat
すぐに変更すると、実行時list
に oflist
のfloat
s が返されます (静的型付けはありませんが、 の内容は依然として or のいずれかmatrix
に強く型付けされています)。list[list[int]]
list[list[float]]
matrix
Scala では、の静的型は、たとえばMatrix[Int]
or Matrix[Double]
(より一般的な から) であると予想しますtype Matrix[T: Numeric] = Vector[Vector[T]]
。ただし、Scala の比較的初心者である私は、これを達成する方法について少し迷っています。パラメーターの値を から に切り替える明白で簡単な方法はありませんclassOf[Int]
—たとえ私がそれを行い、それに応じてパーサー関数を動的に選択したとしても (これは簡単です)、実行時の型をfrom から、たとえばtoclassOf[Double]
に変更するにはどうすればよいでしょうか? ? の静的型を <code>Matrix[Numeric]と宣言するにはどうすればよいでしょうか?matrix
Matrix[Int]
Matrix[Double]
matrix
質問の素朴さを判断する前に、Scala 風のソリューションにはおそらく多少異なるアプローチが必要であることを認識していることを認めますが、(IMO ではなくエレガントな) Python から考えを始めるというアイデアが好きでした。解決。