在F#中内置了两个很有用的运算符 |> 和 >> ,用来串联数据和函数,有效减少括号的使用,让代码不那么lispy。这两个符号的定义很简单,在Ocaml中也一样可以方便使用。
运算符 |> 定义:
[code]let (|>) x f = f x
val (|>) : 'a -> ('a -> 'b) -> 'b[/code]
例子:形如[code]f(g(h(i(x))))[/code]可以写成[code]x |> i |> h |> g |> f[/code]
依此类推(抱歉,例子抽象了点)
运算符 >> 定义:
[code]let (>>) f g x = g(f(x))
val (>>) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)[/code]
例子:形如[code]f(g(h(i(x))))[/code]可以写成[code]i >> h >> g >> f >> x[/code]
注意这个类似Haskell里所谓point free style的.运算符,但是运算顺序正好相反。
运算符.的Haskell定义:
[code]let (.) f g x = f(g(x))
(.) :: (b -> c) -> (a -> b) -> a -> c[/code]
这点从它们的类型签名也能看出来。所以,Haskell的定义符合复合函数的数学定义,但是读起来得从右向左读。而F#的定义符合从左向右读的直觉习惯,各有千秋。
这种函数串联然后再整体作用到数据上的编程风格好像也叫tacit programming。。。
Ruby中在Proc类中定义运算符也能达到类似的串联效果,当然Ruby只能重定义那么几个已经存在的运算符,不能凭空造新运算符:(
运算符 |> 定义:
[code]let (|>) x f = f x
val (|>) : 'a -> ('a -> 'b) -> 'b[/code]
例子:形如[code]f(g(h(i(x))))[/code]可以写成[code]x |> i |> h |> g |> f[/code]
依此类推(抱歉,例子抽象了点)
运算符 >> 定义:
[code]let (>>) f g x = g(f(x))
val (>>) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)[/code]
例子:形如[code]f(g(h(i(x))))[/code]可以写成[code]i >> h >> g >> f >> x[/code]
注意这个类似Haskell里所谓point free style的.运算符,但是运算顺序正好相反。
运算符.的Haskell定义:
[code]let (.) f g x = f(g(x))
(.) :: (b -> c) -> (a -> b) -> a -> c[/code]
这点从它们的类型签名也能看出来。所以,Haskell的定义符合复合函数的数学定义,但是读起来得从右向左读。而F#的定义符合从左向右读的直觉习惯,各有千秋。
这种函数串联然后再整体作用到数据上的编程风格好像也叫tacit programming。。。
Ruby中在Proc类中定义运算符也能达到类似的串联效果,当然Ruby只能重定义那么几个已经存在的运算符,不能凭空造新运算符:(