12P by ohyecloudy 11달전 | favorite | 댓글 3개
  • 빈 리스트에 대한 Enum.all? 함수 리턴 값이 true
    • Haskell의 all, Python의 all, Clojure의 every? 함수도 똑같이 동작
  • 빈 리스트에 대해 true를 리턴하면 구현하기 쉬움
    • true && f(elem1) && f(elem2) ...
    • 하지만 구현상 편의 때문에 저렇게 구현한 게 아님
    • 논리학의 공허참(vacuous truth) 정의에 부합하게 구현한 것임
  • 공허참을 이해하기 위해선 실질 조건문을 살펴봐야 함
    • p가 거짓이면 p → q는 항상 참
    • “자유의 여신상이 서울에 있다면 에펠탑은 포항에 있다”는 참
      • p인 “자유의 여신상이 서울에 있다”가 거짓이기 때문
    • 이런 실질 조건문에서 p가 거짓이라 무조건 참이되는 걸 공허참이라고 함
  • 공허참에서는 비어있는 집합(set)에 대해서는 어떠한 명제도 참이 된다
    • '방 안의 모든 휴대폰이 꺼져 있다'를 예로 들면
    • x는 방에 있는 모든 것
    • P(x)는 'x는 휴대폰이다'
    • Q(x)는 'x는 꺼져있다'
    • x가 비어 있기 때문에 P(x)는 거짓. 공허참에 의해 항상 참이 된다.
  • 그래서 비어 있는 리스트에 대한 Enum.all? 함수의 리턴 값은 true가 된다.

배워갑니다ㅎ공유 감사해요
수학적, 컴공적 접근은 이래도 코딩땐 헷갈려서 활용 안하는게 좋아보여요ㅋㅋ
특히 if문에서는 빈 리스트를 False로 인식해서 많이 헷갈립니다

파이썬 기준 아래와 같습니다.
all([]) == True
all([[]]) == False

저는 그래서 코드를 읽을 사람을 위해 조건을 명시적으로 작성하는 방향을 선호합니다.
if not arr: 보다는 if len(arr) == 0: 처럼요.
if not flag: 대신 if flag is False: 같은 예시도 있겠네요.

제 기준에 따르면 all([[]]) 는 all([조건식 for ... in []]) 로 고쳐 쓰는 게 코드를 더 잘 읽히게 해줄 테고요.

아~ python에서는 빈 리스트가 falsy values라서 all([[]]) 리턴 값이 False가 되는거군요. 언어마다 Truthy, Falsy values가 달라서 다른 언어를 할 때, 한 번씩 실수를 하네요. :)

참고로 Elixir는 nil 또는 false만 Falsy values라서 Enum.all?([[]]) 값은 true가 나와요.