2017-04-20 9 views
1

私はScalaを初めて使う人です。スカラ:汎用整数の戻り値の型?

def fromBinaryListBig(in: Array[Int]): BigInt = { 
    var sum = 0 
    in foreach (x => {sum <<= 1; sum += (x&1)}) 
    sum 
} 

それは一般的な戻り値の型(整数型、ロング、int)を作ることが可能です: 私は機能を持っていますか? 事前のおかげで...

答えて

2

それは一般的なパラメータが一致する場合は、一般的な戻り値の型を持つことができます...

def fromBinaryListBig[N:Numeric](in: Array[N]): N = in.sum 

...しかし、あなたはベースの異なる(ジェネリック)戻り値の型を取得することはできません(例えば、累積された合計の値などの)いくつかの内部状態

+0

Thxを指定。 「和」も一般的にすることは可能ですか?同じコードを繰り返しコピーすることは避けたいが、戻り値の型だけを変更する。 – paul

+0

@paul数値には合計関数 –

+0

@paulがあります。この例では、数値型の「配列」の合計を返すように変更しました。戻り値の型は 'Array'型と一致します。合計値が入力タイプをオーバーフローする可能性が高い場合は、別のアプローチをとる必要があります。 – jwvh

0

技術的には、はい、それはかなり可能です:

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(...) 
関連する問題