2011-08-29 11 views
7

Questo funzionaCome definire il tipo scala per nessuna funzione argomento?

def func(f: => Int) = f 

Questo dosn't (all'interno della classe, ad esempio)

type EmptyFunct = => Int 

o

versione
type EmptyFunct = (=> Int) 

Scala 2.9 due domande:

  1. Perché non funziona lo zucchero sintattico nel secondo caso?
  2. Come definire questa funzione senza zucchero della sintassi?
+0

Può fare un esempio di utilizzo di 'EmptyFunct' che mostra perché'() => unit' non va bene per te? – Nicolas

risposta

12

=> Int non è esattamente una funzione senza parametro, è un argomento Int con convenzione di passaggio nome per nome. (Naturalmente, questo è un punto piuttosto fine, poiché viene implementato passando una funzione senza parametro).

La funzione senza argomento è scritta () => Int. Puoi fare type EmptyFunct =() => Int.

Non è un tipo. Dentro func, f sarà digitato come Int. Un argomento di tipo() => Int non lo farà.

def func(f: => Int) = f *2 

func (: => Int) Int

Ma

def func(f:() => Int) : Int = f*2 

error: value * is not a member of() => Int

+0

Quindi non c'è modo di creare la raccolta di no arg (: => Unit) funzioni? – yura

+0

Vedere la mia risposta: 'Raccolta [Funzione0 [Unità]]' – Nicolas

+0

Se si sta cercando (: => Unità *) argomenti ripetuti, non è consentito. In effetti, potrebbe essere solo Seq [Unità] (Seq contiene valori, non argomenti che chiamano convenzioni). Ed essere abbastanza inutile. Quello che vuoi è Seq [Funzione0 [Unità]] (o Seq [() => Unità], significa la stessa cosa). La notazione sarà meno conveniente:() => x + = 1 invece di x + = 1. –

3

Si dovrebbe usare Function0

Nel primo caso non funziona perché si dichiara una funzione non argomento, ma perché indica che il parametro è chiamato per nome.

+0

Questa non è una soluzione al mio problema. Perché Function0 è in realtà ha type() => T not (=> T) che come sottotesto non funziona affatto. – yura

0

non vedo molto senso in un metodo, restituendo un int, invocato con nessun parametro. O restituisce una costante, quindi potresti usare la costante o userebbe una var?

Quindi cerchiamo di andare con una var:

var k = 10 
val fi = List (() => k * 2,() => k - 2) 
val n = fi(0) 
n.apply 
k = 11 
n.apply 

risultato è 20, poi 22.

+0

"Non vedo molto senso in un metodo, restituendo un int, invocato senza parametri." Un contatore ? – Nicolas

+0

O qualsiasi funzione di callback che abbia tutto il suo contesto nella fase di creazione – yura