2011-01-05 32 views
6

Ba loại phụ trực tiếp của IterableMap, SeqSet. Có vẻ như - ngoài các vấn đề về hiệu năng — Seq là một bản đồ từ số nguyên đến giá trị và Set là một bản đồ từ các giá trị đến boolean (true nếu giá trị nằm trong tập hợp, sai nếu không).Tại sao Seq [V] không mở rộng Bản đồ [Int, V] cũng như không đặt [V] mở rộng Bản đồ [V, Bool]?

Nếu trường hợp này xảy ra, tại sao điều này không được thể hiện trong hệ thống kiểu bằng cách thực hiện Seq[V] mở rộng Map[Int, V]Set[V] mở rộng Map[V, Boolean]?

+0

'Set' và' Seq' có ngữ nghĩa rất khác nhau từ 'Bản đồ', vì vậy sẽ không có ý nghĩa khi hiển thị chúng theo cách đó. – Gabe

+0

@Gabe, bạn có thể đưa ra một ví dụ cụ thể về ý nghĩa của từ "ngữ nghĩa khác nhau" không? – Adam

+1

Tôi nghĩ rằng đây là một câu hỏi thú vị, nhưng câu trả lời của Madoc là vô ý. – Malvolio

Trả lời

12

Vâng, chúng sắp xếp làm, ít nhất là chức năng thực sự phổ biến. Seq[B] được kế thừa từ Int => B (qua PartialFunction[Int, B]), Map[A, B] được thừa kế từ A => B (cũng thông qua PartialFunction[A, B]) và Set[A] được kế thừa từ A => Boolean. Vì vậy, theo như phương pháp ứng dụng chức năng và thành phần có liên quan, cả ba có thể được sử dụng thay thế cho nhau. Ngoài ra, chúng có thể được sử dụng thay thế cho nhau như xa như traversal đi, như tất cả thực hiện TraversableLike.

+0

Cảm ơn! Trong trường hợp đó, tôi đoán câu hỏi của tôi thay đổi một chút: sự khác biệt cơ bản, 30 từ hoặc ít hơn giữa Bản đồ [A, B] và Hàm [A, B] là gì? – Adam

+1

@Adam Một 'Bản đồ' có thể đi ngang, trong khi' Hàm' không phải là. Vì vậy, một 'Bản đồ' có thể liệt kê các khóa của nó, nhưng một' Hàm' không thể làm tương tự cho các tham số của nó. –

4

Vâng, nếu tất cả bạn quan tâm đến SeqSet là, bạn sẽ có một điểm. Bản thân tôi, tôi nghĩ rằng đó là một trong những khía cạnh nhập khẩu ít nhất, và một trong đó đã được đại diện bởi tất cả chúng là chức năng.

Nghĩa là, một Map là một chức năng của một chìa khóa vào một giá trị, một Seq là một chức năng của một Int thành một giá trị, và một Set là một chức năng của một giá trị vào một Boolean. Thuộc tính này, mà bạn gọi là "bản đồ", là một funciton. Và nó đã được chia sẻ bởi cả ba.

gì, theo ý kiến ​​của tôi, Map, SeqSet thực sự về là:

  • Một Seq là lo ngại về biết theo thứ tự nào các yếu tố của nó là. Về mặt khái niệm, bạn sẽ thêm một phần tử vào một số Map như thế nào? Bạn sẽ phải đổi lại tất cả các phím!

  • A Set quan ngại về sự hiện diện hoặc vắng mặt của một phần tử. Làm thế nào một mô hình đó trong một Map? Nó sẽ phải là một bản đồ với giá trị mặc định - không phải là một bản đồ chung - và một bản đồ trong đó tất cả các giá trị không mặc định đều giống nhau! Đó rõ ràng là một hành vi thoái hóa, không phải là một trừu tượng.

  • A Map quan tâm đến việc ánh xạ khóa tùy ý với giá trị tùy ý. Một Seq không có khóa tùy ý và Set không có giá trị tùy ý.

+0

"Vâng, nếu tất cả các bạn quan tâm" - tốt, câu hỏi của tôi có thể được rephrased là "những gì, cụ thể, là nó mà các nhà thiết kế thư viện Scala quan tâm mà dẫn họ đưa ra quyết định này"? – Adam

+0

@Adam Xem http://www.scala-lang.org/sid/3, http://www.scala-lang.org/docu/files/collections-api/collections.html và http: // www. scala-lang.org/docu/files/collections-api/collections-impl.html. –

8

Việc xem một chuỗi như một nhiệm vụ từ số nguyên đến phần tử chỉ là một cách để mô tả chuỗi là gì. Có nhiều cách khác, và không có lý do nào tại sao cách mô tả chuỗi đó trở nên kinh điển. Mục đích thực sự của một chuỗi là tạo một loạt các phần tử có thể truy cập và di chuyển được. Một chuỗi là không cần thiết để thực sự gán số nguyên cho các phần tử. Ví dụ: hầu hết các triển khai Stream có thể không có bộ đếm đang chạy song song với quá trình truyền tải. Yêu cầu đó sẽ áp đặt một chi phí không cần thiết về việc thực hiện.

Bên cạnh đó, Map[K,V] cũng là Iterable[(K,V)]. Theo đề xuất của bạn, một số Seq[A] cũng sẽ phải là Map[Int,A], mà theo đó cũng làm cho nó là Iterable[(Int,A)]. Vì Seq kéo dài Iterable, điều này sẽ làm cho Seq[A] cả hai Iterable[A]Iterable[(Int,A)] (và, đệ quy, Iterable[(Int,(Int,A))], Iterable[(Int,(Int,(Int,A)))], v.v.), không phải là cách thừa kế được phép trong Scala.

Bạn có thể tạo đối số tương tự cho đề xuất của mình về Set.

+2

Tôi nghĩ rằng đối số thứ hai là hấp dẫn. Để đơn giản hóa nó, nếu 'Seq [A]' mở rộng 'Map [Int, A]', thì 'seq.elements()' sẽ trả về cái gì? – Malvolio

+0

Thú vị. Hệ thống kiểu của Haskell không bị giới hạn như vậy (trên thực tế, nó phô trương loại đa hình này sang trái và phải). Thật thú vị khi thấy lý thuyết cơ bản của Scala đã hạn chế thư viện chuẩn của nó như thế nào. – Adam

+1

@Adam Tôi cũng không thấy Haskell thoát khỏi điều đó. Nếu bạn 'foldr' như là danh sách trong Haskell, bạn không gấp tuples' (Int, A) ': bạn gấp' A'. –

Các vấn đề liên quan