2011-08-26 9 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 =() 

es la siguiente:¿Scala tiene sintaxis para 0 y 1 tuplas?

val one = Tuple1(5) 

realmente la forma más concisa para escribir una tupla Singleton literal en Scala? ¿Y funciona Unit como una tupla vacía?

¿Esta inconsistencia molesta a alguien más?

+0

¿Dónde lo necesitan? –

+1

No estoy seguro de que pueda pensar en un lenguaje que tenga tuplas '1' o' 0' (para cualquier efecto utilizable). Tampoco puedo pensar en por qué querrías usarlos. Una 1-tupla es el valor que le pones. p.ej. en Python, 'x = (5)' evalúa a '5'. No puede operar en tuplas como lo haría con las listas, es decir, 'x.head' o' x.tail' porque una tupla de 5 ints es un _different type_ que una tuple con 4 ints. –

+4

En Python, la sintaxis para una tupla de tamaño uno es 'x = (5,)'. La coma es necesaria para eliminar la ambigüedad ya que 'x = (5)' de hecho evalúa a 'x = 5'. – Debilski

Respuesta

27

¿realmente la forma más concisa de escribir un singleton tuple literal en Scala?

Sí.

¿Y la unidad funciona como una tupla vacía?

No, ya que no implementa Product.

¿Esta inconsistencia molesta a alguien más?

Yo no.

5

Nunca he visto un solo uso de Tuple1. Tampoco puedo imaginarme uno.

En Python, donde las personas lo usan, las tuplas son colecciones de tamaño fijo. Las tuplas en Scala no son colecciones, son productos cartesianos de tipos. Entonces, un Int x Int es un Tuple2[Int, Int], o (Int, Int) para abreviar. Naturalmente, un Int es un Int, y ningún tipo no tiene sentido.

+0

¿Adivina por qué existe Tuple1? –

+3

@Kipton Pureza completa, apostaría. O, tal vez, debido a la integración largamente planificada de tuplas y parámetros (que, en verdad, debería haber estado allí desde el principio). Por otro lado, un 'Tuple0' tendría sentido al integrar tuplas y parámetros. –

+1

Esto es antiguo, pero las tuplas de tamaño 0 y 1 tienen perfecto sentido para la coherencia en situaciones iterables. La tupla puede representar una secuencia de tamaño fijo. El ejemplo obvio que viene a la mente (de otro idioma) es la "forma" de Numpy, que describe el número de elementos en cada dimensión de una matriz. Obviamente, podemos tener matrices de 1 dimensión. ¿Podemos tener cero dimensiones? Algunos dirían que sí (numpy lo permite). Dicho todo esto, no estoy al tanto de ninguna situación en la que no puedas usar una lista para esto (y Scala tiene listas inmutables, que lo hacen bien). – Kat

7

lo que realmente es la forma más concisa para escribir una tupla con un aridad de 1.

En los comentarios anteriores veo muchas referencias al "por qué TUPLE1 es útil". Tuplas en Scala extienden el rasgo Product, que le permite iterar sobre los miembros de la tupla.

Se puede implementar un método que tenga un parámetro del tipo Product, y en este caso Tuple1 es la única forma genérica de iterar colecciones de tamaño fijo con varios tipos sin perder la información del tipo.

Existen otras razones para usar Tuple1, pero este es el caso de uso más común que tuve.

+0

Tiene sentido. Pero sería bueno si hubiera existido un azúcar sintáctico para crear un Tuple1, pero no viene a la mente una forma consistente (en lugar de fea '(1,)' por supuesto). Tal vez 'Tuple (" algo ")' o 'Tuple()' para 'Tuple1' y' Tuple0' respectivamente (Al tener 'apply()' métodos en algún Objeto llamado 'Tuple')? –

0

Las respuestas anteriores han dado un Tuple válido de 1 elemento. para uno de los elementos cero este código podría funcionar:

object tuple0 extends AnyRef with Product { 
    def productArity = 0 
    def productElement(n: Int) = throw new IllegalStateException("No element") 
    def canEqual(that: Any) = false 
}