F#功能添加

时间:2016-10-31 14:00:09

标签: math f# functional-programming

我想在F#中实现一个(简单的)数学函数加法,意思是:

想象一下 F 是所有函数的字段,它将 A 元素映射到 B 元素: 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#中定义函数添加?

1 个答案:

答案 0 :(得分: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