当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

FP中减少括号的语法糖

发表于: 2006-12-30   作者:cookoo   来源:转载   浏览:
摘要: 在F#中内置了两个很有用的运算符 |> 和 >> ,用来串联数据和函数,有效减少括号的使用,让代码不那么lispy。这两个符号的定义很简单,在Ocaml中也一样可以方便使用。 运算符 |> 定义: let (|>) x f = f x val (|>) : 'a -> ('a -> 'b) -> 'b 例子:形如 f(
在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中减少括号的语法糖

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号