2010-02-05 6 views
9

Existe-t-il un moyen de définir vos propres opérateurs en F #?Pouvez-vous définir vos propres opérateurs en F #?

Si oui, quelqu'un peut-il me donner un exemple pour cela? J'ai cherché brièvement, mais je n'ai rien trouvé.

+0

Pour votre future référence Joan - le concept est appelé la surcharge de l'opérateur. Si vous utilisez Google F # et la surcharge d'un opérateur, vous en trouverez un peu sur le sujet. –

+0

Merci, le fera à l'avenir. –

Répondre

25

Oui:

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

Les caractères qui peuvent être utilisés dans un opérateur F # sont répertoriés dans section 3.7 of the spec. Ils sont !%&*+-./<=>@^|~ et pour tout caractère après le premier, ?. La préséance et la fixité sont déterminées par le premier caractère de l'opérateur (voir la spécification).

Vous pouvez créer vos propres opérateurs let-bound comme je l'ai fait ci-dessus, auquel cas ils fonctionnent comme des fonctions let-bound. Vous pouvez également les définir en tant que membres d'un type:

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

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

Dans ce cas, vous n'avez pas besoin d'avoir une pré-défini une fonction liée à laisser utiliser l'opérateur; F # le trouvera sur le type. Vous pouvez prendre particulièrement bon avantage de cela en utilisant des définitions inline:

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

Prenant encore plus loin, vous pouvez faire en ligne les opérateurs sur vos types aussi bien, de sorte que vous pouvez les utiliser sur une variété encore plus large des instances de votre classe:

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

section 4.4 (http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html) contient plus d'informations sur les opérateurs infixes et les caractères autorisés. – nlucaroni

Questions connexes