2012-02-25 13 views

risposta

15

No, non tutti gli usi possono essere convertiti. Qualcosa di simile a questo (grazie a retronym, qui di seguito, che dovrebbero essere sempre le upvotes su questo)

def foo(xs: Map[T, T] forSome { type T}) 

Il punto qui è che posso usare il esistenziale in più di un luogo, ma è lo stesso esistenziale. Ovviamente, se si utilizzavano caratteri jolly, si farebbe riferimento a diversi valori esistenziali

+0

In questo esempio; no. Per essere onesti, non sono sicuro al 100% che sia una sintassi valida e che non abbia avuto la possibilità di controllare. Ma ho visto esempi lungo linee simili –

+0

Infatti, l'ho appena provato con la scala 2.9.1 e ** non si compila **! Potresti correggerlo, non posso farlo per te, non ho mai usato/necessario il costrutto 'forSome'. – paradigmatic

+0

Risolto lungo le linee suggerite dal retronym –

14

_ in questo contesto è la "Sintassi segnaposto per tipi esistenziali", descritta in 3.2.10 dello language specification.

Il nome suona molto simile a un altro uso di _, "Sintassi segnaposto per funzioni anonime". Questa stenografia non può essere utilizzata per tutte le funzioni. Ad esempio:

(a: A) => f(g(a)) 
f(g(_: A)) // WRONG, this means f((a: A) => g(a)) 

possiamo costruire un esempio simile per esistenziali, che non può essere rappresentato _:

F[G[A]] forSome { type A } 
F[G[_]] // WRONG, this means F[G[A] forSome { type A }] 

nota laterale: esistenziali sono non livello di tipo analogico di funzioni di livello valore . Che sarebbe:

({type l[A] = F[G[A]])#l 

in realtà è un peccato che Scala usa la sottolineatura per esistenziali, invece di funzioni di livello tipo.

UPDATE

Fatemi telaio @oxbow_lakes 'risposta nello stesso modo:

(a: A) => h(a, a) 
h(_, _) // WRONG, this means (a, b) => f(a, b) 

H[A, A] forSome { type A } 
H[_, _] // WRONG, this means H[A, B] forSome { type A; type B } 
+0

Qual è la differenza tra F [G [A]] per Alcuni {tipo A} e F [G [A] per Alcuni {tipo A}]? – user482745

Problemi correlati