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

è questa:Scala ha sintassi per le tuple 0 e 1?

val one = Tuple1(5) 

davvero il modo più conciso per scrivere un tupla Singleton letterale nella Scala? E lo Unit funziona come una tupla vuota?

Questa incoerenza infastidisce qualcun altro?

+0

Dove ti serve? –

+1

Non sono sicuro di poter pensare ad un linguaggio che abbia tuple '1' o' 0' (a qualsiasi effetto utile). Non riesco nemmeno a pensare al perché vorresti usarli. Una tupla da 1 è il valore che hai inserito. per esempio. in Python, 'x = (5)' restituisce '5'. Non è possibile operare su tuple come si farebbe con le liste - ad esempio 'x.head' o' x.tail' perché una tupla di 5 inte è un _tipo diverso_ rispetto a una tupla con 4 inte. –

+4

In Python la sintassi per una tupla di dimensione uno è 'x = (5,)'. La virgola è necessaria per rimuovere l'ambiguità come 'x = (5)' in effetti valuta 'x = 5'. – Debilski

risposta

27

davvero il modo più conciso per scrivere una tupla letterale singleton in Scala?

Sì.

E l'unità funziona come una tupla vuota?

No, poiché non implementa Product.

Questa incoerenza infastidisce qualcun altro?

Non io.

5

Non ho mai visto un singolo utilizzo di Tuple1. Né posso immaginarne uno.

In Python, dove le persone lo usano, le tuple sono raccolte di dimensioni fisse. Le tuple in Scala non sono collezioni, sono prodotti cartesiani di tipi. Quindi, uno Int x Int è uno Tuple2[Int, Int] o (Int, Int) in breve. Naturalmente, un Int è un Int e nessun tipo è privo di significato.

+0

Hai un'ipotesi perché esiste Tuple1? –

+3

@Kipton Pura completezza, scommetterei. O forse, a causa dell'integrazione a lungo pianificata di tuple e parametri (che, imho, avrebbe dovuto esserci fin dall'inizio). D'altra parte, un 'Tuple0' avrebbe senso quando si integrano tuple e parametri. –

+1

Questo è vecchio, ma le tuple di taglia 0 e 1 hanno perfettamente senso per coerenza in situazioni iterabili. La tupla può rappresentare una sequenza di dimensioni fisse. L'esempio ovvio che viene in mente (da un'altra lingua) è 'shape' di Numpy, che descrive il numero di elementi in ciascuna dimensione di una matrice. Ovviamente possiamo avere matrici monodimensionali. Possiamo avere zero dimensioni? Alcuni sosterrebbero sì (lo permette numpy). Detto questo, non sono a conoscenza di alcuna situazione in cui non è possibile utilizzare una lista per questo (e Scala ha elenchi immutabili, che raggiungono questo bene). – Kat

7

è davvero il modo più conciso di scrivere una tupla con un arity di 1.

Nei commenti di cui sopra vedo molti riferimenti a "perché TUPLE1 è utile". I tuple in Scala estendono il tratto Product, che consente di scorrere i membri della tupla.

Si può implementare un metodo che ha un parametro di tipo Product, e in questo caso Tuple1 è l'unico modo generico per iterare raccolte di dimensioni fisse con più tipi senza perdere le informazioni sul tipo.

Ci sono altri motivi per utilizzare Tuple1, ma questo è il caso d'uso più comune che ho avuto.

+0

Ha senso. Ma sarebbe bello se esistesse uno zucchero sintattico per creare una Tuple1, ma non viene in mente un modo coerente (piuttosto che brutto '(1,)' ovviamente)! Forse 'Tuple (" qualcosa ")' o 'Tuple()' per 'Tuple1' e' Tuple0' rispettivamente (Avendo metodi 'apply()' in qualche oggetto chiamato 'Tuple')? –

0

Le risposte precedenti hanno fornito una Tupla valida di 1 elemento. Per uno degli elementi zero questo codice potrebbe funzionare:

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