FP中减少括号的语法糖

本文介绍F#中的|>与>>运算符及Ocaml中的相似用法,用于简化函数调用和数据处理流程。这些运算符允许程序员以直观的方式组合多个函数,减少了括号的使用,使得代码更加清晰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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只能重定义那么几个已经存在的运算符,不能凭空造新运算符:(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值