2011-07-24 74 views
2

我試圖創建一個純函數,返回的另外兩個純函數的乘法功能:純函數,返回d

pure Func multiplyFunctions(Func,Real)(scope const Func f1, scope const Func f2) 
{ 
    return (Real a) { return f1(a) * f2(a); }; 
} 

不幸的是,我遇到了問題,一個號碼,我想聲明f1和f2是純函數/委託/類與opCall定義...這是必需的,因爲我從純函數調用它們。

但有兩個號碼,似乎是最有問題的是,我想F1和F2是一個功能,「真正的」變量返回一個「真實」的價值......但我想不出如何模板了這一點...

人有什麼想法?

+0

我一直在試圖清理[標籤:純]標籤,因爲它有時指的是純虛函數,有時[純](http://beebole.com/pure/),有時爲[純](http://en.wikipedia.org/wiki/Pure_(programming_language)) - 等等。但我對[tag:d2]一無所知。你能確認我的標籤編輯是否合適嗎?對於這個問題,我會創建[tag:pure-function],所以如果[tag:purely-functional]工作,我認爲使用現有的標籤會更好。 –

回答

3

首先,去掉scope;這是錯誤的,因爲代表的範圍是逃脫的。

其次,你可以試試:

real delegate(real) multiplier(const real delegate(real) pure f1, 
           const real delegate(real) pure f2) pure 
{ 
    real multiply(real val) { return f1(val) * f2(val); } 
    return &multiply; 
} 

您也可以嘗試使用模板這樣做,雖然沒有太多的理由:

pure auto multiplier(alias F1, alias F2)(ParameterTypeTuple!F1 args) 
{ 
    return F1(args) * F2(args); 
} 

real square(real a) pure { return a * a; } 

alias multiplier!(square, square) squareMultiplier; 

//Now squareMultiplier is a multiplier of square() 

注意,有錯誤在編譯器不允許純度是100%正確的,所以你現在只需要忍受它們。

+1

如果我不使用委託,而是使用函數指針呢?或指定了opCall的類?這些可以隱式更改爲委託?我喜歡第二個版本,並且必須研究這個問題,(它可以採用任何一組參數,只要F1和F2相同)。另外,你是什麼意思的錯誤?我知道你不能將代表投向const(代表),並且純度已經被削弱了,還有其他人嗎?謝謝! –

+0

還有一件事,對於第二部分,如果函數在編譯時不知道,我還可以使用別名方法嗎? –

+1

@Andrew:*您不能使用*函數指針,因爲根據定義,函數指針沒有*狀態* - 即它們無法「記住」你的兩個功能。至於有'opCall'的類,如果你朝那個方向走,使用第二個版本;第一個版本不適合它。 :)通過錯誤,我的意思是說,你最終會遇到一些問題,即事實上應該是純粹的東西將無法(例如嘗試將內部函數聲明爲「純」......),因爲他們仍在努力。不過,DMD 2.055應該有很多改進。 我現在不知道其他人。 – Mehrdad