- Der Rückgabewert der Funktion
Enum.all? für eine leere Liste ist true
- Auch Haskells
all, Pythons all und Clojures every? verhalten sich genauso
- Wenn für eine leere Liste
true zurückgegeben wird, ist die Implementierung einfacher
true && f(elem1) && f(elem2) ...
- Aber sie ist nicht nur aus Bequemlichkeit in der Implementierung so umgesetzt
- Sie ist so implementiert, dass sie der Definition der vakuosen Wahrheit in der Logik entspricht
- Um vakuose Wahrheit zu verstehen, muss man sich materiale Implikationen ansehen
- Wenn p falsch ist, dann ist p → q immer wahr
- „Wenn die Freiheitsstatue in Seoul steht, dann steht der Eiffelturm in Pohang“ ist wahr
- Denn p, also „Die Freiheitsstatue steht in Seoul“, ist falsch
- Dass bei einer solchen materialen Implikation p falsch ist und die Aussage deshalb immer wahr wird, nennt man vakuose Wahrheit
- Bei der vakuosen Wahrheit wird für die leere Menge (
set) jede beliebige Aussage wahr
- Nehmen wir als Beispiel: „Alle Mobiltelefone im Zimmer sind ausgeschaltet“
- x sind alle Dinge im Zimmer
- P(x) ist „x ist ein Mobiltelefon“
- Q(x) ist „x ist ausgeschaltet“
- Weil x leer ist, ist P(x) falsch. Durch vakuose Wahrheit ist die Aussage immer wahr.
- Deshalb ist der Rückgabewert der Funktion
Enum.all? für eine leere Liste true.
3 Kommentare
Wieder was gelernt, danke fürs Teilen.
Der mathematische bzw. informatiktheoretische Ansatz mag zwar so sein, aber beim Coden ist es trotzdem verwirrend, daher scheint es besser, das nicht aktiv so zu nutzen, haha.
Besonders in
if-Anweisungen führt es oft zu Verwirrung, weil eine leere Liste alsFalseerkannt wird.In Python gilt Folgendes:
all([]) == True
all([[]]) == False
Deshalb bevorzuge ich es, Bedingungen für die Personen, die den Code lesen werden, explizit zu formulieren.
Also eher
if len(arr) == 0:alsif not arr:.Ein weiteres Beispiel wäre
if flag is False:stattif not flag:.Nach meinem Maßstab würde es den Code besser lesbar machen,
all([[]])alsall([Bedingungsausdruck for ... in []])umzuschreiben.Ah~ in Python, leere Listen sind
falsy values, daher ist der Rückgabewert vonall([[]])False. Da sichTruthy- undFalsy-Werte je nach Sprache unterscheiden, mache ich beim Arbeiten mit anderen Sprachen manchmal solche Fehler. :)Zur Referenz: In Elixir sind nur
niloderfalseFalsy values, daher ergibtEnum.all?([[]])den Werttrue.