almost 3 years ago

什麼是合成函數(fucntion composition)

在Wiki的定義中是這麼描述的-"In mathematics, function composition is the pointwise application of one function to the result of another to produce a third function."
簡單的方式可以理解成函數的參數也為函數,這句話有點饒口對吧!!舉例來說,
$$\sum_{a}^{b}g(x)$$

這是一個常見的加總運算,其中a, b, g(x)均為這個加總運算的參數,若我們想以函數表示,則可以表示為
this is common summation function, where a, b, and g(x) are parameters of the function. if we want to notice
$$f(a,b,g(x))=\sum_{a}^{b}g(x)$$
f(a,b,g(x))即為一個合成函數.

Scala中的函數

在Scala中可以使用I=>O表示為一個參數型別為I,回傳型別為O的函數,如

val f1:Double=>Double=x=>Math.pow(x) //f1(x)=x^2
val f2:(Double,Double)=>Double=(x,y)=>Math.pow(x,2)+Math.pow(y,2) //f2(x)=x^2+y^2

其中x, y可用任意變量名表示.
到目前為止,可能有人已經想到如何在Scala中實現合成函數了,但在此之前,我們先以遞迴的方式實作加總運算函數f(a,b,g(x)),

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

注意
在這裡我限制了g(x)的參數(x)及輸出值均為整數類型(Int=>Int)。

val constant:Int=>Int=x=>x
val pow:Int=>Int=x=>Math.pow(x,2).toInt //pow is a function that Int to Int

f(1,10,constant) 
f(1,10,pow)

等等!!這樣就就結束了嗎??當然沒有,在Scala中我們還可以使用更簡潔的寫法,

val fc: ((Int) => Int) => Int =f(1,10,_)
//or
val fc =f(1,10,_:Int => Int)

這裡我們用"_"取代了g:Int=>Int, fc的型別為((Int) => Int) => Int, 我們可以將fc理解為參數型別(Int) => Int,回傳型別Int的函數. 這樣做的好處在於可以減少代碼的重複性, 如下

fc(constant) //as like f(1,10,constant) 
fc(pow) //f(1,10,pow) 

注意
以下的寫法會造成編譯失敗,因為編譯器不知道""是什麼型別,所以必須指定的型別才能編譯通過

val fc =f(1,10,_)

http://www.elasticmining.com/blog/

Scala中的Currying →