2011-08-26 25 views
20
scala> val two = (1,2) 
two: (Int, Int) = (1,2) 

scala> val one = (1,) 
<console>:1: error: illegal start of simple expression 
     val one = (1,) 
        ^

scala> val zero =() 
zero: Unit =() 

Đây có phải là:Scala có cú pháp cho 0 và 1-tuple không?

val one = Tuple1(5) 

thực sự là cách ngắn gọn nhất để viết một tuple singleton chữ trong Scala? Và không Unit hoạt động như một bộ trống rỗng?

Có sự mâu thuẫn này làm phiền bất cứ ai khác?

+0

Bạn cần ở đâu? –

+1

Tôi không chắc chắn mình có thể nghĩ về một ngôn ngữ có '1' hoặc' 0' tuples (với bất kỳ hiệu ứng có thể sử dụng nào). Tôi cũng không thể nghĩ tại sao bạn muốn sử dụng chúng. 1-tuple là giá trị bạn đặt vào đó. ví dụ. trong Python, 'x = (5)' đánh giá thành '5'. Bạn không thể hoạt động trên các bộ dữ liệu như bạn làm với các danh sách - tức là 'x.head' hoặc' x.tail' vì một bộ gồm 5 ints là một _different type_ hơn một tuple có 4 int. –

+4

Trong Python cú pháp cho một bộ kích cỡ là 'x = (5,)'. Dấu phẩy là cần thiết để loại bỏ sự mơ hồ khi 'x = (5)' thực sự đánh giá thành 'x = 5'. – Debilski

Trả lời

27

thực sự là cách súc tích nhất để viết một chữ tuple đơn trong Scala?

Có.

Đơn vị hoạt động giống như một bộ trống không?

Không, vì nó không thực hiện Product.

Sự không thống nhất này có làm phiền bất kỳ ai khác không?

Không tôi.

5

Tôi chưa bao giờ thấy một sử dụng duy nhất của Tuple1. Tôi cũng không thể tưởng tượng được.

Trong Python, nơi mọi người sử dụng nó, các bộ sưu tập được có kích thước cố định. Các bộ dữ liệu trong Scala không phải là các bộ sưu tập, chúng là các sản phẩm kiểu Descartes. Vì vậy, một số Int x Int là một số Tuple2[Int, Int] hoặc (Int, Int). Đương nhiên, một số Int là một số Int và không có loại nào là vô nghĩa.

+0

Bạn có đoán tại sao Tuple1 tồn tại? –

+3

@Kipton Sheer đầy đủ, tôi cược. Hoặc, có lẽ, bởi vì sự tích hợp kế hoạch dài của các bộ dữ liệu và các thông số (trong đó, imho, nên đã có ngay từ đầu). Mặt khác, một 'Tuple0' sẽ có ý nghĩa khi tích hợp các bộ dữ liệu và tham số. –

+1

Đây là cũ, nhưng kích thước 0 và 1 tuples làm cho cảm giác hoàn hảo cho sự nhất quán trong các tình huống lặp lại. Các tuple có thể đại diện cho một chuỗi kích thước cố định. Ví dụ rõ ràng đến từ tâm trí (từ ngôn ngữ khác) là 'hình dạng' của Numpy, mô tả số phần tử trong mỗi chiều của ma trận. Rõ ràng chúng ta có thể có ma trận 1 chiều. Chúng ta có thể có kích thước bằng không? Một số người cho rằng có (cho phép numpy). Tất cả những gì đã nói, tôi không biết về bất kỳ tình huống nào mà bạn không thể sử dụng một danh sách cho điều này (và Scala có danh sách bất biến, điều này cũng đạt được điều này). – Kat

7

Nó thực sự là cách ngắn gọn nhất để viết một tuple với một arity của 1.

Trong những ý kiến ​​trên, chúng tôi thấy nhiều tài liệu tham khảo để "tại sao Tuple1 là hữu ích". Các bộ dữ liệu ở Scala mở rộng đặc tính Product, cho phép bạn lặp qua các thành viên của bộ dữ liệu.

Có thể triển khai phương thức có tham số loại Product và trong trường hợp này Tuple1 là cách chung duy nhất để lặp lại các bộ sưu tập kích thước cố định với nhiều loại mà không làm mất thông tin loại.

Có nhiều lý do khác để sử dụng Tuple1, nhưng đây là trường hợp sử dụng phổ biến nhất mà tôi đã có.

+0

Làm cho tinh thần. Nhưng nó sẽ là tốt đẹp nếu một cú pháp đường đã tồn tại để tạo ra một Tuple1 nhưng không có cách nhất quán (chứ không phải là xấu xí '(1,)' tất nhiên) đến với tâm! Có thể 'Tuple (" cái gì đó ")' hoặc 'Tuple()' cho 'Tuple1' và' Tuple0' tương ứng (Bằng cách có 'phương thức' apply() 'trong một số Object gọi là' Tuple')? –

0

Những câu trả lời trước đó đã đưa ra một tuple hợp lệ của 1 phần tử. Đối với một trong các phần tử không, mã này có thể hoạt động:

object tuple0 extends AnyRef with Product { 
    def productArity = 0 
    def productElement(n: Int) = throw new IllegalStateException("No element") 
    def canEqual(that: Any) = false 
} 
Các vấn đề liên quan