查找 Haskell 整数精度

Find Haskell Int precision

Haskell 中的 Int 使用机器的本机精度。我知道我可以使用 maxBound 和 minBound 查询边界。有没有类似查询精度宽度的方法?

类似

getPrecision :: Int -> Int

其中 returns 说 32 或 64。

一种可能是

import Data.Bits

getPrecision = popCount (maxBound :: Int) + 1

您可以使用 sizeOf 但这需要注意类型不能有任何填充位。

import Foreign (Storable, sizeOf)

getPrecision :: Storable a => a -> Int
getPrecision dummy = sizeOf dummy * 8

对于最近的库(GHC 7.8 或更高版本附带的库),最干净的方法是使用 Data.Bits 中的 finiteBitSize。这正是您要求的功能。对于早期版本,您可以使用 bitSize,也来自 Data.Bits,同一事物的非完整版本。具体来说,如果 bitSize 被赋予 Integer 之类的没有位大小的内容,则会抛出异常。 finiteBitSize 属于 FiniteBits 子类,因此将其应用于 Integer 会出现类型错误。最近的库中也有一个 bitSizeMaybe,但它似乎不太有用。