2

在以下 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.NumericLiteralNFSharp.PowerPack. 代码会覆盖Microsoft.FSharp.Math.NumericLiteralN类的方法吗?

4

1 回答 1

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"返回,因为这是1using的值FromOne()

您的代码也有一个正值的定义Int32——尽管它会在-1N.

于 2013-05-06T11:22:09.140 回答