zoukankan      html  css  js  c++  java
  • 函数式编程之-组合函数

    组合

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

    组合上面的两个函数:

    变成下面的函数:

    看个例子:

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

    对应的函数类型为:

    add1 : x:int -> int
    multiply2 : x:int -> int
    compose : g:('a -> 'b) -> f:('b -> 'c) -> x:'a -> 'c
    

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

    let add1ThenMultiply2 x = compose add1 multiply2
    
    从而得到新的函数: ```fsharp let result = add1ThenMultiply2 10 ``` 既然compose这个函数在F#这么常用,不如定义一个操作符`>>`来表示: ``` fsharp let (>>) f g x = g ( f(x) ) ``` 因此上面的代码也可以通过>>来组合: ```fsharp let add1ThenMultiply2 x = (>>) add1 multiply2 ``` 由于操作符支持中缀表达式,也即操作符可以写在两个参数的中间,例如+号: ```fsharp (+) 1 3 ``` 实际上可以写为: ```fsharp 1 + 3 ``` 那么上面的代码就可以写成: ```fsharp let add1ThenMultiply2 x = add1 >> multiply2 ``` ## 组合和管道符的区别 上面的例子我们还可以用管道符来实现: ``` fsharp let result1 = 10 |> add1 |> multiply2 ``` 管道符和组合的定义看起来非常相似: ```fsharp let (|>) x f = f x let (>>) f g x = g ( f(x) ) ``` 管道符(|>)接受两个参数,在往下一个管道符传递的时候已经完成了求值,而函数组合实际上生成了新的函数,最后一步传入实际的参数才会完成求值。 下面的图示描述了管道符的求值过程:
  • 相关阅读:
    iOS开发---业务逻辑
    iOS 蓝牙功能 bluetooth
    iOS 企业版 安装失败 原因
    iOS 生命周期 -init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 区别和用途
    iOS 7 修改默认布局从status bar 底部开始
    企业打包时不能安装原因
    UISegmentedControl 功能简单 分析
    ios 推送 证书配置
    ios 获取手机设备信息
    创建quickstart报错
  • 原文地址:https://www.cnblogs.com/xiandnc/p/9326823.html
Copyright © 2011-2022 走看看