2010-07-01 65 views
6

我是相當新的F#和整個這個場景過來了,希望有人能解釋爲什麼我的編譯器犯規一樣的代碼...F#去路管由Int轉換爲bigint

如果在F#我做的下面...

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

一切都很好,並且這個數字轉換爲相應的數據類型...

但如果我這樣做...

let IntToBigInt = 10 |> bigint 

我收到一個錯誤「無效的類型名稱或對象構造函數的使用。」 我認爲這是因爲對於bigint的前向管道沒有運算符超載?

如果我想讓這段代碼成爲可能,我該怎麼做?我知道我可以使用不同的語法像...

let IntToBigInt = bigint(10) 

但我真的很喜歡去路管語法和想知道如果我能實現它,這樣......

let IntToBigInt = 10 |> bigint 

會工作...

回答

14

它與重載無關。 10.0 |> int工作,因爲有一個名爲int的函數。然而,沒有名爲bigint的功能,所以10 |> bigint不起作用。

如果你定義一個,它的工作原理:

> 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

爲了增加SEPP年代,'bigint'馬克在使用前是一類的構造函數,而不是一個函數。 – Mau 2010-07-01 14:18:13

+0

謝謝sepp ...我從來沒有意識到這一點!它現在非常有意義... – 2010-07-01 14:31:28

+6

如果你真的想使用管道然後... let y = 1 |> bigint.op_Implicit – desco 2010-07-01 14:41:11