Haskell挂在号码转换上

pre*_*mba 1 haskell ghc ghci

在使用GHC编译后运行时,我有以下代码似乎一直挂起(尽管没有构建失败-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   
Run Code Online (Sandbox Code Playgroud)

而当试图访问myObj该程序将挂起.经过一些挖掘后,似乎haskell在数字转换方面遇到了困难(尽管上面的代码片段没有警告或错误).如果我将9上面的内容更改为a 10,则不会挂起.但我很好奇,为什么上面挂了?

eri*_*sco 5

10 % 9(Rational)到Scientific 的转换是不会终止的.

10 / 9 :: Scientific
Run Code Online (Sandbox Code Playgroud)

从Data.Scientific的文档:

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

因此,请尝试以下方法:

let Right (x, _) = fromRationalRepetend Nothing (10 / 9) in x
Run Code Online (Sandbox Code Playgroud)

您必须决定适当的措施.我决定忽略这种可能性Left.