2017-09-07 59 views
1

我有以下一段代碼似乎與GHC編譯後運行時一貫掛起(雖然沒有與-Werror構建失敗)。Haskell掛在號碼轉換

import Data.Aeson 
import Data.Scientific 
import qualified Data.HashMap.Strict as S 

myObj = Object $ 
    S.fromList [("bla", Number $ pc * 100.0)] 
    where pc = 10/9 

,並試圖訪問myObj時,程序將被掛起。經過一番挖掘之後,似乎haskell在數字轉換方面遇到困難(儘管上面的代碼片段沒有警告或錯誤)。如果我將上面的9更改爲10,則它不會掛起。但我很好奇,爲什麼上面掛?

回答

5

10 % 9(理性)轉換爲科學是不會終止的。

10/9 :: Scientific 

From the documentation of Data.Scientific

警告:儘管科學是分數的情況下,方法 僅部分定義!當它們的輸出具有無限的 十進制擴展時,具體地,收發和/或發散 (即循環並消耗所有空間)。當輸入Rational 具有無限小數展開時,fromRational將發生偏差。考慮使用fromRationalRepetend 這些將檢測重複的合理性並指示 開始的位置。

因此,試試這個來代替:

let Right (x, _) = fromRationalRepetend Nothing (10/9) in x 

你必須決定什麼樣的措施是適當的。我決定在這裏忽略Left的可能性。

+0

這是誠實的非常關心。在分子和分母來自用戶輸入的實際應用中,這種情況只會在一小部分請求中出現,這使得調試非常困難。看起來一般建議應該是不惜一切代價避免Data.Scientific,並且只在將數字轉換爲JSON時使用它。 – pretobomba