2013-05-06 141 views
2

在下面的例子DSL(http://fssnip.net/bB),代碼提出:F#中的NumericLiteralN的含義是什麼?

module NumericLiteralN = 
    let FromZero() = "" 
    let FromOne() = "n" 
    let FromInt32 x = String.replicate x "n" 

// Calls FromOne(): 
let x11 = 1N 
// val x1 : string = "n" 

我完全不明白這些代碼let x11 = 1N。我知道在FSharp.PowerPackMicrosoft.FSharp.Math.NumericLiteralN。這些代碼是否覆蓋了Microsoft.FSharp.Math.NumericLiteralN類的方法?

回答

2

從托馬斯的博客(http://tomasp.net/blog/fsharp-custom-numeric.aspx

引用定義文字,我們需要編寫一個模塊,一個特殊的名字。 模塊內部,我們實現了自動使用 在F#編譯器每當文字使用幾種功能:

module NumericLiteralZ = 
    let FromZero() = Z5 0 3: 
    let FromOne () = Z5 1 4: 
    let FromInt32 a = IntegerZ5.Create(a%5) 5: 
    let FromInt64 a = IntegerZ5.Create(int(a%5L)) 

模塊的名稱由專門的名字NumericLiteral 後跟一個符號的Z我們將用於寫作我們的文字。這個 意味着我們可以編寫0Z,1Z和42Z等文字。 模塊可以提供幾種功能來啓用幾種尺寸的文字。

實際上名稱NumericLiteral"X"是特殊的,編譯器會自動生成此代碼以使其工作。

在你的例子中,"n"被重新調整,因爲這是1的值,使用FromOne()

您的代碼還有一個定義爲正值Int32值 - 雖然它會在-1N上失敗。

+0

BigNum和BigInt之間的區別BigNum可以是浮點數嗎?順便說一下,如何在F#中使用BigNum類?對不起,我是F#的新手。 – stt106 2016-09-04 22:11:16