Kembali dalam loop Scala For

Saya baru mengenal Scala jadi mencoba melakukan hal sederhana terlebih dahulu.

Saya menulis metode di bawah ini.

//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        
  }  

Metode ini memberikan kesalahan

type mismatch;  found   : Unit  required: Int   

Saya tidak dapat memahami hal ini. Ketika saya tidak memiliki tipe pengembalian dan hanya mencetak nilainya, itu berfungsi dengan baik. Juga, Mengapa kesalahannya berlekuk-lekuk di atas i <- input. Saya pikir kompiler Scala mencoba memberi tahu saya sesuatu, dan saya tidak dapat memahaminya. Apa penyebab kesalahan ini?


person ashutosh raina    schedule 03.02.2013    source sumber
comment
Meskipun Scala memiliki kata kunci return, jarang disarankan (dan, saya yakin, Scala tidak pernah idiom) untuk menggunakannya.   -  person Randall Schulz    schedule 03.02.2013
comment
Saya masih tidak melihat perlunya memberi suara negatif.... Orang tidak menulis javascript/clojure idiomatis atau bahasa lain apa pun dalam pertanyaan yang mereka ajukan, lalu apakah itu berarti kita harus memberi suara negatif pada setiap pertanyaan?   -  person ashutosh raina    schedule 04.02.2013
comment
Saya tidak menolak pertanyaan tersebut. Saya pikir itu pertanyaan yang valid. Saya setuju, kami di sini untuk memandu penanya menuju kode Scala yang baik, bukan menghukum mereka karena belum mempelajari satu atau lain hal tentang Scala.   -  person Randall Schulz    schedule 04.02.2013


Jawaban (2)


for di Scala bukanlah for loop, sebenarnya ini bukan loop sama sekali. Ini adalah gula sintaksis untuk map dan flatMap serta barang monadik lainnya. Monads sangat berguna dalam pemrograman fungsional, saya sarankan meluangkan waktu untuk mempelajarinya; Anda dapat memulai di http://james-iry.blogspot.com/2007/09/monads-are-elephants-part-1.html , ikuti keseluruhan rangkaiannya. Terima kasih kepada Tuan James Iry yang luar biasa.

Jika Anda hanya ingin item pertama yang cocok dengan kueri Anda, coba ini

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

Nilai yang mungkin untuk findFirst adalah

  1. Some(n) jika sesuatu ditemukan, di mana n adalah Int yang ditemukan
  2. Tidak ada jika tidak ada yang ditemukan
person user1779032    schedule 03.02.2013
comment
def FindFirstMultiple(masukan: Daftar[Int]) : Int = { masukan.find(i =› i % 7 == 0).getOrElse(0) } - person user1779032; 03.02.2013
comment
Ya, ini akan berhasil. Tapi bagaimana Anda mencapai hal yang sama dengan for loop ? - person ashutosh raina; 03.02.2013
comment
Scala tidak memiliki loop for. - person Dominic Bou-Samra; 03.02.2013

Jika Anda ingin menjalankan ini dengan loop for, Anda juga perlu menambahkan return 0 seperti pada

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

Nilai akhir diperlukan karena for itu sendiri tidak mengembalikan apa pun jika if tidak terpenuhi.

Seperti yang disarankan pengguna1779032, cara yang lebih baik adalah

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