2016-10-31 3 views
4

일반적으로 모든 숫자 형식의 값을 취할 수 있으며 숫자 형식의 0이 아닌 값으로 나누고 합리적인 결과를 얻을 수 있습니다.일반 숫자 부분

212.7/6 // Double = 35.449999999999996 
77L/2.1F // Float = 36.666668 

한 가지 예외는, 내가 찾은 것을, 우리는 분수 형 (Float 또는 Double)와 BigInt을 혼합 할 수 있다는 것입니다.

그러나 제네릭 분야에서는 IntegralFractional 유형의 흥미로운 차이점이 있습니다.

// can do this 
def divideI[I](a: I, b: I)(implicit ev: Integral[I]) = ev.quot(a,b) 

// or this 
def divideF[F](a: F, b: F)(implicit ev: Fractional[F]) = ev.div(a,b) 

// but not this 
def divideN[N](a: N, b: N)(implicit ev: Numeric[N]) = ev.???(a,b) 

난이, 진짜 문제가되는 이유에 대한 궁금입니다 동안이 제한을 회피하기 위해 가능한 해결 방법의 일종이되어 있습니까?

답변

1

나의 이해는 이러한 특성이 정의 된 작업에 따라 폐쇄 세트 설명이다 :

Fractional

div 추가

Numericnegate, times, minus, plus에서 폐쇄 (즉 plus, minus, times, negate, div),

Integralquotrem (즉, plus, minus, times, negate, quot, rem).

왜 그걸 회피하고 싶습니까? 정수 나누기 및 부동 부문 그래서 모든 Numerics 공통 분할 작업을 공유하지 않는 두 매우 다른 작업 때문에 인간은 그들을 모두 생각할 수도 있지만

+0

사용자 (호출 코드)를 'Integral' 또는'Fractional'으로 제한하지 않고 기본 유형으로 수행 할 수있는 것과 동일한 (다소간) 간단한 수학 연산을 수행 할 수 있기를 바랍니다. 구현을 숨기고 (결과를 얻기위한 수학 연산) 사용자에게 가장 넓은 입력 옵션 ('Numeric')을 제공하고 싶습니다. 수학 연산이 '+', '-'및 '*'로 제한되는 경우 쉽게 할 수 있습니다. 그것은'/'가 그 세트에 포함되지 않는 것은 이상하게 보입니다. – jwvh

3

이유는,이다 "부문."

해결 방법은 Integral/Integral, Integral/Fractional, Fractional/Integral, Fractional/Fractional의 4 가지 나누기 연산을 만드는 것입니다. 자신이 느끼는 용도에 따라 적절하게 계산하십시오. 필자가 작성한 계산기에서이 작업을 수행했을 때 가능하면 Integral에 보관하고 그렇지 않으면 Double로 캐스팅했습니다.

+0

예, 숫자 형식을 알면 IFF로 작동하므로 Numeric이 될 수 없습니다. 사실, 컴파일러는 메소드에 오버로드를 허용하지 않기 때문에 (즉, 그 유형의 메소드 매개 변수를 구별 할 수 없기 때문에) Integral 또는 Fractional을 사용할 수 없습니다. 모든 숫자 유형에 대해 "수학을 수행하는"방법을 사용하려면 제네릭을 버리고 숫자 유형 (프리미티브)의 모든 합리적인 조합에 대해 메서드를 오버로드해야하는 것처럼 보입니다. – jwvh