在使用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,则不会挂起.但我很好奇,为什么上面挂了?
10 % 9(Rational)到Scientific 的转换是不会终止的.
10 / 9 :: Scientific
Run Code Online (Sandbox Code Playgroud)
警告:虽然Scientific是Fractional的一个实例,但这些方法只是部分定义的!当输出具有无限的十进制扩展时,特别是recip和/将发散(即循环并消耗所有空间).当输入Rational具有无限的十进制扩展时,fromRational将发散.考虑使用fromRationalRepetend来获取这些有效性,这些有效性将检测重复并指示其开始的位置.
因此,请尝试以下方法:
let Right (x, _) = fromRationalRepetend Nothing (10 / 9) in x
Run Code Online (Sandbox Code Playgroud)
您必须决定适当的措施.我决定忽略这种可能性Left.
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |