2010-02-05 94 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

相关问题