2011-08-29 10 views
7

Esto funciona¿Cómo se define el tipo de escala para ninguna función de argumento?

def func(f: => Int) = f 

Este dosn't (dentro de la clase, por ejemplo)

type EmptyFunct = => Int 

o

versión
type EmptyFunct = (=> Int) 

Scala 2.9 dos preguntas:

  1. ¿Por qué no funciona la sintaxis con azúcar en el segundo caso?
  2. ¿Cómo se define esta función sin sintaxis de azúcar?
+0

¿Puede dar un ejemplo del uso de 'EmptyFunct' que muestra por qué'() => unit' no se ajusta a tu necesidad? – Nicolas

Respuesta

12

=> Int no es exactamente una función sin parámetro, es un argumento Int con llamada por convención de paso de nombre. (Por supuesto, ese es un punto bastante bueno, ya que se implementa pasando una función sin parámetro).

La función sin argumento está escrita () => Int. Puedes hacer type EmptyFunct =() => Int.

No es un tipo. Dentro de func, f se tipeará como Int. Un argumento de tipo() => Int no lo hará.

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

func (: => Int) Int

Pero

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

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

+0

Entonces, ¿no hay forma de crear la colección de funciones no arg (: => Unidad)? – yura

+0

Ver mi respuesta: 'Colección [Función0 [Unidad]]' – Nicolas

+0

Si buscaba argumentos (: => Unidad *) repetidos, no está permitido. De hecho, eso solo podría ser Seq [Unidad] (Seq contiene valores, no argumentos que invocan convenciones). Y ser completamente inútil. Lo que quiere es Seq [Function0 [Unit]] (o Seq [(> => Unit], significa lo mismo). La notación será menos conveniente:() => x + = 1 en lugar de x + = 1. –

3

Debe utilizar Function0

En el primer caso, no funciona porque se declara una función no argumento, pero debido a que indica que el parámetro se llama por su nombre.

+0

Esto no es la solución a mi problema. Porque Function0 es realmente tiene tipo() => T no (=> T) que como entiendo no funciona en absoluto. – yura

0

no veo mucho sentido en un método, que devuelve un int, invoca sin parámetro. ¿O devuelve una constante, por lo que podría usar la constante, o usaría una var?

Así que vamos a ir con una var:

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

resultado es 20, luego 22.

+0

"No veo mucho sentido en un método, devolviendo un int, invocado sin parámetro". Un contador ? – Nicolas

+0

O cualquier función de devolución de llamada que tenga todo su contexto en la fase de creación – yura

Cuestiones relacionadas