2010-11-07 24 views
8

Entiendo que bigint no es una función sino más bien un constructor de tipos. Es por eso que esta falla:¿Qué es exactamente "bigint" en F #?

// Won't compile 
let foo = 10 |> bigint 

entiendo que puedo crear una nueva función que acepta un número entero y devuelve un bigint, y luego el operador de la tubería va a funcionar.

Sin embargo, no entiendo por qué esto funciona:

let bar = bigint 10 

Si bigint es un constructor de tipos, ¿por qué no necesito new? ¿Dónde se define exactamente bigint como un alias del constructor de System.Numerics.BigInteger?

Respuesta

7

bigint es abberviation tipo de System.Numerics.BigInteger por lo que cuando se escribe

let x = bigint 10 

crear realmente instancia de BigInteger. En F # nuevo es opcional en constructores, básicamente se debe usar al crear instancias de tipos que implementan IDisposable

+0

Gracias. No sabía que 'nuevo' era opcional. Aquí hay una lista de abreviaturas de tipo, pero omite 'bigint': http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc270597684. Veo que 'int64' es también una abreviación de tipo. Sin embargo, creo que también hay una función 'int64'. Me pregunto por qué 'bigint' es una abreviación de tipo, pero' int64' es una función. – royco

+2

No sé si hay una razón por la que, mientras que todos los demás tipos numéricos como "int16" son "abreviaturas de tipo" y "funciones", "bigint" es solo un "tipo appreviaton". Podría especular que es porque la única razón por la que las funciones como "int16" existen en primer lugar es para proporcionar una forma de exponer las primitivas primers de IL (por ejemplo, 'conv.i2') que no tienen llamadas de" biblioteca "y suelen estar expuestas a usuarios de otros idiomas a través de funciones de "transmisión" de otros idiomas. – Brian

+0

@Brian, perspicaz. Pero señalaré que 'decimal' disfruta de una forma de función de conversión y es simplemente una estructura simple ... quizás' bigint' merece un lugar también :) –