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.PowerPack
有Microsoft.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
上失败。
BigNum和BigInt之间的区别BigNum可以是浮点数吗?顺便说一下,如何在F#中使用BigNum类?对不起,我是F#的新手。 – stt106 2016-09-04 22:11:16