2010-10-28 9 views
7

Aquí hay un poco de código Scala para sumar los valores del 1 al 9, que son divisibles entre 3 o 5. ¿Por qué la línea 5 devuelve una unidad y no un tipo booleano?¿Por qué esta línea de Scala devuelve una unidad?

object Sample { 

    def main(args : Array[String]) { 
     val answer = (1 until 10).foldLeft(0) ((result, current) => { 
      if ((current % 3 == 0) || (current % 5 == 0)) { 
       result + current 
      } 
     }) 

     println(answer) 
    } 

} 
+0

posible que desee etiqueta de este proyecto de Euler -spoiler ... –

+0

Lo siento, no quise estropearme. Realmente no estaba pensando en eso cuando publiqué. Lo editaría, pero no puedo editar las respuestas de otros. – Mike

Respuesta

11

La expresión if tiene un tipo de unidad porque no hay ninguna cláusula else. Por lo tanto, a veces no devuelve nada (Unidad), por lo que toda la expresión tiene el tipo Unidad.

(supongo que quería decir que preguntar por qué no volvió Int, no booleana)

+0

Estás en lo correcto. No me di cuenta de lo que estaba sucediendo en realidad. Soy realmente nuevo en la programación funcional. ¿Cuál es la mejor manera de manejar esto? Agregar un else con resultado + 0? – Mike

+0

mueve la parte 'result +' fuera del bloque 'if' (no hay necesidad de repetirlo), y hazlo' result + if (...) current else 0' –

+0

Muchas gracias. :) – Mike

8

Aquí está mi solución:

scala> val answer = (1 until 10) filter(current => (current % 3 == 0) || (current % 5 == 0)) sum 
answer: Int = 23 

Aviso del filtro en lugar de si '.

Otra uno en un Scala aún más idiomática:

(for(x <- 1 until 10 if x % 3 == 0 || x % 5 == 0) yield x) sum 
+1

+1 Otra gran respuesta. Gracias por ayudarme a aprender de diferentes maneras. – Mike

9

podemos llegar a ser demasiado idiomática? ¡SI PODEMOS!

Set(3,5).map(k => Set(0 until n by k:_*)).flatten.sum 

[Editar]

sugerencia de Daniel se ve mejor:

Set(3,5).flatMap(k => 0 until n by k).sum 
+2

¿No sería mejor usar 'flatMap'? –

+4

De hecho, si lo hace, incluso puede acortarlo a 'Set (3,5) .flatMap (k => 0 hasta n por k) .sum'. –

+0

Agradable. Muy ... err .. aritmética :) – pedrofurla

4

El código de trabajo más cerca de lo que has hecho es lo siguiente:

object Euler { 
    def main(args : Array[String]) { 
     val answer = (1 until 10).foldLeft(0) ((result, current) => 
      if ((current % 3 == 0) || (current % 5 == 0)) 
       result + current 
      else 
       result 
     ) 

     println(answer) 
    } 
} 
Cuestiones relacionadas