2012-02-07 28 views
13

Tôi vừa nhìn thấy tôi có thể làm:Scala: có ý nghĩa gì để vượt qua một Set đến chức năng bản đồ của một tập

Set(1, 2, 3).map(Set(1)) 

trong đó sản lượng kết quả:

Set(true, false) 

Nhưng tôi nghĩ rằng chức năng bản đồ chỉ có thể thực hiện một chức năng khác không phải là một Tập mới. Nếu bất cứ điều gì tôi mong đợi điều này để trả lại một tập hợp các bộ. Điều gì đang xảy ra và kết quả có ý nghĩa gì?

Trả lời

18

Nhưng tôi nghĩ rằng map chức năng chỉ có thể đưa một chức năng không phải là một mới Set.

A Set một chức năng. Nó là một hàm từ các phần tử của nó tới các phép toán (booleans): khi bạn truyền nó thành một phần tử, nó cho bạn biết liệu phần tử đó có phải là một phần của Set hay không.

Set(1, 2, 3).map(Set(1)) 

Lặp lại trên Set(1, 2, 3), chuyển từng phần tử đến Set(1). I E. nó yêu cầu đầu tiên "là 1 một thành viên của bộ {1}", là true, sau đó nó sẽ hỏi cùng một câu hỏi cho 23, là false.

Vì vậy, kết quả là Set(true, false, false), tất nhiên chỉ là Set(true, false).

Tương tự, chuỗi là hàm từ số nguyên đến phần tử, bản đồ là hàm từ khóa đến giá trị.

5
  • Set[A] kéo dài Function1[A, Boolean].
  • Map[K, V] mở rộng PartialFunction[K, V] lần lượt mở rộng Function1[K, V].
  • Seq[A] mở rộng PartialFunction[Int, A] lần lượt mở rộng Function1[Int, A].

Vì vậy, trong thư viện bộ sưu tập Scala, bộ, chuỗi và bản đồ là các hàm của chúng.

  • apply phương pháp trong Set[_] kiểm tra đặt thành viên.
  • apply phương pháp trong Map[_, _] trả về giá trị được liên kết với khóa đã cho. Lỗi ném nếu phím không có.
  • apply phương pháp trong Seq[_] trả về phần tử tại chỉ mục đã cho. Lỗi ném cho chỉ mục không hợp lệ.

Hai sau là tương đương:

Set(1, 2, 3).map(Set(1)) 

Set(1, 2, 3).map(x => Set(1).contains(x)) 

Vậy là hai sau:

Seq(1, 2, 3).collect(someMap) 

Seq(1, 2, 3) collect { 
    case x if someMap contains x => someMap(x) 
} 

Và cũng sau hai:

Seq(1, 2, 3).map(someSeq) 

Seq(1, 2, 3).map(x => someSeq(x)) 
Các vấn đề liên quan