curry in scala

/**
 * Created by DGA on 2016/2/2.
 */
// 定义一个trait包含了curry和uncurry方法
trait Given {
  def curry[A,B,C](f:(A,B) => C) : A => B => C
  def uncurry[A,B,C](f:A => B => C): (A,B) => C
}

object Impl extends Given {
  // 因为uncurry更容易理解,先实现uncurry
  // 大括号里的=后面是文字函数(lambda),有两个参数,返回一个函数。
  // 返回的函数作为uncurry的第二个参数
  // Finally it returns the value of the second function.
  def uncurry[A,B,C](f:A => B => C): (A,B) => C = { (a: A, b: B) => f(a)(b) }

  // 大括号里的=后面是文字函数
  // 它有一个参数,返回一个新函数 curry()
  // returns a function which when called returns another function
  def curry[A,B,C](f:(A,B) => C) : A => B => C = { (a: A) => { (b: B) => f(a,b) } }
}

test in scala console

def add(a: Int, b: Long): Double = a.toDouble + b
val spicyAdd = Impl.curry(add)
println(spicyAdd(1)(2L)) // prints "3.0"
val increment = spicyAdd(1) // increment holds a function which takes a long and adds 1 to it.
println(increment(1L)) // prints "2.0"
val unspicedAdd = Impl.uncurry(spicyAdd)
println(unspicedAdd(4, 5L)) // prints "9.0"
def curry[A,B,C](f:(A,B) => C): A => B => C = 
  a => b => f(a,b)

a => b => f(a,b) 的意思是带一个参数a的函数,返回的值是b => f(a,b) ,它又是带一个参数b的函数,返回值是执行函数 f(a,b) (类型是 C)”

 { (a: A) => {           // 带一个参数的函数, `a`
      (b: B) => {        // 带一个参数的函数, `b`
         f(a, b)         // 返回值`f(a,b)` (类型 `C`)
      }
   }
 }
def uncurry[A,B,C](f:A => B => C): (A,B) => C = 
  (a, b) => f(a)(b)

(a, b) => f(a)(b)的意思是 “有两个参数的函数 (a, b), 它的返回值是高阶函数f(a),它返回一个函数f(b),返回值C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值