F#中NumericLiteralN的含义是什么?

时间:2013-05-06 11:17:38

标签: f#

在以下DSL示例(http://fssnip.net/bB)中,代码显示为:

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。我知道Microsoft.FSharp.Math.NumericLiteralN中有一个课程FSharp.PowerPack。代码是否会覆盖Microsoft.FSharp.Math.NumericLiteralN类的方法?

1 个答案:

答案 0 :(得分:2)

引自Tomas的博客(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上失败。