2016-08-03 8 views
1

整数の配列を左右にシフトする必要があるとします。Scalaで配列と行列をシフトする方法

val shl : Array[Int] => Array[Int] = a => (a drop 1) :+ 0 
val shr : Array[Int] => Array[Int] = a => 0 +: (a dropRight 1) 

も、私は今、私はshlshrを一般化したい

val shlm: Array[Array[Int]] => Array[Array[Int]] = _ map shl 
val shrm: Array[Array[Int]] => Array[Array[Int]] = _ map shr 

上下

val zeros: Int => Array[Int] = n => Array.fill(n)(0) 
val shum: Array[Array[Int]] => Array[Array[Int]] = m => (m drop 1) :+ zeros(m.length) 
val shdm: Array[Array[Int]] => Array[Array[Int]] = m => zeros(m.length) +: (m dropRight 1) 

を左右する整数の行列をシフトする必要があるとし行列を上下にシフトするためにそれらを再利用する。あなたはどうしますか?

答えて

1
import scala.reflect.ClassTag 

type ArrayOp[T] = Array[T] => Array[T] 

def shl[T:ClassTag](zero: T)(a: Array[T]): Array[T] = (a drop 1) :+ zero 
def shr[T:ClassTag](zero: T)(a: Array[T]): Array[T] = zero +: (a dropRight 1) 

val shlm: ArrayOp[Array[Int]] = _ map shl(0) 
val shrm: ArrayOp[Array[Int]] = _ map shr(0) 

val zeros: Int => Array[Int] = n => Array.fill(n)(0) 

val shum: ArrayOp[Array[Int]] = m => shl(zeros(m.length))(m) 
val shdm: ArrayOp[Array[Int]] = m => shr(zeros(m.length))(m) 
+0

ありがとうございます。 'ClassTag'は実行時リフレクションを意味しますか? – Michael

+0

はい、Scalaランタイムライブラリには、配列を構築するための具象クラスに関する情報が必要です(http://stackoverflow.com/questions/16921168/scala-generic-method-no-classtag-available-for-tへの回答を参照) 。 – devkat

+0

ああ、そうだね... 'Array'の代わりに別のクラスを使うと、この問題を実行時リフレクションなしで解決できますか? – Michael

関連する問題