F#入门-第三章 功能性-第五节 运算符的优先顺序

    如果理解了运算符的优先顺序与结合性,那么管道运算符的执行机制也变得容易理解了,本节对此进行介绍。

    在F#中,运算符存在优先顺序与结合性,这两者是运用运算符进行表达式的计算时,是按什么顺序依次执行表达式各部分的计算的决定因素。

    基本上是先执行优先级高的运算部分,优先级相等时按结合性决定运算顺序。结合性分为两种,从右往左进行的计算称为右结合,从左往右的计算称为左结合。大部分的运算符(特别是函数运用)都是左结合,同时,表达式被()括起来的时候,先执行()中的运算。

    首先,举个优先顺序不同的例子。因为加法运算的优先级比乘法运算的优先级低,所以以下表达式的运行结果相同。

结合的强度
1   2 * 3  4 * 5   6;;
1 (2 * 3) (4 * 5) 6;;


    同时,结合的强度相等时由结合性决定运算顺序。在下例中,可以确认**(冪)是右结合的。

结合性
> 2.0 ** 3.0 ** 2.0;;
val it : float = 512.0
> 2.0 ** (3.0 ** 2.0);;
val it : float = 512.0
> (2.0 ** 3.0) ** 2.0;;
val it : float = 64.0


    要理解函数调用的顺序,必须要记住“F#的函数全部为单参数函数”。

函数调用
let h x = x * 2;;
let f x y z = x y z;;
//以下三个为相同意思
f 1 2 3;;
(f 1) 2 3;;
((f 1) 2) 3;;

//错误,执行了(f 1) ((2 3) 4)
f 1 2 3 4;; //与函数(f 1)的加法运算尚未定义
h 1 2;; //(h 1) 2。不是h (1 2)
h(1 2);;
1 h 2;; // 1 (h 2)
2 3;; //错误。这样不被看作是函数调用。


    全部函数为单参数时,连续调用函数时就有点不方便。

    譬如下面这个例子。

想要进行函数合成
> let f x = x   1;;
val f : int -> int
> let g x = x * 2;;
val g : int -> int
> f g 3;; //错误
> f (g 3);; //这样是正确的
//譬如这样写就很不方便
> f (g (h (i (j (k x)))))


    这种情况下,可以使用管道运算符。

使用管道运算符的例子
let f x = x   1;;
let g x = x * 2;;
let h x y = x y;;
3 |> g |> f |> f |> f;; //计算 (f (f (f (g 3))))
f <| f <| f <| g 3;; //这样是错误的
h <| f 2 <| g 3;; //但是这样是正确的

    另外,在允许不带参数的语言中(基本上所有的语言都是这样的),有可以书写象f g 3这种写法的语言。例如perl中

与其他语言的比较
//F#
let print x = printfn "%d" x in
print 1 2 * 3;; //这样是错误的 执行了(print 1) 2*3

#perl
#!/usr/bin/perl
print 1 2 * 3; #OK

    虽然这样写比较清晰,因而受人欢迎,但是使用柯里化处理起来也很方便。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值