按位运算
整数基本类型在二进制数值中支持操纵按位运算符,运算符通常用于在读取和写入二进制数据文件,下面的表中列出了按位运算的规则:
Operator |
Description |
Example |
Result |
&&& |
Bitwise ‘And’ |
0b1111 &&& 0b0011 |
0b0011 |
||| |
Bitwise ‘Or’ |
0xFF00 ||| 0x00FF |
0xFFFF |
^^^ |
Bitwise ‘Exclusive Or’ |
0b0011 ^^^ 0b0101 |
0b0110 |
<<< |
Left Shift |
0b0001 <<< 3 |
0b1000 |
>>> |
Right Shift |
0b1000 >>> 3 |
0b0001 |
字符类型
由于.NET平台是基于Unicode,所以字符是用2个字节UTF - 16编码来表示的。要定义一个字符值,可以用单引号里面包含Unicode字符,也可以指定使用16进制的Unicode字符代码,下面用字符类型定义了一个字符列表以及用一个十六进制定义了一个字符并且打印出来。
> let hello = ['h';'e';'l';'l';'o'];;
val hello : char list = ['h'; 'e'; 'l'; 'l'; 'o']
> printfn "%c%c%c%c%c" '/u0068' '/u0065' '/u006c' '/u006c' '/u006f';;
hello
val it : unit = ()
>
为了表示特殊的控制字符,你需要使用到转义字符,这跟其它的语言的用法是相同的,都是用一个反斜杠连着特殊的字符。
转义符 字符名
/' 单引号
/" 双引号
// 反斜杠
/0 空字符
/a 感叹号(Alert )
/b 退格
/f 换页
/n 新行
/r 回车
/t 水平 tab
/v 垂直tab
如果您想获取的。NET字符的Unicode值的数字表示,可以使用到类似于C#中的强制转换操作,比如"let i = int 'i';;",将会把i绑定到值105;除此之外,你也可以在一个字符的后面增加"B"后缀来获取一个字符的字节,比如" let byt = 'A'B;;",将得到"val byt : byte = 65uy"。
字符串类型
字符串就是用一对双引号包含起来的一系列字符,它可以跨越多行。要访问从一个字符串的字符,可以使用索引语法.[],字符序号从零开始索引。
> let password = "abracadabra";;
val password : string = "abracadabra"
> let multiline = "This string
takes up
multiple lines";;
val multiline : string = "This string
takes up
multiple lines";;
> multiline.[0];;
val it : char = 'T'
> multiline.[1];;
val it : char = 'h'
> multiline.[2];;
val it : char = 'i'
> multiline.[3];;
如果您想指定一个长字符串,你可以使用一个反斜杠("/")在多行之间将其拆分,如果一个字符串行中的最后一个字符是一个反斜杠,该字符串继续下一行后将删除所有空白字符。
> let longString = "adc-/
- def-/
- ghi";;
val longString : string = "adc-def-ghi"
你也可以在字符串中使用转义字符,如/t或//,比如 "let str = "/"Hello/"";;"将会把"hello"完整的打印出来,除此之外,如果我们在字符串需要显示一些特殊字符,我们还可使用@符号。在@符号后面的字符将会被完整的解析,即使包含有转义字符。
类似于在一个字符后面添加一个B字符后缀,将会转换成一个字节样,在一个字符串后面增加一个B字符后缀,这个字符串将会一个字节列表。
> let hello = "Hello"B;;
val hello : byte array = [|72uy; 101uy; 108uy; 108uy; 111uy|]
布尔值
对于处理一个值只能是为true或false,F#中可以使用bool类型,对应.NET的System.Boolean,在F#中,标准的bool类型操作有&&、||、not三种,C#中经常使用的!在F#被not代替了。F#使用bool表达式时将使用短路进行判断,意思就是在两个bool表达式中,如果第一个值已经被确定了,那么第二个值将不再被判断,例如 true || 2=3,将被判断为true,并且不再判断2=3是否为true或false; false && 2=2,将被判断为false,也不再判断2=2是否为true或false。这个也说明了在编写程序时,在bool表达式判断中,要把尽可能发生的事物写在最前面了,否则将会引发错误。比如在Java语言中如果这样写"if obj.getXXX() == null || obj == null",如果obj是null值的情况下,程序将会发生异常,因为在表达式中首先判断的是"obj.getXXX() == null "。但是这个语句在C#中并不会出错,因为C#不是使用短路判断的。这里需要注意的是等号"="在F#不是代表赋值,而且判断两个值是否相等,返回的结果为bool值,下面给出bool操作示例:
let printTruthTable f =
printfn " |true | false |"
printfn " +-------+-------+"
printfn " true | %5b | %5b |" (f true true) (f true false)
printfn " false | %5b | %5b |" (f false true) (f false false)
printfn " +-------+-------+"
printfn ""
();;
val printTruthTable : (bool -> bool -> bool) -> unit
> printTruthTable (&&);;
|true | false |
+-------+-------+
true | true | false |
false | false | false |
+-------+-------+
val it : unit = ()
> printTruthTable (||);;
|true | false |
+-------+-------+
true | true | true |
false | true | false |
+-------+-------+
val it : unit = ()
比较与相等
在F#中,使用大于、等于、小于来比较两数值之间大小,除了compare操作返回-1、0、1分别代表小于、等于、大于之外,其余的比较操作符都返回一个bool值,如下表格所示:
Operator |
Example |
Result |
< |
1 < 2 |
true |
<= |
4.0 <= 4.0 |
true |
> |
1.4e3 > 1.0e2 |
true |
>= |
0I >= 2I |
false |
= |
"abc" = "abc" |
true |
<> |
'a' <> 'b' |
true |
compare |
compare 31 31 |
0 |