2010-02-05 136 views
9

有沒有辦法在F#中定義自己的操作符?你可以在F#中定義你自己的操作符嗎?

如果有人能給我一個這樣的例子嗎?我簡單搜索了一下,但找不到任何東西。

+0

爲了您將來的參考瓊 - 這個概念被稱爲運算符重載。如果你使用Google F#和運算符重載,你會發現很多關於這個主題的內容。 – 2010-02-06 00:41:39

+0

謝謝,未來會這樣做。 – 2010-02-08 17:42:34

回答

25

是:

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

,可以在F#操作者使用的字符列於section 3.7 of the spec。它們分別是!%&*+-./<=>@^|~和之後的任何字符,?。優先級和固定性由操作員的第一個字符確定(請參閱規格)。

你可以像上面所做的那樣創建你自己的let-bound操作符,在這種情況下,它們就像let-bound函數一樣工作。您也可以將它們定義爲成員類型:

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

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

在這種情況下,你並不需要有預先定義的,讓綁定功能,使用操作; F#會在類型上找到它。你可以採取特別好的利用了這一點使用內置定義:

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

採取這一更進一步,可以使運營商在你的類型的內聯爲好,這樣就可以在一個更加廣泛的實例使用它們你的課程:

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

第4.4節(http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html)有關於中綴操作符的更多信息以及允許使用哪些字符。 – nlucaroni 2010-02-05 22:39:20

相關問題