2016-10-31 133 views
5

我想實現一個(簡單)的數學函數除了在F#,意思是:F#功能附加

想象˚F是的所有功能,其中一個元素映射到元素領域乙enter image description here

我曾嘗試以下合作: enter image description here
然後,我的「功能除了」應定義如下德實現的功能附加在操作員!+

let inline (!+) (f1 : ^a -> ^b, f2 : ^a -> ^b) : ^a -> ^b = 
    let f (x : ^a) : ^b = 
     (f1 x) + (f2 x) 
    f 

但是,如果我想要編譯以下行,我會得到一個錯誤:

let f1 x : float = -x // negate x 
let f2 x : float = 2. * x // multiply by 2 
let f3 = f1 !+ f2 //error : Expexceted `float`, got `'a -> 'b` 

我敢肯定,這是造成一些簡單的邏輯錯誤,但我還沒有找到它。
因此,我的問題是:如何定義F#中的函數添加?

回答

8

非常接近! 兩個主要問題:

  • !+是一元運算符。對於F#運營商,請參閱the rules。你的功能是取元組。這不是咖喱。

糾正它,你得到它的工作:

let inline (++) (f1 : ^a -> ^b) (f2 : ^a -> ^b) : ^a -> ^b = 
    let f (x : ^a) : ^b = 
     (f1 x) + (f2 x) 
    f 

let f1 x : float = -x 
let f2 x : float = 2. * x 
let f3 = f1 ++ f2 

讓我補充一點,你不需要任何類型的註釋,F#將弄清楚你:

let inline (++) f1 f2 x = f1 x + f2 x 

如果你讀了簽名,你會注意到你的函數可以有任何輸入類型,只是結果類型應該匹配:

let inline f1 x = -(float x) 
let f2 x : float = float (2 * x) 
let f3 = f1 ++ f2 
+0

非常感謝你,先生! – Unknown6656