2010-07-18 40 views
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,還是有更好的方法(也許不涉及(%)和比率),我不知道?

回答

32

你要操作數轉換爲浮動第一然後再分割,否則你會執行一個整數除法(沒有小數位)。

簡潔溶液(需要Data.Function

foo = (/) `on` fromIntegral 

這是短期的

foo a b = (fromIntegral a)/(fromIntegral b) 

foo :: Int -> Int -> Float 
+0

謝謝,這是很有意義的。我想知道是否可以先轉換爲「Float」,但是在瀏覽各種數字類中所有函數的文檔時忽略了fromIntegral。 (我不認爲其他方法會按照您提到的那樣完成整數除法小數位的丟失,但是:我從整數中構造了一個'Rational',這不會損失精度。) – Wyzard 2010-07-18 16:04:55

+0

@Wyzard:You were沒有從整數中得出理性。您將運算符*的結果視爲理解爲*,實際上並非如此。查看'fromRational'的類型簽名:參數是一個Rational,而'Ratio Int'和'Ratio Integer'都是不同的類型。你可能打算'toRational'。 – Chuck 2010-07-18 20:04:27

+0

@Chuck:'Rational'是'Ratio Integer'的別名,'(%)'返回任何類型操作數的'Ratio',所以將它應用到兩個'Integer'應該產生一個'Rational'(除非我誤解了)。我的問題是我給它'Int'併產生了'Ratio Int'(這確實是*不是'Rational')。 – Wyzard 2010-07-18 22:50:42

相關問題