私はScalaを初めて使う人です。スカラ:汎用整数の戻り値の型?
def fromBinaryListBig(in: Array[Int]): BigInt = {
var sum = 0
in foreach (x => {sum <<= 1; sum += (x&1)})
sum
}
それは一般的な戻り値の型(整数型、ロング、int)を作ることが可能です: 私は機能を持っていますか? 事前のおかげで...
私はScalaを初めて使う人です。スカラ:汎用整数の戻り値の型?
def fromBinaryListBig(in: Array[Int]): BigInt = {
var sum = 0
in foreach (x => {sum <<= 1; sum += (x&1)})
sum
}
それは一般的な戻り値の型(整数型、ロング、int)を作ることが可能です: 私は機能を持っていますか? 事前のおかげで...
それは一般的なパラメータが一致する場合は、一般的な戻り値の型を持つことができます...
def fromBinaryListBig[N:Numeric](in: Array[N]): N = in.sum
...しかし、あなたはベースの異なる(ジェネリック)戻り値の型を取得することはできません(例えば、累積された合計の値などの)いくつかの内部状態
技術的には、はい、それはかなり可能です:
def fromBinaryListBig[A](in: Array[Int])(implicit ev: Integral[A]): A = {
var sum = ev.zero
val two = ev.fromInt(2)
in foreach (x => {sum *= two; sum += ev.fromInt(x&1)})
sum
}
これは、呼び出し側が戻り値の型を決定するので、彼らは、例えば書くことができます
val x = fromBinaryListBig[Byte](Array(0, 1, 0, 1, 0, 0, 0))
または応答の予想タイプ
val x: BigInt = fromBinaryListBig(...)
Thxを指定。 「和」も一般的にすることは可能ですか?同じコードを繰り返しコピーすることは避けたいが、戻り値の型だけを変更する。 – paul
@paul数値には合計関数 –
@paulがあります。この例では、数値型の「配列」の合計を返すように変更しました。戻り値の型は 'Array'型と一致します。合計値が入力タイプをオーバーフローする可能性が高い場合は、別のアプローチをとる必要があります。 – jwvh