我想在F#中实现一个(简单的)数学函数加法,意思是:
想象一下 F 是所有函数的字段,它将 A 元素映射到 B 元素:
然后,我的“功能添加”应定义如下:
我尝试了以下代码来实现函数添加作为运算符!+
:
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#中定义函数添加?
答案 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