2016-11-08 2 views
2

저는 라켓 박사와 라켓 박사님을 사용하고 있습니다.왜이 경우에 andmap이 #t를 반환합니까?

andmap이라는 내장 함수가 있습니다.

내장 andmap 버전의 작동이 방법 :

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

#t 

기능 번호는 일반적으로 작동합니다 이런 이유

(number? 3) 
> #t 

(number? '()) 
>#f 

나는하지 않습니다는 :

(andmap number? '()) 

> #t 

나는 결과가 거짓이라고 생각한다.

문서는 말한다 :

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

왜 그 감각을 만들 것? 나는 그것을 보지 않는다. 나는 언어의 디자인 선택, 특히 라켓과 같은 새로운 디자인 선택에 대해 궁금합니다.

+2

이것은 'X에서 forall x : p (x)'가'p '가 무엇이든 관계없이'X '가 비어있을 때와 똑같은 방식으로 작동한다는 점에 유의하십시오. 이것은 [vacous truth]로 알려져 있습니다 (https://en.wikipedia.org/wiki/Vacuous_truth. – sepp2k

+1

) 또한 가치있는 것을 위해, Racket은 거의 "새롭지 않습니다"- 하스켈과 파이썬만큼 오래되었습니다. Java와 Ruby보다 조금 * 오래된 *;) –

답변

7

이유 (andmap pred '()) 반환 #t 정확히 (and) 반환 #t 같은 이유입니다 ...하지만 그것이 아마도 가장 유용한 설명이 아니다? 진짜 답은 0 첨가제 정체성이다 좋아하고 1은 곱셈의 정체성이다, #t 논리에 대한 정체성 때문이다 AND :

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

생각이 여기 결합 될 때 신원 출력을 변경하지 것입니다 어떤 주어진 입력. 예를 들어 (+ 0 x)은 항상 x이고, (* 1 x)은 항상 x이며, (and #t x)은 항상 x이고, (or #f x)은 항상 x입니다. 이 반응식에서 목록을 합계 관용적 방법 잘 협력 때문에 이것은 (apply + lst), 갖도록 유용한 특성이다

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

마찬가지로 (apply * lst) 별도 product 함수 대신에 사용될 수있다. andor 연산자는 apply과 함께 사용할 수 없습니다. 단락되어 함수 대신 매크로로 구현되기 때문에 andmapormap이 해당 기능을 대신 구현합니다.


이 인수가 사용자에게 충분히 만족스럽지 않은 것으로 보이는 경우, 일반 영어 정의에서도 이러한 결론을 생각해 볼 수 있습니다. andmap 작업은 무엇입니까 입니까? "이 목록에있는 모든 요소가 술어를 만족합니까?"빈 목록에서 대답은 항상 일 것입니다. 주어진 주장에 반례를 일으킬 수 없다는 가정하에 말입니다. 반면

ormap는 이중입니다 : "이 목록의 요소 중 적어도 하나는 조건을 만족합니까?"그렇게 하나를 생산, 전혀 요소를 생산하는 것은 불가능하기 때문에 대답은 항상, 아니될 것입니다 술어를 만족시키는 것은 확실히 불가능합니다.

관련 문제