ฟังก์ชัน Vectorize Scala พร้อมค่าส่งคืนหลายค่า

วิธีที่หรูหราที่สุดในการทำให้ฟังก์ชันสกาลาเป็นเวคเตอร์ที่ส่งคืนค่าหลายค่าคืออะไร

ตัวอย่างเช่น สมมติว่าฉันมีฟังก์ชัน:

def Foobar(foo: Int, bar: Int): (Int, Int) = (foo, bar)

ถ้ามันส่งคืนค่าเดียว ฉันจะทำสิ่งนี้:

val a = Array(1, 2, 3)
val b = Array(4, 5, 6)
val c = (a,b).zipped.map(foobar)

แต่เนื่องจากมันคืนค่าสิ่งอันดับ ฉันจึงได้ Array[(Int,Int)] ในขณะที่ฉันต้องการ (Array[Int], Array[Int]) วิธีที่เหมาะสมในการทำสิ่งนี้คืออะไร? มีรูปแบบที่ชาญฉลาดในการสรุปสิ่งนี้เป็นดังนี้:

val c = vectorized(foobar,a,b)

ความคิดใด ๆ ที่จะได้รับการชื่นชมมาก ขอบคุณ!


person supyo    schedule 05.12.2012    source แหล่งที่มา


คำตอบ (2)


คุณสามารถแตกไฟล์ได้ (เห็นได้ชัดว่ามันดำเนินการซึ่งตรงกันข้ามกับ zip):

val c = foobar(a,b).unzip
//res2: (s.c.m.IndexedSeq[Int], s.c.m.IndexedSeq[Int]) = (ArrayBuffer(1, 2, 3),ArrayBuffer(4, 5, 6))

แต่คุณจะพบกับ IndexedSeqs ไม่ใช่ Arrays

person om-nom-nom    schedule 05.12.2012

คุณสามารถเขียนฟังก์ชัน vectorized ได้อย่างแน่นอนถ้าคุณต้องการ แม้ว่าคุณจะต้องการฟังก์ชันอื่นสำหรับทุกอินพุตและเอาท์พุตก็ตาม นี่คือเวอร์ชัน 2.10 (2.9 จะใช้ Manifest แทน ClassTag) สำหรับสองเข้าและสองออก:

import reflect.ClassTag
def vectorized[A, B, C: ClassTag, D: ClassTag](
  f: (A,B) => (C,D), a: Array[A], b: Array[B]
): (Array[C], Array[D]) = {
  val c = Array.newBuilder[C]
  val d = Array.newBuilder[D]
  for (i <- 0 until math.min(a.length, b.length)) {
    val x = f(a(i), b(i))
    c += x._1
    d += x._2
  }
  (c.result, d.result)
}
person Rex Kerr    schedule 05.12.2012
comment
@ziggystar - ทำไมคุณถึงทำแบบนั้น? Shapeless ได้รับการออกแบบมาเพื่อให้มีกำลังสูงสุดของระบบประเภท ไม่ใช่ประสิทธิภาพ! คุณอาจใช้ debox ได้ - person Rex Kerr; 05.12.2012
comment
คุณคงพูดถูกว่าคุณจะไม่ได้รับวิธีแก้ปัญหาที่ไร้รูปร่างเท่าที่จะหลีกเลี่ยงการชกมวยได้ โซลูชันของคุณจะใส่อาร์กิวเมนต์ไปที่ f หรือไม่ - person ziggystar; 06.12.2012
comment
@ziggystar - ขออภัย ฉันมีคำถามสับสน! บางทีคุณอาจใช้ ไร้รูปร่าง ที่นี่ และมันก็ไม่เป็นไร คุณจะต้องใส่ข้อโต้แย้งในกรณีนี้ คุณจะต้องเชี่ยวชาญเพื่อหลีกเลี่ยงสิ่งนั้น (การเชี่ยวชาญข้อโต้แย้งสี่ข้ออย่างเต็มที่จะทำให้คุณมีคลาสถึง 10,000 คลาส ดังนั้นนั่นไม่ฉลาดเลย) - person Rex Kerr; 06.12.2012