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źć.
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źć.
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
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
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. –
Dzięki, zrobimy to w przyszłości. –