东莞市盛裕绒艺玩具有限公司

东莞市盛裕绒艺玩具有限公司

金钻最新网址

15196856554
联系方式
全国服务热线: 15196856554

咨询热线:18839586270
联系人:江海霞
地址:新疆维吾尔自治省乌鲁木齐市乌鲁木齐市西虹西路554号

函数式编程之-组合函数

来源:金钻最新网址   发布时间:2019-11-08   点击量:360

组合

函数式编程的核心在于组合,其中之一就是如何组合函数。我们在Currying一文就提到过组合,我们当时是这样描述的:只有一个输入和一个输出的函数才能完成组合,当然并不是所有的函数都只有一个输入,Currying可以帮助我们把多个输入参数的函数变成只有一个输入的函数。那么到底什么是组合,怎么组合?给定下面的两个函数:组合上面的两个函数:变成下面的函数:看个例子:

let add1 x = x + 1 let multiply2 x = x * 2let compose g f x = f(g(x))

对应的函数类型为:

add1 : x:int -> intmultiply2 : x:int -> intcompose : g:("a -> "b) -> f:("b -> "c) -> x:"a -> "c

通过compose函数来把add1和multiptly2组合起来:

let add1ThenMultiply2 x = compose add1 multiply2

从而得到新的函数:

let result = add1ThenMultiply2 10

既然compose这个函数在F#这么常用,不如定义一个操作符>>来表示:

let (>>) f g x = g ( f(x) )

因此上面的代码也可以通过>>来组合:

let add1ThenMultiply2 x = (>>) add1 multiply2

由于操作符支持中缀表达式,也即操作符可以写在两个参数的中间,例如+号:

(+) 1 3

实际上可以写为:

1 + 3

那么上面的代码就可以写成:

let add1ThenMultiply2 x = add1 >> multiply2

组合和管道符的区别

上面的例子我们还可以用管道符来实现:

let result1 = 10 |> add1 |> multiply2

管道符和组合的定义看起来非常相似:

let (|>) x f = f xlet (>>) f g x = g ( f(x) )

管道符(|>)接受两个参数,在往下一个管道符传递的时候已经完成了求值,而函数组合实际上生成了新的函数,最后一步传入实际的参数才会完成求值。下面的图示描述了管道符的求值过程:

相关产品

COPYRIGHTS©2017 金钻最新网址 ALL RIGHTS RESERVED 备案号:360