2012-07-03 2 views
2

장난감 언어에 대해 가변적 인 sum 함수를 정의합니다. 인자없이 호출하여 0을 반환하는 것이 당연한 것처럼 보이지만 실제 개의 언어 (및 해당 구현체)는 서로 동의하지 않습니다.variable-arity sum 함수에 대한 올바른 동작

반환하는 0이 예외를 throw하는 것보다 정확하지 않은 유스 케이스가 있습니까?

답변

5

수학적으로 말하면, 숫자가없는 합인 empty sum은 0으로 정의됩니다. 수학적으로 정확하려면 0을 반환하는 것이 올바른 선택입니다. 이 경우에 예외를 던지면 잠재적으로 함수의 사용이 복잡해질 것입니다. 왜냐하면 여러분은 0 인수를 어떻게 든 제공 할 경우를 대비하여 try/catch를 사용하여 각 호출을 보호해야하기 때문입니다.

희망이 도움이됩니다.

0

언어가 동적으로 입력되고 숫자가 아닌 유형 (예 : Python에서와 같이 문자열을 연결할 수 있음)에서 +을 사용할 수 있다고 가정 해 보겠습니다. 그런 다음 비어있는 합계는 개념적으로 합계되는 것의 종류와 관련하여 모호합니다. 숫자의 경우 숫자 0, 문자열의 경우 [], 목록의 경우 결과를 원할 수 있습니다.

언어가 이와 비슷한 경우, 어쨌든 0을 반환하고 sum(things)+other_thing이 숫자를 제외하고 sum(things together with other_thing)과 같지 않음을 (2) 예외를 던집니다. (3) ""와 같이 숫자에 추가 할 때 0과 같이 동작하는 특수 값을 반환하도록 선택할 수 있습니다. (4) 어쨌든 0을 반환하고 0+ ""같음 ""또는 이와 비슷한 것을 말하십시오. 장난감이 아닌 다른 언어의 위험이 조금이라도 적은 경우 # 4하지 마십시오.

아, 또 다른 관련 사례가 있습니다. 언어가 정적으로 입력되었지만 강력한 유형 추론 메커니즘이 있다고 가정합니다. 그런 다음 숫자가 합산되지 않고 문자열이 합산되는 것을 구별 할 수 있으며 두 경우에 서로 다른 결과를 반환 할 수 있습니다. (그러나 당신은 장난감 언어에 대해 신경 쓰지 않을 것이라고 생각하는 모든 작업을하기 위해 꽤 정교한 타입의 시스템이 필요합니다.)

+1

그런 경우 올바른 대답은 ID를 반환하는 것입니다 이진 가산 연산자가 무엇이든 관계가 없습니다. "정체성을 반환하라"는 말처럼 예외를 던져야하는 것은 아닙니다. – templatetypedef

+0

문제는 바이너리 연산자가 하나의 identity 요소를 가지지 않을 수도 있다는 것입니다. 숫자를 추가하고 문자열을 연결하면 예를 들어 문자열은 연결되지 않습니다. (당신은 정체성 요소가없는 어떤 것이 "+"라고 불려지거나 가변적 인 버전이 "합"이라고 불려서는 안되며, 당신이 옳을 수도 있지만 그것은 별개의 문제라고 주장 할 수도 있습니다.) –

+2

그러나 그것들은 두 개의 다른 연산자입니다 - 하나는 정수에 대해 정의되고, 하나는 문자열에 대해 정의됩니다. 연산자는 오버로드되지만 각 개별 연산자에는 최종 단일 신원 요소가 있습니다. – templatetypedef