FP中减少括号的语法糖

阅读更多
在F#中内置了两个很有用的运算符 |> 和 >> ,用来串联数据和函数,有效减少括号的使用,让代码不那么lispy。这两个符号的定义很简单,在Ocaml中也一样可以方便使用。

运算符 |> 定义:

let (|>) x f = f x
val (|>) : 'a -> ('a -> 'b) -> 'b


例子:形如
f(g(h(i(x))))
可以写成
x |> i |> h |> g |> f

依此类推(抱歉,例子抽象了点)

运算符 >> 定义:

let (>>) f g x = g(f(x))
val (>>) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)


例子:形如
f(g(h(i(x))))
可以写成
i >> h >> g >> f >> x


注意这个类似Haskell里所谓point free style的.运算符,但是运算顺序正好相反。

运算符.的Haskell定义:

let (.) f g x = f(g(x))
(.) :: (b -> c) -> (a -> b) -> a -> c


这点从它们的类型签名也能看出来。所以,Haskell的定义符合复合函数的数学定义,但是读起来得从右向左读。而F#的定义符合从左向右读的直觉习惯,各有千秋。

这种函数串联然后再整体作用到数据上的编程风格好像也叫tacit programming。。。

Ruby中在Proc类中定义运算符也能达到类似的串联效果,当然Ruby只能重定义那么几个已经存在的运算符,不能凭空造新运算符:(

你可能感兴趣的:(FP,Haskell,F#,Ruby,C#)