2010-10-28 39 views
7

Dưới đây là một chút mã Scala để tổng hợp các giá trị từ 1 đến 9 có thể chia hết cho 3 hoặc 5. Tại sao dòng 5 trả về một Đơn vị chứ không phải kiểu Boolean?Tại sao dòng Scala này trả về một Đơn vị?

object Sample { 

    def main(args : Array[String]) { 
     val answer = (1 until 10).foldLeft(0) ((result, current) => { 
      if ((current % 3 == 0) || (current % 5 == 0)) { 
       result + current 
      } 
     }) 

     println(answer) 
    } 

} 
+0

sức muốn thẻ này dự án Euler -spoiler ... –

+0

Xin lỗi, tôi không có ý định làm hỏng. Đã không thực sự nghĩ về điều đó khi tôi đăng. Tôi sẽ chỉnh sửa nó, nhưng tôi không thể chỉnh sửa câu trả lời của người khác. – Mike

Trả lời

11

Biểu thức if có loại Đơn vị vì không có mệnh đề nào khác. Vì vậy đôi khi nó trả về không có gì (Đơn vị) để toàn bộ biểu thức có loại Đơn vị.

(tôi giả sử bạn có nghĩa là để hỏi tại sao nó không trở về Int, không Boolean)

+0

Bạn chính xác. Tôi đã không nhận ra những gì đã thực sự xảy ra - Tôi thực sự mới với lập trình chức năng. Cách tốt nhất để xử lý điều này là gì? Thêm một người khác với kết quả + 0? – Mike

+0

di chuyển phần 'result +' ra khỏi khối 'if' (không cần phải lặp lại nó), và làm cho nó' kết quả + nếu (...) hiện tại khác 0' –

+0

Cảm ơn một bó. :) – Mike

8

Đây là giải pháp của tôi:

scala> val answer = (1 until 10) filter(current => (current % 3 == 0) || (current % 5 == 0)) sum 
answer: Int = 23 

Thông báo bộ lọc thay vì nếu nhân.

Một số khác trong một thậm chí nhiều thành ngữ Scala:

(for(x <- 1 until 10 if x % 3 == 0 || x % 5 == 0) yield x) sum 
+1

+1 Một câu trả lời tuyệt vời khác. Cảm ơn vì đã giúp tôi học một vài cách khác nhau. – Mike

9

Chúng ta có thể đã từng được quá thành ngữ? CÓ CHÚNG TÔI CÓ THỂ!

Set(3,5).map(k => Set(0 until n by k:_*)).flatten.sum 

[Chỉnh sửa]

đề nghị Daniel trông tốt hơn:

Set(3,5).flatMap(k => 0 until n by k).sum 
+2

Sẽ không tốt hơn nếu chỉ sử dụng 'flatMap'? –

+4

Trong thực tế, nếu bạn làm như vậy, bạn thậm chí có thể rút ngắn nó thành 'Set (3,5) .flatMap (k => 0 cho đến khi n bởi k) .sum'. –

+0

Đẹp nhất. Rất ... err .. số học :) – pedrofurla

4

Mã làm việc gần nhất với những gì bạn đã làm là thế này:

object Euler { 
    def main(args : Array[String]) { 
     val answer = (1 until 10).foldLeft(0) ((result, current) => 
      if ((current % 3 == 0) || (current % 5 == 0)) 
       result + current 
      else 
       result 
     ) 

     println(answer) 
    } 
} 
Các vấn đề liên quan