2015-01-10 5 views
2

Int в Haskell использует встроенную точность машин. Я знаю, что могу запросить границы с помощью maxBound и minBound. Есть ли аналогичный способ запроса ширины точности?Найти точность Haskell Int

Что-то вроде

getPrecision :: Int -> Int 

который возвращает либо сказать, 32 или 64.

+4

Попробуйте использовать ['sizeOf'] (https://hackage.haskell.org/package/base/docs/Foreign-Storable.html#v:sizeOf) и умножить на 8? – Rufflewind

+0

Спасибо, очень просто, как я подозревал. Вы хотите ответить на этот вопрос? – OllieB

+2

Также обратите внимание, что Haskell указывает только, что 'Int' должен быть не менее 29 бит. GHC, наиболее распространенный компилятор, использует собственную точность машины. –

ответ

2

Чистейший путь, для последних библиотек (те, которые поставляются с GHC 7.8 или более поздней версии), чтобы использовать finiteBitSize из Data.Bits. Это именно то, что вы запросили. С более ранними версиями вы можете использовать bitSize, также от Data.Bits, не полную версию того же самого. В частности, bitSize выдаст исключение, если ему дается что-то вроде Integer, у которого нет битового размера. finiteBitSize находится в подклассе FiniteBits, поэтому применение его к Integer даст ошибку типа. В последних библиотеках также есть bitSizeMaybe, но это, как правило, менее полезно.

+0

Если вы просто запрашиваете размер Int, тогда bitSize должен быть в порядке. –

+1

@PaulJohnson, да, но я считаю, что это устарело, поэтому я бы не рекомендовал его особо. – dfeuer

4

Одной из возможностей является

import Data.Bits 

getPrecision = popCount (maxBound :: Int) + 1 
+0

Это хорошее решение. Я посмотрю, что еще выскочит, поскольку я видел два способа, о которых я до сих пор не думал. – OllieB

1

Вы можете использовать sizeOf, но это приходит с той оговоркой, что тип не должен имеют любые биты заполнения.

import Foreign (Storable, sizeOf) 

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