2014-12-04 4 views
5

Właśnie zacząłem grać z Haskellem przy użyciu GHCI. REPL posiada szereg wbudowanych funkcji. Na przykład and i or, aby zmniejszyć listy logiczne [Bool] -> Bool. To było dość zaskakujące, że dla pustych list to:Funkcje "puste" i "lub" na pustych listach

Prelude> and [] 
True 
Prelude> or [] 
False 

Czy istnieją jakieś dobre powody takiego zachowania? Oczekiwałem raczej odwrotnych rezultatów. Nawet False w obu przypadkach wydaje mi się bardziej uzasadnione.

Odpowiedz

9

W obu przypadkach dają one element neutralny działania:

True && x == x 
False || x == x 

Dla każdej operacji, to jest wartość logiczna, że ​​„nic nie robi”, co czyni go idealnym wyborem do powrotu, gdy pojawi się nic, co wejście!

Jest to ten sam sposób, w jaki sum i product rozpoczynają się odpowiednio od 0 i .

+0

Dzięki. Teraz to ma sens. :) –

7

Jest to łatwiejsze do zrozumienia, jeśli zamiast tego rozmawiamy o all, any :: (a -> Bool) -> [a] -> Bool. Intuicyjnie:

  1. all p przeszukuje listę znaleźć kontrprzykład do orzecznika p. Zwraca False wtedy i tylko wtedy, gdy taki przeciwprzykład zostanie znaleziony.
  2. any p wyszukuje listę, aby znaleźć przykład przykład, który spełnia predykat p. Zwraca True wtedy i tylko wtedy, gdy taki przykład zostanie znaleziony.

Dlatego:

  1. all p [] jest prawdą, ponieważ pusta lista nie zawiera żadnych kontrprzykładów do p.
  2. any p [] jest fałszywa, ponieważ pusta lista nie zawiera przykładów spełniających p.

zauważyć, że:

and == all id 
or == any id 

Więc to rozumowanie rozciąga się and, or :: [Bool] -> Bool.

Należy pamiętać, że logika matematyczna często również działa tak:

-- "All unicorns are Argentinian." 
∀x. unicorn(x) → argentinian(x) 

To twierdzenie jest prawdziwe, czy jednorożce nie istnieją. Początkujący logicy też się tym mylą ...

+0

Dzięki. Analogie "every" i "any" są całkiem przydatne. Myślałem o tych funkcjach jako 'fold'. Cholera, teraz nie wiem, czyj odpowiedź jest lepsza :) –