2010-07-01 4 views
6

Je suis assez nouveau à F # et est venu à travers ce scénario et espérais que quelqu'un pourrait expliquer pourquoi mon doesnt compilateur comme le code ...F # de tuyau avant de convertir int en bigint

Si en F # Je fais la suivant ...

let FloatToInt = 10.0 |> int 
let IntToFloat = 10 |> float 

Tout va bien et le nombre est jeté au type de données pertinentes ...

si mais je fais ce qui suit ...

let IntToBigInt = 10 |> bigint 

Je reçois une erreur "Utilisation incorrecte du nom de type ou du constructeur d'objet". Je suppose que c'est parce qu'il n'y a pas une surcharge de l'opérateur pour le tuyau avant pour bigint?

Si je voulais rendre ce code possible, comment le ferais-je? Je sais que je pourrais utiliser une syntaxe différente comme ...

let IntToBigInt = bigint(10) 

Mais je aime vraiment la syntaxe de tuyaux avant et je voudrais savoir si je peux le réaliser pour que ...

let IntToBigInt = 10 |> bigint 

fonctionnerait ...

Répondre

14

Cela n'a rien à voir avec les surcharges. 10.0 |> int fonctionne parce qu'il existe une fonction nommée int. Il n'y a cependant aucune fonction nommée bigint, donc 10 |> bigint ne fonctionne pas.

Si vous définissez un, il fonctionne:

> let bigint (x:int) = bigint(x);; // looks recursive, but isn't 
val bigint : int -> System.Numerics.BigInteger 

> 42 |> bigint;; 
val it : System.Numerics.BigInteger = 42I 
+3

Pour ajouter à sepp de la 'bigint' Mark utilisait avant est un constructeur de type, pas une fonction. – Mau

+0

Merci sepp ... Je n'ai jamais réalisé ça! Cela prend tout son sens maintenant ... –

+6

si vous voulez vraiment utiliser pipeline alors ... let y = 1 |> bigint.op_Implicit – desco