2010-02-05 10 views
9

Kendi operatörlerinizi F # içinde tanımlamanın bir yolu var mı?Kendi operatörlerinizi F # olarak tanımlayabilir misiniz?

Böyle bir kişi bana bir örnek verebilir mi? Kısaca aradım ama hiçbir şey bulamadım.

+0

Gelecekte başvurulacaklarınız için Joan - konsept operatör aşırı yükleme olarak adlandırılır. Google F # ve Operatör Aşırı Yüklemesi durumunda konuyla ilgili biraz bilgi bulacaksınız. –

+0

Teşekkürler, bunu gelecekte yapacak. –

cevap

25

Evet:

let (+.) x s = [for y in s -> x + y] 
let s = 1 +. [2;3;4] 

bir F # operatörü kullanılabilir karakterler section 3.7 of the spec listelenmiştir. Bunlar !%&*+-./<=>@^|~ ve ilk ?'dan sonraki herhangi bir karakter içindir. Öncelik ve sabitlik operatörün ilk karakteri ile belirlenir (speklere bakınız).

Yukarıda yaptığım gibi kendi izinli operatörlerinizi oluşturabilirsiniz, bu durumda yalnızca izin verilen işlevler gibi çalışırlar. Ayrıca, bir türüne üyeleri olarak onları tanımlayabiliriz:

type 'a Wrapper = Wrapper of 'a with 
    static member (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y) 

let w = (Wrapper 1) +! (Wrapper 2) 

Bu durumda, operatörünü kullanmak için izin bağlı fonksiyon önceden tanımlanmış olması gerekmez; F # bunu türünde bulacaktır. Bunu kullanarak satır içi tanımlarının özellikle iyi yararlanabilirsiniz:

let inline addSpecial a b = a +! b 
let w2 = addSpecial w (Wrapper 3) 

daha da ileri alırsak, satır içi hem de sizin türlerinde operatörleri yapabilir, örnekleri daha da geniş bir çeşitlilik bunları kullanabilmesi için Sınıfınız:

type 'a Wrapper = Wrapper of 'a with 
    static member inline (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y) 

let wi = (Wrapper 1) +! (Wrapper 2) 
let wf = (Wrapper 1.0) +! (Wrapper 2.0) 
let wi2 = addSpecial wi wi 
let wf2 = addSpecial wf wf 
+3

bölüm 4.4 (http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html) infix operatörleri ve hangi karakterlerin izin verilebileceği hakkında daha fazla bilgiye sahiptir. – nlucaroni

İlgili konular