2012-11-08 16 views
12

Guardando il codice sorgente per every? chiarisce il motivo per cui Perché dovrebbe essere (ogni? Stringa? []) Vero?

(every? string? []) => true 

Questo perché every? è implementato in modo ricorsivo e utilizza (nil? (seq coll)) per terminare la ricorsione. Ma la mia domanda è, che senso ha questo comportamento? Sono inciampato in quello.

ho risolto il mio problema utilizzando

(and (seq x) (every? string? x)) 
+9

È vero che ogni elemento di un vettore vuoto è una stringa. –

+3

'every?' È scritto da una persona con atteggiamento positivo – Ankur

risposta

9

Perché funziona allo stesso livello del quantificatore di forall. Cioè, inizialmente si presume vero e ogni applicazione del predicato è un tentativo di dimostrarlo falso. Il quantificatore esistenziale (che è chiamato some piuttosto che any? in Clojure per motivi di incoerenza) funziona in modo opposto: si presume falso e ogni applicazione del predicato è un tentativo di dimostrarlo vero.

In altre parole, è sempre vero che qualcosa è vero per tutto nessuno, ed è sempre falso che qualcosa sia vero per alcuni di nessuno.

+0

Puoi per favore collegare a un riferimento che spieghi come questo abbia senso? Presumo che questa sia la roba di Set Theory, ma non è affatto intuitiva. – noahlz

+0

Questo ha più a che fare con la logica formale che con la teoria degli insiemi (anche se è possibile introdurlo nella teoria degli insiemi). Questo è in realtà abbastanza intuitivo se si pensa alle negazioni come nella risposta di Pawels - "qualcosa è vero per tutto x in X" equivale a dire "non c'è x in X per cui qualcosa non è vero". "ogni?" essere falsi per i seq vuoti renderebbe anche molte espressioni eccessivamente complicate. – Cubic

+0

Paweł ha pubblicato un link. – 0dB

0

O meglio chiedere perché dovrebbe (every? string? []) resa false? Entrambe le varianti portano a una risposta sbagliata in determinati requisiti. Ma ovviamente è meglio che ottenere un errore nella sequenza vuota.

+0

Potrebbe essere ovviamente meglio ottenere un errore su una sequenza vuota; potrebbe non essere effettivamente migliore! Abbiamo avuto un po 'di codice in produzione a causa di quello stesso comportamento con, se ben ricordo, una piega in Scala. Non dico che saltare in aria sia sbagliato, solo che c'è qualche situazione in cui qualsiasi dato comportamento ti farà male. In realtà, vuoi un sistema di tipi abbastanza potente da impedirti di eseguire queste operazioni su liste vuote. –

+0

Yay per Haskell, che apprezzo e ho imparato da, ma, mi attaccherò a Clojure e cercherò di affrontare problemi a volte sorprendenti come questo :-) – 0dB

+1

@ 0dB Non è sorprendente se hai familiarità con la quantificazione universale, e penso che persino gli Haskell potrebbero dirti che avere tipi diversi per le liste vuote e non vuote è folle. – Cubic

8

Funzione every? implementa il universal quantification.

Da (every? string? []) => false ne conseguirebbe che [] contiene un oggetto x tale che (string? x) => false (questo è come funziona negation di quantificatore universale). Ciò porta alla contraddizione, quindi (every? string? []) deve restituire true.

7

È definito così in matematica e c'è una buona ragione per quello. Sarebbe un disastro di consistenza se every? fosse stato definito in un altro modo.

Con la definizione corrente il risultato della concatenazione soddisfa every? foo se e solo se tutte le raccolte concatenate soddisfano anche every? foo. Rendendo every? ritorno false su liste vuote spezzerebbe questo comodo equivalenza e una miriade di altri (ad esempio la rimozione di un elemento a volte portare a commutazione every? da true a false.)

+0

Mi piace anche questa risposta per essere "buon senso" :-) – 0dB

0

mia risposta è vacuous truth.
Wiki copre bene quindi mi limiterò a citare l'attuale primo paragrafo:

In matematica e la logica, una verità vuota è una dichiarazione che afferma che tutti i membri del set vuoto hanno una certa proprietà. Per esempio , l'affermazione "tutti i telefoni cellulari nella stanza sono spenti" sarà vero ogni volta che non ci sono telefoni cellulari nella stanza. In questo caso , l'affermazione "tutti i telefoni cellulari nella stanza sono attivati" sarebbe vere pure, così come la combinazione dei due: "tutti i telefoni della cella nella stanza sono accesi e spenti".

0

Arriva ai valori di identità per le operazioni "and" e "or". Per qualsiasi B booleano, è il caso che B abbia lo stesso valore di B & T. Quindi, un "e" di nessun valore deve essere vero. Allo stesso modo, è anche vero che lo B | F ha lo stesso valore di B, quindi un "o" di nessun valore è falso.

In modo simile, il prodotto di nessun termine è 1 e la somma di nessun termine è 0, ovvero i valori di identità per gli operatori di moltiplicazione e di addizione.

Problemi correlati