zoukankan      html  css  js  c++  java
  • scala学习手记25

    curry翻译为中文就是咖喱。意为使用curry可以让代码更有味道。

    scala里的curry化可以把函数从接收多个参数转换成接收多个参数列表。也就是说我们要编写的函数不是只有一个参数列表,这个参数列表中有多个参数以逗号分隔;而是一个函数中有多个参数列表,每个参数列表中只有一个参数(当然,也可以有多个参数)。也就是说我们写的函数不再只是这样子的:

    def foo(a: Int, b: Int, c: Int) {}

    而是这样子的:foo(1)(2)(3),或者这样的:foo(1){2}{3},甚至是这样子的:foo{1}{2}{3}。

    来看一下定义成多个参数列表的方法到底是什么样的。这次使用scala交互式shell会话:

    image

    按照上面所说我们定义了一个函数foo()。然后,调用foo_创建了一个偏应用函数,也就是说,这个函数有一个或多个参数未绑定。关于偏应用函数稍后会详细说,这次主要关注交互式shell提供的消息:先是三个一连串的转换,链中的每个函数都接收一个Int,返回一个偏应用函数。不过,最后一个的结果是Unit。

    现在可以使用curry化的形式重写一下inject方法:

    def inject(arr: Array[Int], initial: Int)(operation: (Int, Int) => Int): Int = {
      var carryOver = initial
      arr.foreach(element => carryOver = operation(carryOver, element))
      carryOver
    }

    这样一来,我们就不必在一个参数列表里用逗号分割的形式传递参数了。现在可以使用圆括号或花括号独立传递参数了:

    val array = Array(2, 3, 5, 1, 6, 4)
    val sum = inject(array, array(0)){
                  (carryOver, elem) => Math.max(carryOver, elem)
              }
    println("Max of elements in array [" + array.mkString(",") + "] is " + sum)

    是不是看起来更优雅了——虽然刚见到的时候理解有些困难,但是熟悉了这种语法后还是能体会到它的好处的。

    ########

  • 相关阅读:
    MySQl的绑定变量特性
    数数 / DP
    MODE
    题单
    对拍
    二、图论
    sync_with_stdio(false)的副作用
    九大编程语言
    Codeforces Round #575 (Div. 3) A B C
    Educational Codeforces Round 69 (Rated for Div. 2) A B C D
  • 原文地址:https://www.cnblogs.com/amunote/p/5709211.html
Copyright © 2011-2022 走看看