2016-11-08 2 views
2

Ich benutze Racket und Dr. Racket.Warum undmap gibt #t in diesem Fall zurück?

Es gibt eine eingebaute Funktion namens andmap.

Das Werk integrierte Version von andmap auf diese Weise:

> (andmap positive? '(1 2 3)) 

#t 

Funktionsnummer funktioniert in der Regel wie:

(number? 3) 
> #t 

(number? '()) 
>#f 

ich nicht, warum dies geschieht:

(andmap number? '()) 

> #t 

Ich denke, das Ergebnis sollte falsch sein.

Die Dokumentation sagt:

*If the lsts are empty, then #t is returned.* 

Warum auf der Erde, die Sinn machen würde? Ich sehe es nicht. Ich bin neugierig auf die Designauswahl von Sprachen, besonders auf neue, wie Racket.

+2

Beachten Sie, dass dies in Logiken genau so funktioniert, dass 'forall x in X: p (x)' wahr ist, unabhängig davon, was 'p' ist, wenn' X' leer ist. Dies ist bekannt als [vacuous truth] (https://en.wikipedia.org/wiki/Vacous_truth. – sepp2k

+1

Auch, was es wert ist, Racket ist kaum "neu" -es ist fast so alt wie Haskell und Python, und es ist ein bisschen * älter * als Java und Ruby.;) –

Antwort

7

Der Grund (andmap pred '()) liefert #t ist genau der gleiche Grund (and) gibt #t zurück ... aber das ist vielleicht nicht die nützlichste Erklärung, ist es? Die wirkliche Antwort ist, dass #t ist die Identität für logische UND, genau wie 0 die additive Identität ist und 1 die multiplikative Identität:

> (+) 
0 
> (*) 
1 
> (and) 
#t 
> (or) 
#f 

Die Idee dabei ist, dass die Identität nicht den Ausgang ändern, wenn sie kombiniert mit irgendeiner gegebenen Eingabe. Zum Beispiel ist (+ 0 x) immer x und (* 1 x) ist immer x, (and #t x) ist immer x und (or #f x) ist immer x. Dies ist eine nützliche Eigenschaft zu haben, da es gut mit der idiomatischen Weise kooperiert eine Liste in Schema zusammenzuzufassen, (apply + lst):

> (apply + '(1 2 3)) 
6 
> (apply + '()) 
0 

In ähnlicher Weise kann (apply * lst) anstelle eine separaten product Funktion verwendet werden. Die Operatoren and und or können nicht mit apply verwendet werden, da sie kurzgeschlossen sind und daher als Makros anstelle von Funktionen implementiert sind, aber andmap und ormap stattdessen diese Funktionalität implementieren.


Wenn dieses Argument scheint nicht genug, um Sie erfüllt, können Sie auch darüber nachdenken, diese Dinge in ihrer Ebene englischen Definitionen zu dem gleichen Ergebnis zu kommen. Was bedeutet die andmap Operation bedeutet? Nun, es stellt sich eine Frage: "Erfüllen alle Elemente in dieser Liste ein Prädikat?" In einer leeren Liste ist die Antwort immer ja, vorausgesetzt, dass Sie kein Gegenbeispiel zu diesem Anspruch erstellen können.

Im Gegensatz dazu ist ormap die dual: „Hat zumindest eines der Elemente in dieser Liste ein Prädikat erfüllen?“ Die Antwort wird immer keine, da es unmöglich ist, überhaupt kein Element zu erzeugen, so dass man die Herstellung das, das ein Prädikat erfüllt, ist sicher unmöglich.

Verwandte Themen