Могу ли я создавать собственные литеральные типы в .NET (F #) - PullRequest
3 голосов
/ 16 мая 2011

например, если я хочу литеральный тип для Nullable (x), такой как

let x = 6x // nullable literal type 

Так реально ли создавать собственные литеральные типы?

1 Ответ

11 голосов
/ 16 мая 2011

да, вы можете

F # spec:

Целочисленные литералы с суффиксами Q, R, Z, I, N, G используются для пользовательских и библиотечных типов посредством следующего синтаксического перевода: хххх

  • Для xxxx = 0 - NumericLiteral.FromZero ()
  • Для xxxx = 1 - NumericLiteral.FromOne ()
  • Для xxxx в диапазоне Int32 - NumericLiteral.FromInt32 (xxxx)
  • Для xxxx в диапазоне Int64 - NumericLiteral.FromInt64 (xxxx)
  • Для других чисел - NumericLiteral.FromString ("xxxx")

Например, определение модуля NumericLiteralZ, как показано ниже, позволяет использовать буквенную форму 32Z для генерации последовательности из 32 символов «Z». Для чисел вне диапазона 32-разрядных целых чисел буквальный синтаксис недоступен.

module NumericLiteralZ =
    let FromZero() = ""
    let FromOne() = "Z"
    let FromInt32 n = String.replicate n "Z"

// nullables
open System
module NumericLiteralN = 
    let FromZero()          = Nullable(0)
    let FromOne()           = Nullable(1)
    let FromInt32(i : int)  = Nullable(i)

printfn "%A" 0N
printfn "%A" 1N
printfn "%A" 100N.HasValue
...