การกลับมาใน Scala For loop

ฉันยังใหม่กับ Scala เลยพยายามทำสิ่งง่ายๆ ก่อน

ฉันเขียนวิธีการซึ่งอยู่ด้านล่าง

//Given a list of numbers find the first number that is a multiple of 7
  def FindFirstMultiple(input: List[Int]) : Int  = {   
    for (
        i <- input        
        if (i % 7 == 0)
       ) 
      return i        
  }  

วิธีการนี้ทำให้เกิดข้อผิดพลาด

type mismatch;  found   : Unit  required: Int   

ฉันไม่สามารถเข้าใจสิ่งนี้ได้ เมื่อฉันไม่มีประเภทการคืนสินค้าและเพียงพิมพ์ค่า มันก็ใช้ได้ดี นอกจากนี้ เหตุใดข้อผิดพลาดจึงเลื่อนไปมาเหนือ i <- input ฉันคิดว่าคอมไพเลอร์ Scala กำลังพยายามบอกอะไรบางอย่างกับฉัน แต่ฉันก็ไม่เข้าใจ อะไรจะเป็นสาเหตุของข้อผิดพลาดนี้?


person ashutosh raina    schedule 03.02.2013    source แหล่งที่มา
comment
แม้ว่า Scala จะมีคีย์เวิร์ด return แต่ก็ไม่ค่อยแนะนำให้ใช้ (และฉันก็กล้าพูดเลยว่า Scala ไม่ใช้สำนวน) ที่จะใช้มัน   -  person Randall Schulz    schedule 03.02.2013
comment
ฉันยังไม่เห็นว่าจำเป็นต้องลงคะแนนเสียง.... ผู้คนไม่เขียนจาวาสคริปต์/โคลจูร์ที่เป็นสำนวนหรือภาษาอื่นใดในคำถามที่พวกเขาถาม นั่นหมายความว่าเราควรลงคะแนนเสียงทุกคำถามใช่หรือไม่   -  person ashutosh raina    schedule 04.02.2013
comment
ฉันไม่ได้ลงคะแนนคำถาม ฉันคิดว่ามันเป็นคำถามที่ถูกต้องสมบูรณ์ ฉันเห็นด้วย เรามาที่นี่เพื่อแนะนำผู้ถามเกี่ยวกับโค้ด Scala ที่ดี ไม่ใช่ลงโทษพวกเขาที่ไม่ได้เรียนรู้สิ่งใดสิ่งหนึ่งเกี่ยวกับ Scala มาก่อน   -  person Randall Schulz    schedule 04.02.2013


คำตอบ (2)


for ใน Scala ไม่ใช่ for loop จริงๆ แล้วมันไม่ใช่การวนซ้ำเลย มันเป็นน้ำตาลเชิงวากยสัมพันธ์สำหรับแผนที่และ flatMap และสารพัด Monadic อื่น ๆ Monads มีประโยชน์มากใน Functional Programming ฉันขอแนะนำให้ลงทุนเวลาเรียนรู้มัน คุณสามารถเริ่มต้นได้ที่ http://james-iry.blogspot.com/2007/09/monads-are-elephants-part-1.html ติดตามซีรี่ส์ทั้งหมด ขอขอบคุณคุณ James Iry ที่ยอดเยี่ยม

หากคุณต้องการเพียงรายการแรกที่ตรงกับคำค้นหาของคุณ ให้ลองทำสิ่งนี้

val findFirst:Option[Int] = input.find(i => i % 7 == 0)

ค่าที่เป็นไปได้สำหรับ findFirst คือ

  1. Some(n) หากพบบางสิ่ง โดยที่ n คือ Int ที่พบ
  2. ไม่มีหากไม่พบสิ่งใด
person user1779032    schedule 03.02.2013
comment
def FindFirstMultiple(อินพุต: รายการ[Int]) : Int = { input.find(i =› i % 7 == 0).getOrElse(0) } - person user1779032; 03.02.2013
comment
ใช่นี่จะได้ผล แต่คุณจะบรรลุผลสำเร็จเช่นเดียวกันกับ a for loop ได้อย่างไร? - person ashutosh raina; 03.02.2013
comment
สกาล่าไม่มี for loops - person Dominic Bou-Samra; 03.02.2013

หากคุณต้องการรันสิ่งนี้ด้วย for loop คุณต้องเพิ่ม return 0 ด้วย

def FindFirstMultiple(input: List[Int]) : Int  = {   
    for ( i <- input if (i % 7 == 0)) return i 
    0       
  }  

จำเป็นต้องใช้ค่าสิ้นสุดเนื่องจาก for เองจะไม่ส่งคืนสิ่งใดๆ เมื่อ if ไม่พอใจ

ตามที่ผู้ใช้ 1779032 แนะนำวิธีที่ดีกว่าคือ

def FindFirstMultiple(input: List[Int]) = input.find(i => i % 7 == 0).getOrElse(0)  
person Arnon Rotem-Gal-Oz    schedule 03.02.2013