25
我想在Haskell中分兩個Int
值,並將結果作爲Float
。我試圖做這樣的:將兩個Int值分開以獲得Float的正確方法是什麼?
foo :: Int -> Int -> Float
foo a b = fromRational $ a % b
但GHC(6.12.1版本)告訴我「無法匹配,期望的類型‘整型’反對推斷類型‘詮釋’」關於在表達a
。
我明白爲什麼:在fromRational
調用需要(%)
產生Ratio Integer
,所以操作數必須是Integer
類型而不是Int
的。但是我所劃分的值遠遠不在Int
的範圍內,所以使用任意精度的bignum類型似乎是過度殺傷性的。
什麼是正確的方法來做到這一點?我應該在操作數上調用toInteger
,還是有更好的方法(也許不涉及(%)
和比率),我不知道?
謝謝,這是很有意義的。我想知道是否可以先轉換爲「Float」,但是在瀏覽各種數字類中所有函數的文檔時忽略了fromIntegral。 (我不認爲其他方法會按照您提到的那樣完成整數除法小數位的丟失,但是:我從整數中構造了一個'Rational',這不會損失精度。) – Wyzard 2010-07-18 16:04:55
@Wyzard:You were沒有從整數中得出理性。您將運算符*的結果視爲理解爲*,實際上並非如此。查看'fromRational'的類型簽名:參數是一個Rational,而'Ratio Int'和'Ratio Integer'都是不同的類型。你可能打算'toRational'。 – Chuck 2010-07-18 20:04:27
@Chuck:'Rational'是'Ratio Integer'的別名,'(%)'返回任何類型操作數的'Ratio',所以將它應用到兩個'Integer'應該產生一個'Rational'(除非我誤解了)。我的問題是我給它'Int'併產生了'Ratio Int'(這確實是*不是'Rational')。 – Wyzard 2010-07-18 22:50:42