YangMark

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

Currying是一種函數式編程技巧, 指的是把接受多個參數的函數變換成接受一個單一參數的函數。

以一個簡單的例子在Scala中實現..

def f(a:Int, b:Int)={
    a+b
  }
//f(2,3)=5

//Currying
 def curried(a:Int)(b:Int){
    a+b
  }
//f(2)(3)=5
 
看起來只是改變了放置參數的位置而已, 又有什麼用呢??
 
讓我們換個例子, 現在我們要實作出的Sumation函數,
\sum_a^b f(x)
 
而且其中f(x)是可代換的, 如,

f(x)=x!, f(x) =x^2…....等

先來看看Currying的Sumation函數的代碼吧!!

def sumation(func:Int=>Int )(a:Int,b:Int):Int={
    if (a+1>b) 0
    else  sumation(func)(a+1,b)+func(a)   
   
  }

由Curring我拆成兩部分的參數

(func:Int=>Int ): 表示f(x)

(a:Int,b:Int): 表示Sumation的上下限範圍

這麼做的好處在於以代碼切分不同函數的概念不至於混雜, 增加代碼的可讀性與維護性

接下來讓我們來實作factorial函數

 
def factorial(n:Int):Int={
    if (n==0) 1 else n*factorial(n-1)
  }
  sumation(factorial)(1,3)
  //res0: Int = 9
   
 
 
 
 
posted on 2014-05-26 16:16  YangMark  阅读(283)  评论(0编辑  收藏  举报