zoukankan      html  css  js  c++  java
  • Function(高阶函数式编程)

    Function一个可以进行高阶函数式编程的模块。

    chain

    def chain[a](fs: Seq[(a) ? a]): (a) ? a

    把一些列的方法串起来,挨个执行,每个方法的结果,回作为下一个方法的入参

    /**定义两个函数*/
      def fun1 = (v:Int) => {
        val result = v * 10
        println(result)
        result
      }
      def fun2 = (v:Int) => {
        val result = v * 100
        println(result)
        result
      }
      //使用
        val funs = Seq(fun1,fun2)
        Function.chain[Int](funs)(2) 
    
    运行原理:fun1的结果作为fun2的入参
    结果打印
    20
    2000

    const

    def const[T, U](x: T)(y: U): T

    这是一个返回常量的方法,直接返回 x 值

    假如我们要把一个序列中的元素替换成同一个值,可以使用
    List(1, 2, 3, 4, 5).map(_=>7)
    我们可以用const来处理
    List(1, 2, 3, 4, 5).map(Function.const(7))

    tupled

    def tupled[a1, a2, b](f: (a1, a2) ? b): ((a1, a2)) ? b

    将二元函数转换为一个一元函数,参数为Tuple2类型

    def tupleFunc = (a:Int,b:Int) => {
        a+b
      }
      /**使用*/
    val funs = Function.tupled(tupleFunc)
    val v = (1,3)
    println(v.getClass.getName)
    println(funs(v))

    def tupled[a1, a2, a3, b](f: (a1, a2, a3) ? b): ((a1, a2, a3)) ? b
    同 tupled[a1, a2, b] def tupled[a1, a2, a3, a4, b](f: (a1, a2, a3, a4) ? b): ((a1, a2, a3, a4)) ? b
    同 tupled[a1, a2, b]

    def tupled[a1, a2, a3, a4, a5, b](f: (a1, a2, a3, a4, a5) ? b): ((a1, a2, a3, a4, a5)) ? b
    同 tupled[a1, a2, b]

    def untupled[a1, a2, b](f: ((a1, a2)) ? b): (a1, a2) ? b

    def tupleFunc = (v:Tuple2[Int,Int]) => {
      v._1 + v._2
    }
      //转换
    val funs = Function.untupled(tupleFunc)
     println(funs(2,6)) /** 8 */

    def untupled[a1, a2, a3, b](f: ((a1, a2, a3)) ? b): (a1, a2, a3) ? b
    同 tupled[a1, a2, b] def untupled[a1, a2, a3, a4, b](f: ((a1, a2, a3, a4)) ? b): (a1, a2, a3, a4) ? b
    同 tupled[a1, a2, b]

    def untupled[a1, a2, a3, a4, a5, b](f: ((a1, a2, a3, a4, a5)) ? b): (a1, a2, a3, a4, a5) ? b
    同 tupled[a1, a2, b]

    uncurried

    def uncurried[a1, a2, b](f: (a1) ? (a2) ? b): (a1, a2) ? b

    把一个柯里化函数转换为但 2 个参数的函数
    /**声明一个柯里化函数*/
    def curriedSum = (x:Int)=>(y:Int) => x + y
    //转换
    val funs = Function.uncurried(curriedSum)
    println(funs(1,6))      
    结果:7

    def uncurried[a1, a2, a3, b](f: (a1) ? (a2) ? (a3) ? b): (a1, a2, a3) ? b
    同 uncurried[a1, a2, b] def uncurried[a1, a2, a3, a4, b](f: (a1) ? (a2) ? (a3) ? (a4) ? b): (a1, a2, a3, a4) ? b
    同 uncurried[a1, a2, b]

    def uncurried[a1, a2, a3, a4, a5, b](f: (a1) ? (a2) ? (a3) ? (a4) ? (a5) ? b): (a1, a2, a3, a4, a5) ? b
    道理同 uncurried[a1, a2, b]

    unlift

    def unlift[T, R](f: (T) ? Option[R]): PartialFunction[T, R]
    将 A => Option[B] 类型的函数转换为 PartialFunction[T, R] 类型函数

    def optionFun(x : Int) = {
        println(x)
        if (x > 0) Some(x*10) else None
      }
      //使用
        val funs = Function.unlift(optionFun)
        val chars = Array(1,2,3)
        //collect需要PartialFunction类型参数
        val newchars = chars.collect(funs)
        println(newchars.mkString(","))
      /**输出为 10,20,30 */
  • 相关阅读:
    数据存储之使用MongoDB数据库存储数据
    数据存储之使用mysql数据库存储数据
    数据存储之json文件处理和csv文件处理
    python使用PyQt5,及QtCreator,qt-unified界面设计以及逻辑实现
    Tesseract-ocr视觉学习-验证码识别及python import pytesseract使用
    ubuntu crontab设置定时任务
    nginx+django线上部署
    PHP网站从Apache转移到Nginx后产生404错误的原因和解决办法
    收集的免费API接口
    C#中字符数组,字节数组和string之间的转化
  • 原文地址:https://www.cnblogs.com/yyy-blog/p/10448472.html
Copyright © 2011-2022 走看看