有没有办法告诉64位GHC将Int视为Int32?

val*_*man 4 haskell ghc

我正在使用GHC作为库编写Haskell到Javascript代码生成器.由于Javascript没有整数类型,并且其Number类型只能正确表示高达2⁵3的整数,我将整数表示为数字,明确地执行所有算术模2¾.这对于32位GHC非常有效,但对于64位版本则更差.

GHC很乐意将Int64值强制转换为Ints,并将Int常量解释为64位值(例如,0xffffffff变为4294967295而不是-1),这会导致各种恼人的问题.

即使在64位系统上,编译器也能很好地处理"普通"Web内容,前提是标准库是在32位机器上构建的,但"请不要使用大数字,好吗?" 不是你想在编译器手册中看到的东西.一些问题(但不是全部)可以通过使用-O0进行编译来缓解,但是(不出所料)产生的代码不仅速度慢,而且太大.

所以,我需要阻止GHC假设Int和Int64是等价的.这甚至可能吗?

Don*_*art 7

如果不使用32位GHC,这是不可能的.

哈斯克尔语言标准说,你知道的唯一Int类型是它有

至少范围[-2 ^ 29 .. 2 ^ 29-1

因此,您可以愉快地截断Int大于此值的值,并且仍然是完全兼容的Haskell 2010实现!

但是,您可能不应该这样做,而是为JavaScript寻找64位整数类型.与GHC相同的技巧可以支持Int6432位机器.