tutorial programming learn koans functional exercises codecademy scala functional-programming

programming - ¿Scala tiene guardias?



scala programming (4)

La respuesta simple es no. No es exactamente lo que está buscando (una coincidencia exacta para la sintaxis de Haskell). Usaría la declaración de "coincidencia" de Scala con un guardia y proporcionaría un comodín, como:

num match { case 0 => "Zero" case n if n > -1 =>"Positive number" case _ => "Negative number" }

Comencé a aprender scala hace unos días y al aprenderlo, lo estoy comparando con otros lenguajes de programación funcionales como ( Haskell , Erlang ) con los que tenía cierta familiaridad. ¿Scala tiene secuencias de guard disponibles?

Pasé por la comparación de patrones en Scala, pero ¿hay algún concepto equivalente a guardias con lo otherwise y todo?


Me encontré con este post buscando cómo aplicar guardias a las coincidencias con múltiples argumentos, no es realmente intuitivo, así que estoy agregando un ejemplo aleatorio aquí.

def func(x: Int, y: Int): String = (x, y) match { case (_, 0) | (0, _) => "Zero" case (x, _) if x > -1 => "Positive number" case (_, y) if y < 0 => "Negative number" case (_, _) => "Could not classify" } println(func(10,-1)) println(func(-10,1)) println(func(-10,0))


Sí, hay guardias de patrón. Se usan así:

def boundedInt(min:Int, max: Int): Int => Int = { case n if n>max => max case n if n<min => min case n => n }

Tenga en cuenta que en lugar de una cláusula de otherwise contrario, simplemente especifique el patrón sin una protección.


Sí, usa la palabra clave if . Desde la sección de Clases de Casos de A Tour of Scala, cerca del fondo:

def isIdentityFun(term: Term): Boolean = term match { case Fun(x, Var(y)) if x == y => true case _ => false }

(Esto no se menciona en la página de coincidencia de patrones , tal vez porque el Tour es una descripción general rápida).

En Haskell, de lo otherwise es en realidad solo una variable vinculada a True . Por lo tanto, no agrega ningún poder al concepto de coincidencia de patrones. Puede obtenerlo simplemente repitiendo su patrón inicial sin el guardia:

// if this is your guarded match case Fun(x, Var(y)) if x == y => true // and this is your ''otherwise'' match case Fun(x, Var(y)) if true => false // you could just write this: case Fun(x, Var(y)) => false