하스켈에서 두 개의 Int
값을 나누고 결과를 Float
으로 얻고 싶습니다.두 개의 Int 값을 나누어 플로트를 얻는 올바른 방법은 무엇입니까?
foo :: Int -> Int -> Float
foo a b = fromRational $ a % b
하지만 GHC (버전 6.12.1)는 나에게 "예상과 일치 할 수 없습니다 유형 추론 유형에 대한 '정수' '내부'"표현의 a
에 관한 지시 :이처럼 그 일을 시도. fromRational
통화가 Ratio Integer
을 생산하는 (%)
필요하므로 피연산자 유형 Integer
보다는 Int
될해야합니다
은 그 이유를 이해합니다. 그러나 내가 나누는 값은 Int
범위 한계 근처에 없으므로 임의 정밀도 bignum 유형을 사용하면 과도한 것처럼 보입니다.
어떻게해야할까요? 방금 피연산자에 toInteger
을 호출해야합니까, 아니면 잘 모르는 더 나은 접근 방법 (어쩌면 (%)
및 비율을 포함하지 않는 것)이 있습니까?
덕분
대한 짧은
그 말이 (
Data.Function
이 필요). 나는 처음에'Float'으로 변환 할 수 있을지 궁금했지만 어떻게 든 다양한 숫자 클래스의 모든 함수에 대한 문서를 탐색하면서'fromIntegral'을 간과 할 수있었습니다. (나는 당신이 암시하는 것처럼 다른 접근법이 정수 부분을 잃어 버렸을 것이라고 생각하지 않는다 : 나는 정확도를 잃지 않는 정수로부터'Rational'을 만들고 있었다.) – Wyzard@Wyzard : 당신은 정수에서 Rational을 만들지 마십시오. 실제로 합리적이지 않은 경우 합리적인 연산자로 결과를 처리하고있었습니다. 'fromRational'의 타입 시그니처를보십시오. 인수는 Rational입니다. 반면 Ratio Int와 Ratio Integer는 모두 다른 타입입니다. 당신은'toRational'을 의도했을 것입니다. – Chuck
@Chuck :'Rational'은'Ratio Integer'의 별칭입니다.'(%)'는 피연산자가 어떤 타입이든간에 'Ratio'를 반환합니다. 따라서 두 개의 Integer에 적용하면 'Rational'이 생성됩니다 (나는 오해하고있다.) 내 문제는 내가'Int'를주고'Ratio Int' (실제로'Rational'가 아닌)를 만들어내는 것이 었습니다. – Wyzard