2010-02-05 12 views
9

Czy istnieje sposób definiowania własnych operatorów w F #?Czy potrafisz zdefiniować własne operatory w F #?

Jeśli tak, to ktoś może podać mi przykład? Szukałem krótko, ale nie mogłem nic znaleźć.

+0

Dla twojego przyszłego odniesienia Joan - pojęcie to nazywa się przeciążeniem operatora. Jeśli masz Google F # i przeciążenie operatora, znajdziesz dość sporo na ten temat. –

+0

Dzięki, zrobimy to w przyszłości. –

Odpowiedz

25

Tak:

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

Znaki, które mogą być używane w F # operatora są wymienione w section 3.7 of the spec. Są one !%&*+-./<=>@^|~ i dla każdej postaci po pierwszej, ?. Pierwszeństwo i stałość są określane przez pierwszy znak operatora (patrz specyfikacja).

Można tworzyć własne operatory typu "wyślijmy", tak jak to zrobiłem powyżej, w takim przypadku działają one tak samo, jak funkcje z włączonym dostępem. Można również zdefiniować je jako członków w rodzaju:

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

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

W tym przypadku nie trzeba się wstępnie zdefiniowanych funkcji zawód związany użyć operatora; F # znajdzie go na typie. Można wziąć szczególnie dobrze wykorzystać to przy użyciu definicji inline:

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

Biorąc to jeszcze dalej, można dokonać operatorów na swoim rodzaju inline, jak również tak, że można z nich korzystać na jeszcze szerszej gamy wystąpień twoja klasa:

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

sekcja 4.4 (http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html) zawiera więcej informacji na temat operatorów infiksów i dopuszczalnych znaków. – nlucaroni

Powiązane problemy