在以下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
类的方法?
答案 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
上失败。