2016-10-31 100 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