Qual é a diferença entre Int e Inteiro?

169

Em Haskell, qual é a diferença entre an Inte an Integer? Onde está documentada a resposta?

0xAX
fonte

Respostas:

183

"Inteiro" é um tipo de precisão arbitrária: manterá qualquer número, não importa o tamanho, até o limite da memória da sua máquina…. Isso significa que você nunca tem estouros aritméticos. Por outro lado, também significa que sua aritmética é relativamente lenta. Os usuários do Lisp podem reconhecer o tipo "bignum" aqui.

"Int" é o número inteiro mais comum de 32 ou 64 bits. As implementações variam, embora seja garantido pelo menos 30 bits.

Fonte: O Wikilivro Haskell . Além disso, você pode achar útil a seção Números de Uma introdução suave a Haskell .

bcat
fonte
De acordo com esta resposta , usando Integermuitas vezes é mais rápido do que é
Maarten
6
@Maarten, isso é apenas porque Int64é implementado bastante mal em sistemas de 32 bits. Em sistemas de 64 bits, é ótimo.
Dfeuer
21

Inté Bounded, o que significa que você pode usar minBounde maxBounddescobrir os limites, que dependem da implementação, mas garantem manter pelo menos [-2 29 .. 2 29 -1].

Por exemplo:

Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)

No entanto, Integeré precisão arbitrária, e não Bounded.

Prelude> (minBound, maxBound) :: (Integer, Integer)

<interactive>:3:2:
    No instance for (Bounded Integer) arising from a use of `minBound'
    Possible fix: add an instance declaration for (Bounded Integer)
    In the expression: minBound
    In the expression: (minBound, maxBound) :: (Integer, Integer)
    In an equation for `it':
        it = (minBound, maxBound) :: (Integer, Integer)
200_success
fonte
10

Int é C int, o que significa que seus valores variam de -2147483647 a 2147483647, enquanto um intervalo inteiro de todo o conjunto Z , ou seja, pode ser arbitrariamente grande.

$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)

Observe o valor do literal Int.

Ming-Tang
fonte
2
GHCi, versão 7.10.3, emite um aviso: 12345678901234567890 literal está fora do intervalo Int -9223372036854775808..9223372036854775807
Adam
5

O Prelúdio define apenas os tipos numéricos mais básicos: números inteiros de tamanho fixo (Int), números inteiros de precisão arbitrária (Inteiro), ...

...

O tipo inteiro de precisão finita Int cobre pelo menos o intervalo [- 2 ^ 29, 2 ^ 29 - 1].

do relatório Haskell: http://www.haskell.org/onlinereport/basic.html#numbers

newacct
fonte
4

Um Integeré implementado como um Int#até ficar maior que o valor máximo que um Int#pode armazenar. Nesse ponto, é um número GMP .

Nate Symer
fonte
2
Isso soa específico da implementação. Existe uma referência dizendo que Inteiro precisa ser implementado dessa maneira?
precisa saber é o seguinte
4
Não, você está certo, isso é específico para o GHC. Dito isto, 1. GHC é o que a maioria das pessoas usa, 2. Essa é a maneira mais inteligente que consigo pensar para implementar esse tipo de dados.
Nate Symer # 9/16
Isso significa que (no GHC) não há troca de desempenho pelo uso Integere, portanto, Integersempre é a melhor opção?
precisa