12 puntos por ohyecloudy 2023-12-17 | 3 comentarios | Compartir por WhatsApp
  • 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

 
tapu1125 2023-12-18

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 como False, eso confunde bastante.

En Python, es así:
all([]) == True
all([[]]) == False

 
p0rygon 2023-12-18

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 como if len(arr) == 0:.
Y en lugar de if not flag:, podría ser un ejemplo como if flag is False:.

Según mi criterio, para all([[]]) también ayudaría a que el código se entienda mejor reescribirlo como all([condición for ... in []]).

 
ohyecloudy 2023-12-18

Ah~ en Python, como las listas vacías son valores falsy, el valor de retorno de all([[]]) termina siendo False. Como los valores truthy y falsy cambian según el lenguaje, a veces cometo errores cuando uso otro lenguaje. :)

Como referencia, en Elixir solo nil o false son valores falsy, así que Enum.all?([[]]) da true.