F#基础教程 操作符

      在F#中,你可以使用运算符更加美观的调用函数。F#提供了两种不同的运算符,前缀和中缀。一个前缀运算符应用于一个操作数,而中缀运算符应用于两个或更多。前缀运算符出现在操作数之前,而中缀运算符出现在两个操作数之间。运算符加上()可以变成函数来使用,也可以认为他们是函数的一种简写方式。

      F#提供了丰富的运算符。可以应用于数字、逻辑、字符串和集合类型。F#和它的库中定义的运算符基本都包含在本书中,你会看到更多的使用方法与样例。

      与C#一样,F#中的运算符可以重载,这意味一个运算符可以应用于多个类型。与C#不同的是,两个操作数必须是同一类型,否则编译器将产生错误(不要质疑F#的约束,这是创建稳健系统更好的模式)。F#还允许用户重新定义运算符,我们将在本节的结尾讨论如何做。

      运算符遵循C#中重载规则;因此,任何定义在BCL中的类,或者任何.NET库,或在C#中定义的运算符重载都将在F#中得到支持。例如,你可以定义+运算符连接两个字符串(你也可以使用^),并添加System.TimeSpan与System.DataTime之间+的重载。例子如下。

#light
let ryhm = "Jack " + "and " + "Jill"
let anotherRyhm = "Wee " ^ "Willy " ^ "Winky"
open System
let oneYearLater =
  DateTime.Now + new TimeSpan(365, 0, 0, 0, 0)

      用户可以定义自己的运算符,或重新定义任何现有的操作符新的运算(虽然这并不可取,因为会为以后的使用混淆)。考虑下面一个不正确的+运算符重新定义为执行减法的例子。

#light
let (+) a b = a - b
print_int (1 + 1)

      用户(自定义)运算符必须是非字母数字,你可以使用以下单个字符或一组字符。

!$%&*+-./<=>?@^|~
:

      自定义操作符可以是上面第一行的任何字符开头组合,也可以包含“:”,但不可以作为首字符。定义操作符使用let关键字,除了操作符作为函数名并用括号包围,方式与定义函数相同。用括号包围操作符告诉编译器这是一个操作符,而不是一组操作。而实际上这也是一个函数名,你可以用前缀的方式使用它。下面给出一个示例:

#light
let ( +:* ) a b = (a + b) * a * b
printfn "(1 +:* 2) = %i" (1 +:* 2)

 执行结果:
(1 +:* 2) = 6

     一元操作符在操作数之前,二元操作符在操作数之间。

posted @ 2011-11-23 13:56  银河系漫游指南  阅读(486)  评论(0编辑  收藏  举报