장난감 언어에 대해 가변적 인 sum
함수를 정의합니다. 인자없이 호출하여 0
을 반환하는 것이 당연한 것처럼 보이지만 실제 개의 언어 (및 해당 구현체)는 서로 동의하지 않습니다.variable-arity sum 함수에 대한 올바른 동작
반환하는 0이 예외를 throw하는 것보다 정확하지 않은 유스 케이스가 있습니까?
장난감 언어에 대해 가변적 인 sum
함수를 정의합니다. 인자없이 호출하여 0
을 반환하는 것이 당연한 것처럼 보이지만 실제 개의 언어 (및 해당 구현체)는 서로 동의하지 않습니다.variable-arity sum 함수에 대한 올바른 동작
반환하는 0이 예외를 throw하는 것보다 정확하지 않은 유스 케이스가 있습니까?
수학적으로 말하면, 숫자가없는 합인 empty sum은 0으로 정의됩니다. 수학적으로 정확하려면 0을 반환하는 것이 올바른 선택입니다. 이 경우에 예외를 던지면 잠재적으로 함수의 사용이 복잡해질 것입니다. 왜냐하면 여러분은 0 인수를 어떻게 든 제공 할 경우를 대비하여 try/catch를 사용하여 각 호출을 보호해야하기 때문입니다.
희망이 도움이됩니다.
언어가 동적으로 입력되고 숫자가 아닌 유형 (예 : Python에서와 같이 문자열을 연결할 수 있음)에서 +
을 사용할 수 있다고 가정 해 보겠습니다. 그런 다음 비어있는 합계는 개념적으로 합계되는 것의 종류와 관련하여 모호합니다. 숫자의 경우 숫자 0, 문자열의 경우 [], 목록의 경우 결과를 원할 수 있습니다.
언어가 이와 비슷한 경우, 어쨌든 0을 반환하고 sum(things)+other_thing
이 숫자를 제외하고 sum(things together with other_thing)
과 같지 않음을 (2) 예외를 던집니다. (3) ""와 같이 숫자에 추가 할 때 0과 같이 동작하는 특수 값을 반환하도록 선택할 수 있습니다. (4) 어쨌든 0을 반환하고 0+ ""같음 ""또는 이와 비슷한 것을 말하십시오. 장난감이 아닌 다른 언어의 위험이 조금이라도 적은 경우 # 4하지 마십시오.
아, 또 다른 관련 사례가 있습니다. 언어가 정적으로 입력되었지만 강력한 유형 추론 메커니즘이 있다고 가정합니다. 그런 다음 숫자가 합산되지 않고 문자열이 합산되는 것을 구별 할 수 있으며 두 경우에 서로 다른 결과를 반환 할 수 있습니다. (그러나 당신은 장난감 언어에 대해 신경 쓰지 않을 것이라고 생각하는 모든 작업을하기 위해 꽤 정교한 타입의 시스템이 필요합니다.)
그런 경우 올바른 대답은 ID를 반환하는 것입니다 이진 가산 연산자가 무엇이든 관계가 없습니다. "정체성을 반환하라"는 말처럼 예외를 던져야하는 것은 아닙니다. – templatetypedef
문제는 바이너리 연산자가 하나의 identity 요소를 가지지 않을 수도 있다는 것입니다. 숫자를 추가하고 문자열을 연결하면 예를 들어 문자열은 연결되지 않습니다. (당신은 정체성 요소가없는 어떤 것이 "+"라고 불려지거나 가변적 인 버전이 "합"이라고 불려서는 안되며, 당신이 옳을 수도 있지만 그것은 별개의 문제라고 주장 할 수도 있습니다.) –
그러나 그것들은 두 개의 다른 연산자입니다 - 하나는 정수에 대해 정의되고, 하나는 문자열에 대해 정의됩니다. 연산자는 오버로드되지만 각 개별 연산자에는 최종 단일 신원 요소가 있습니다. – templatetypedef