F#中的NumericLiteralN的含义是什么?

问题描述:

在下面的例子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类的方法?

从托马斯的博客(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