Haskell挂在号码转换上

时间:2017-09-07 04:35:15

标签: haskell ghc ghci

我在使用GHC编译后运行时似乎一直挂起以下代码(尽管$RefreshToken = "refresh_token" $ClientId= "client_id" 没有构建失败)。

-Werror

尝试访问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 时,程序将挂起。经过一些挖掘后,似乎haskell在数字转换方面遇到了困难(尽管没有上述代码段的警告或错误)。如果我将上面的myObj更改为9,则不会挂起。但我好奇,为什么上面挂了?

1 个答案:

答案 0 :(得分:5)

10 % 9(一个Rational)转换为Scientific是不会终止的。

10 / 9 :: Scientific

From the documentation of Data.Scientific

  

警告:虽然Scientific是Fractional的一个实例,但是方法   只是部分定义!特别是recip和/将分歧   (即,当它们的输出具有无限时,循环并消耗所有空间)   十进制扩展。当输入Rational时,fromRational会发散   有一个无限的十进制扩展。考虑使用fromRationalRepetend   这些理性将检测重复并指出   它开始的地方。

因此,请尝试这样做:

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

您必须决定适当的措施。我在此决定忽略Left的可能性。