Aracılığıyla paylaş


(F#) private int value

Bu konuda, aritmetik bir sınıf ya da kayıt türü ve genel düzeyde aşırı açıklamaktadır.

// Overloading an operator as a class or record member. 
static member (operator-symbols) (parameter-list) = 
    method-body
// Overloading an operator at the global level
let [inline] (operator-symbols) parameter-list =
    function-body

Notlar

In the previous syntax, the operator-symbol is one of +, -, *, /, =, and so on. parameter-list Göründükleri her zamanki sözdiziminde işleç için sırada işlenen belirtir. method-body Sonuç değeri oluşturur.

İşleçler iþleç aþýrý statik olmalıdır. Operatör overloads tekli operatörler için gibi + ve -, bir tilde işareti kullanmanız gerekir (~), operator-symbol aşağıdaki bildiriminde gösterilen işleci tek işlem işleci ve bir ikili işleç değil olduğunu belirtmek için.

static member (~-) (v : Vector)

Aşağıdaki kod, scalar tarafından tekli Negatiflik biri diğeri de çarpma işlemi için yalnızca iki işleç içeren bir vector sınıfı gösterir. Operatör vektör ve skalar görünme sırasını bağımsız olarak çalışması gerekir çünkü örnekte iki aþýrý yüklemesinin skalar çarpma işlemi için gereklidir.

type Vector(x: float, y : float) =
   member this.x = x
   member this.y = y
   static member (~-) (v : Vector) =
     Vector(-1.0 * v.x, -1.0 * v.y)
   static member (*) (v : Vector, a) =
     Vector(a * v.x, a * v.y)
   static member (*) (a, v: Vector) =
     Vector(a * v.x, a * v.y)
   override this.ToString() =
     this.x.ToString() + " " + this.y.ToString()

let v1 = Vector(1.0, 2.0)

let v2 = v1 * 2.0
let v3 = 2.0 * v1

let v4 = - v2

printfn "%s" (v1.ToString())
printfn "%s" (v2.ToString())
printfn "%s" (v3.ToString())
printfn "%s" (v4.ToString())

Yeni işleçler yaratmak

Bütün standart işleçler aşırı yüklenmeye neden olabilir, ancak belirli karakterleri yeni operatörleri de oluşturabilirsiniz. Allowed operator characters are !, %, &, *, +, -, ., /, <, =, >, ?, @, ^, |, and ~. ~ Karakter işleci tekli yapma özel anlamı vardır ve operatör karakter dizisinin bir parçası değildir. Tüm operatörler tekli, bölümde anlatıldığı şekilde yapılabilir öneki ve işleçleri Infix bu konuda daha sonra.

Kullandığınız tam karakter sırasının bağlı olarak, belirli bir öncelik ve birleşim operatörünüze olacaktır. Birleşim, sağdan sola veya sağa ya da sola ve aynı öncelik düzeyini işleçleri sırası parantez olmadan görünür olduğunda kullanılır.

Operatör karakter . öncelik, kendi sürümünüzü aynı öncelik ve birleşim sıradan çarpma gibi olan çarpma tanımlamak istiyorsanız, örneğin, operators gibi oluşturabilirsiniz, böylece etkilemez .*.

İşleçlerin önceliklerini tüm F# gösteren bir tablo içinde bulunan Sembol ve işleç başvurusu (F#).

Fazla yüklenmiş işleç adları

F# derleyicisi bir işleç ifade derlediğinde, işleç için derleyici tarafından oluşturulmuş bir ada sahip bir yöntem oluşturur. Bu yöntem için Microsoft Intermediate language (MSIL) olarak ve aynı zamanda yansıma ve IntelliSense görünen addır. Normalde F# kodunda bu adları kullanmanız gerekmez.

Standart işleçler aşağıdaki tabloda gösterilir ve karşılık gelen adlar oluşturulur.

İşleç

Oluşturulan adı

[]

op_Nil

::

op_Cons

+

op_Addition

-

op_Subtraction

*

op_Multiply

/

op_Division

@

op_Append

^

op_Concatenate

%

op_Modulus

&&&

op_BitwiseAnd

|||

op_BitwiseOr

^^^

op_ExclusiveOr

<<<

op_LeftShift

~~~

op_LogicalNot

>>>

op_RightShift

~+

op_UnaryPlus

~-

op_UnaryNegation

=

op_Equality

<=

op_LessThanOrEqual

>=

op_GreaterThanOrEqual

<

op_LessThan

>

op_GreaterThan

?

op_Dynamic

?<-

op_DynamicAssignment

|>

op_PipeRight

<|

op_PipeLeft

!

op_Dereference

>>

op_ComposeRight

<<

op_ComposeLeft

<@ @>

op_Quotation

<@@ @@>

op_QuotationUntyped

+=

op_AdditionAssignment

-=

op_SubtractionAssignment

*=

op_MultiplyAssignment

/=

op_DivisionAssignment

..

op_Range

.. ..

op_RangeStep

Burada listelenmeyen bir işleç karakter diğer birleşimleri işleçleri olarak kullanılan ve adları için aşağıdaki tablodan tek tek karakterleri birleştirerek oluşur adlara sahip. Örneğin, +! becomes op_PlusBang.

Operatör karakter

Ad

>

Greater

<

Less

+

Plus

-

Minus

*

Multiply

/

Divide

=

Equals

~

Twiddle

%

Percent

.

Dot

&

Amp

|

Bar

@

At

^

Hat

!

Bang

?

Qmark

(

LParen

,

Comma

)

RParen

[

LBrack

]

RBrack

Önek ve iç işleçleri

Önek işleçleri işlenen ya da çok benzer bir işlev işlenen önüne yerleştirilmesi bekleniyor. İnfix operatörleri iki işlenen arasında yerleştirilmesi için bekleniyor.

Önek operatörleri yalnızca belirli işleçleri kullanılabilir. Bazı operatörler önek operatörleri her zaman olduğu, diğerleri olacak veya önek olabilir ve geri kalan her zaman işleçleri infix. İle başlayan işleçleri !, dışında !=işleç ~, veya yinelenen kısımlarının~, önek operatörleri her zaman olur. The operators +, -, +., -., &, &&, %, and %% can be prefix operators or infix operators. Ekleyerek bu operatörler önek sürümü olacak sürümünden ayırt bir ~ başında tanımlandığı bir önek işleci. ~ Yalnızca tanımlanmışsa, işleci kullandığınızda kullanılmaz.

Örnek

Aşağıdaki kod bir kesir türünü uygulamak için Ýþleç kullanımını göstermektedir. Kesir bir pay ve Payda bir tarafından temsil edilir. İşlev hcf kesirler azaltmak için kullanılan en yüksek ortak çarpanı, belirlemek için kullanılır.

// Determine the highest common factor between
// two positive integers, a helper for reducing
// fractions.
let rec hcf a b =
  if a = 0u then b
  elif a<b then hcf a (b - a)
  else hcf (a - b) b

// type Fraction: represents a positive fraction
// (positive rational number).
type Fraction =
   {
      // n: Numerator of fraction.
      n : uint32
      // d: Denominator of fraction.
      d : uint32
   }

   // Produce a string representation. If the
   // denominator is "1", do not display it.
   override this.ToString() =
      if (this.d = 1u)
        then this.n.ToString()
        else this.n.ToString() + "/" + this.d.ToString()

   // Add two fractions.
   static member (+) (f1 : Fraction, f2 : Fraction) =
      let nTemp = f1.n * f2.d + f2.n * f1.d
      let dTemp = f1.d * f2.d
      let hcfTemp = hcf nTemp dTemp
      { n = nTemp / hcfTemp; d = dTemp / hcfTemp }

   // Adds a fraction and a positive integer.
   static member (+) (f1: Fraction, i : uint32) =
      let nTemp = f1.n + i * f1.d
      let dTemp = f1.d
      let hcfTemp = hcf nTemp dTemp
      { n = nTemp / hcfTemp; d = dTemp / hcfTemp }

   // Adds a positive integer and a fraction.
   static member (+) (i : uint32, f2: Fraction) =
      let nTemp = f2.n + i * f2.d
      let dTemp = f2.d
      let hcfTemp = hcf nTemp dTemp
      { n = nTemp / hcfTemp; d = dTemp / hcfTemp }

   // Subtract one fraction from another.
   static member (-) (f1 : Fraction, f2 : Fraction) =
      if (f2.n * f1.d > f1.n * f2.d)
        then failwith "This operation results in a negative number, which is not supported."
      let nTemp = f1.n * f2.d - f2.n * f1.d
      let dTemp = f1.d * f2.d
      let hcfTemp = hcf nTemp dTemp
      { n = nTemp / hcfTemp; d = dTemp / hcfTemp }

   // Multiply two fractions.
   static member (*) (f1 : Fraction, f2 : Fraction) =
      let nTemp = f1.n * f2.n
      let dTemp = f1.d * f2.d
      let hcfTemp = hcf nTemp dTemp
      { n = nTemp / hcfTemp; d = dTemp / hcfTemp }

   // Divide two fractions.
   static member (/) (f1 : Fraction, f2 : Fraction) =
      let nTemp = f1.n * f2.d
      let dTemp = f2.n * f1.d
      let hcfTemp = hcf nTemp dTemp
      { n = nTemp / hcfTemp; d = dTemp / hcfTemp }

   // A full set of operators can be quite lengthy. For example,
   // consider operators that support other integral data types,
   // with fractions, on the left side and the right side for each.
   // Also consider implementing unary operators.

let fraction1 = { n = 3u; d = 4u }
let fraction2 = { n = 1u; d = 2u }
let result1 = fraction1 + fraction2
let result2 = fraction1 - fraction2
let result3 = fraction1 * fraction2
let result4 = fraction1 / fraction2
let result5 = fraction1 + 1u
printfn "%s + %s = %s" (fraction1.ToString()) (fraction2.ToString()) (result1.ToString())
printfn "%s - %s = %s" (fraction1.ToString()) (fraction2.ToString()) (result2.ToString())
printfn "%s * %s = %s" (fraction1.ToString()) (fraction2.ToString()) (result3.ToString())
printfn "%s / %s = %s" (fraction1.ToString()) (fraction2.ToString()) (result4.ToString())
printfn "%s + 1 = %s" (fraction1.ToString()) (result5.ToString())
  

Genel düzeyde işleçleri

Ayrıca, işleçler genel düzeyde tanımlayabilirsiniz. Aşağıdaki kod, bir işleç tanımlar +?.

let inline (+?) (x: int) (y: int) = x + 2*y
printf "%d" (10 +? 1)

Yukarıdaki kodun çıktısı 12.

Yeni tanımlanan operatörler yerleşik işlecin öncelik kazanır ölçüm kuralları F# dikte çünkü bu şekilde normal aritmetik işleçler tanımlayabilirsiniz.

Anahtar sözcük inline çoğunlukla çağıran kodun içine en iyi tümleşik küçük işlevleri olarak genel işleçler ile kullanılır. Yapma işleci işlevleri satır içi bunları statik olarak çözümlenen genel kod üretmek için statik olarak çözümlenen bir tür parametrelerle çalışma sağlar. Daha fazla bilgi için, bkz. Satır içi işlevleri (F#) ve Tür parametreleri (F#) statik olarak çözüldü.

Ayrıca bkz.

Diğer Kaynaklar

Üyeler (F#)