- El valor de retorno de la función
Enum.all? para una lista vacía es true
- Las funciones
all de Haskell, all de Python y every? de Clojure funcionan exactamente igual
- Si se devuelve true para una lista vacía, es fácil de implementar
true && f(elem1) && f(elem2) ...
- Pero no está implementado así solo por conveniencia
- Está implementado de esa manera para ajustarse a la definición lógica de verdad vacía (
vacuous truth)
- Para entender la verdad vacía, hay que revisar el condicional material
- Si p es falso, entonces p → q siempre es verdadero
- “Si la Estatua de la Libertad estuviera en Seúl, entonces la Torre Eiffel estaría en Pohang” es una proposición verdadera
- Porque p, “la Estatua de la Libertad está en Seúl”, es falso
- En este tipo de condicional material, cuando p es falso y por eso la proposición se vuelve automáticamente verdadera, eso se llama verdad vacía
- En la verdad vacía, cualquier proposición sobre un conjunto vacío resulta verdadera
- Tomemos como ejemplo: “Todos los teléfonos celulares de la habitación están apagados”
- x representa todas las cosas que hay en la habitación
- P(x) es “x es un teléfono celular”
- Q(x) es “x está apagado”
- Como x está vacío, P(x) es falso. Por la verdad vacía, la proposición siempre resulta verdadera.
- Por eso, el valor de retorno de la función
Enum.all? para una lista vacía es true.
3 comentarios
Aprendí algo nuevo jaja, gracias por compartirlo.
Aunque el enfoque matemático y de ciencias de la computación sea así, al programar puede ser confuso, así que parece mejor no usarlo mucho jaja
Sobre todo en los
if, como una lista vacía se interpreta comoFalse, eso confunde bastante.En Python, es así:
all([]) == True
all([[]]) == False
Por eso, personalmente prefiero escribir las condiciones de forma explícita para quien vaya a leer el código.
En vez de
if not arr:, algo comoif len(arr) == 0:.Y en lugar de
if not flag:, podría ser un ejemplo comoif flag is False:.Según mi criterio, para
all([[]])también ayudaría a que el código se entienda mejor reescribirlo comoall([condición for ... in []]).Ah~ en Python, como las listas vacías son valores falsy, el valor de retorno de
all([[]])termina siendoFalse. Como los valores truthy y falsy cambian según el lenguaje, a veces cometo errores cuando uso otro lenguaje. :)Como referencia, en Elixir solo
nilofalseson valores falsy, así queEnum.all?([[]])datrue.