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 = 1NMicrosoft.FSharp.Math.NumericLiteralNにクラスがあることは知ってい FSharp.PowerPackます。コードはMicrosoft.FSharp.Math.NumericLiteralNクラスのメソッドを上書きしますか?

4

1 に答える 1

2

Tomas のブログ ( http://toasp.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"は特別なものであり、コンパイラーはこのコードを自動的に生成して物事を機能させます。

あなたの例では、それがusing"n"の値であるため、が返されます。1FromOne()

コードには正のInt32値の定義もありますが、 で失敗し-1Nます。

于 2013-05-06T11:22:09.140 に答える