2011-12-15 8 views

Respuesta

16

Los guardias son los when partes. Lo que el compilador te dice es que no puede decir si tu coincidencia es exhaustiva (cubre todos los casos posibles), pero podría no serlo. El compilador realmente no puede decir con certeza, porque la exhaustividad es indecidible para expresiones arbitrarias. El compilador simplemente calcula que deberías tener al menos un patrón sin guardia ya que cuando la coincidencia es exhaustiva, un guardia en el último caso sería redundante.

Como sabe que su coincidencia es exhaustiva, el compilador tiene básicamente razón. Tu segundo guardia es redundante. Puede dejarlo sin ninguna diferencia de significado:

match z with 
| y when List.length z = 0 -> ... 
| y -> ... 

Esto hará que el compilador sea feliz.

Me gusta esta advertencia; Me ha encontrado algunos errores de lógica a lo largo de los años.

Si este código no es sólo un ejemplo, pero es realmente lo que escribió, sería mucho más idiomática para escribir así:

match z with 
| [] -> ... 
| head :: tail -> ... 

Es también un poquito más eficiente ya que ganó' Me molesto en calcular la longitud de la lista y luego descartar el resultado.

Si no es necesario desestructurar la lista, puede hacer que sea más sencillo todavía:

if z = [] then 
    ... 
else 
    ... 
+0

Gracias Jeffrey. Realmente aclaró las cosas y me ayudó a aprender a escribir código más limpio (esp con las declaraciones if). :) – Aspen

Cuestiones relacionadas