Reconocimientos de patrones II
El reconocimiento de patrones lo podemos utilizar con números, booleanos, objetos y con listas
import scala.annotation.tailrec
object Listas {
@tailrec
final def sumar(l:List[Int])(acc:Int):Int = {
l match {
case List() => acc
case h :: t => sumar(t)(h + acc)
case _ => throw new Exception("This is not a list")
}
}
def cuadrado(l:List[Int])(acc:List[Int]):List[Int] = {
l match {
case List() => acc
case h :: t => cuadrado(t)(acc :+ h*h)
}
}
def mapeo(l:List[Int])(f: Int => Int)(acc:List[Int]):List[Int] = {
l match {
case List() => acc
case x :: xs => mapeo(xs)(f)(acc :+ f(x))
}
}
def filtro(l:List[Int])(f:Int => Boolean)(acc:List[Int]):List[Int] = {
l match {
case List() => acc
case h :: t => {
if (f(h)) filtro(t)(f)(acc :+ h)
else filtro(t)(f)(acc)
}
}
}
def main(arr:Array[String]):Unit = {
val l = List(1,2,3,4,5)
println(sumar(l)(0))
println(cuadrado(l)(List()))
println(mapeo(l)(x => x*x)(List()))
println(l.map(x=>x*x))
println(mapeo(l)(x => x*x*x)(List()))
println(l.map(x => x*x*x))
println(filtro(l)(x => x%2 == 0)(List()))
println(l.filter(x => x%2 == 0))
}
}
En el caso de listas usamos los siguientes patrones:
- List() para reconocer la lista vacia
- h :: t para reconocer las listas no vacias, en el cual h es la cabeza y t es la cola
Revisar https://docs.scala-lang.org/tour/pattern-matching.html