2017-04-21 5 views
1

스칼라에있는 방법으로 실험하고 있습니다. 숫자의 크기에 따라 숫자를 반올림하려고합니다. 값이 1보다 작은 경우 적어도 하나의 소수점을 반올림하는 것이 좋습니다. 정수가 아닌. 이 오류가 발생합니다Scala에서 숫자 매개 변수를 반올림합니다.

def roundSmart[A](num: A)(implicit numeric: Numeric[A]) = num match { 
    case num if num < 1 => numeric.toDouble(num) 
    case _ => numeric.toInt(num) 
    } 

: 그것이 될 수 있으므로 물론

value < is not a member of type parameter A

이 매개 변수는 함수 서명매개 변수 유형의 범위를 수용 할 필요가 여기에 내가 노력하고있어입니다 정수 또는 복식을 사용하므로 더 복잡합니다.

나는이 대답에서 처음 경우조건 문을 찍은 - Using comparison operators in Scala's pattern matching system을하고 기능 프로그래밍 방법을 사용하는 열망입니다. 어쩌면 Math.round()과 같은 내장 스칼라 함수도 있으므로 소수점을 제거하지 않고 두 번째 조건을 반올림하는 데 도움이 될 수 있습니다. 감사!

+0

는'math.round'는 반환 형식 것을 스칼라에서 –

답변

1

TL; DR : (제네릭) 당신의 유형 A< 방법을 가지고 있지 않습니다 numeric

오류가 자체 설명이다 안에 당신이 필요합니다 모든 숫자 방법이 있습니다.

그러나, 당신이해야하는 것은 모든 숫자 방법과 typeclass이다, 그래서 당신은 아마를 가져와야합니다 : (무엇보다도)

import numeric._ 

이 수입을 원하는 방법을 가지고 OrderingOps에 암시 적 변환, . 그러나이 비교는 작동하지 않습니다. 1A이 아니기 때문에 Int입니다!

해결책은 fromIntnumeric으로 간단히 사용하는 것입니다.

입력 할 때 예기치 않은 결과가 나타날 수 있습니다. -234.2e123 ... 숫자의 절대 값에 대한 테스트를 수행하는 것이 좋습니다 (absnumeric의 방법이기도 함). 간단한 테스트를 수행하려는 경우

또한, 패턴 매칭을 사용할 필요가 없습니다하는 if else 문은

def roundSmart[A](num: A)(implicit numeric: Numeric[A]) = { 
    import numeric._ 
    if (abs(num) < fromInt(1)) toDouble(num) else toInt(num) 
} 
+0

참고 존재 충분하다 'Double'이 될 것입니다. 이것에 대해서도 무언가를하고 싶을 것입니다. –

+0

응답 해 주셔서 감사합니다. 그러므로 오류는 - 훌륭합니다 - 그러나 정수형을 원한다는 것에 상관없이 항상 Double 형을 반환한다면 내가하려는 것을 성취하는 데 도움이되지 않습니다. 목적을 이해하기 위해 전체 질문을 읽으십시오. 그래서 나는 틀린 기술을 사용해야 만합니다. 또한 * 패턴 일치 *는 두 가지 조건 이상을 가질 것이기 때문입니다. –

+0

정적 유형 지정이 있으므로 잘 정의 된 반환 유형이 있어야합니다. 유스 케이스에 따라 원하는 것을 생각해야한다. –