이유 (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
함수 대신에 사용될 수있다. and
및 or
연산자는 apply
과 함께 사용할 수 없습니다. 단락되어 함수 대신 매크로로 구현되기 때문에 andmap
및 ormap
이 해당 기능을 대신 구현합니다.
이 인수가 사용자에게 충분히 만족스럽지 않은 것으로 보이는 경우, 일반 영어 정의에서도 이러한 결론을 생각해 볼 수 있습니다. andmap
작업은 무엇입니까 은입니까? "이 목록에있는 모든 요소가 술어를 만족합니까?"빈 목록에서 대답은 항상 예 일 것입니다. 주어진 주장에 반례를 일으킬 수 없다는 가정하에 말입니다. 반면
는 ormap
는 이중입니다 : "이 목록의 요소 중 적어도 하나는 조건을 만족합니까?"그렇게 하나를 생산, 전혀 요소를 생산하는 것은 불가능하기 때문에 대답은 항상, 아니될 것입니다 술어를 만족시키는 것은 확실히 불가능합니다.
이것은 'X에서 forall x : p (x)'가'p '가 무엇이든 관계없이'X '가 비어있을 때와 똑같은 방식으로 작동한다는 점에 유의하십시오. 이것은 [vacous truth]로 알려져 있습니다 (https://en.wikipedia.org/wiki/Vacuous_truth. – sepp2k
) 또한 가치있는 것을 위해, Racket은 거의 "새롭지 않습니다"- 하스켈과 파이썬만큼 오래되었습니다. Java와 Ruby보다 조금 * 오래된 *;) –