2010-07-01 23 views
6

Sono abbastanza nuovo a F # e si avvicinò attraverso questo scenario e speravo che qualcuno potrebbe spiegare il motivo per cui il mio compilatore doesnt come il codice ...F # tubo in avanti per convertire da int a bigint

Se in F # faccio la segue ...

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

tutto va bene e il numero è gettato al tipo di dati rilevanti ...

se però io il seguente ...

let IntToBigInt = 10 |> bigint 

Ricevo un errore "Uso non valido del nome del tipo o del costruttore di oggetti". Suppongo che ciò sia dovuto al fatto che non esiste un overload di operatore per la pipe forward per bigint?

Se volessi rendere questo codice possibile, come lo farei? So che potrei utilizzare una sintassi diversa, come ...

let IntToBigInt = bigint(10) 

ma mi piace molto la sintassi Forward Tubo e vorrei sapere se posso ottenere in modo che ...

let IntToBigInt = 10 |> bigint 

avrebbe funzionato ...

risposta

14

Non ha nulla a che fare con sovraccarichi. 10.0 |> int funziona perché esiste una funzione denominata int. Non esiste tuttavia alcuna funzione denominata bigint, quindi 10 |> bigint non funziona.

Se si definisce uno, funziona:

> 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

Per aggiungere a Sepp di, il bigint' Mark stava usando prima che è un costruttore di tipo, non una funzione '. – Mau

+0

Grazie sepp ... Non l'ho mai capito! È perfettamente logico ora ... –

+6

se si desidera VERAMENTE utilizzare la pipeline, quindi ... let y = 1 |> bigint.op_Implicit – desco