unk*_*656 5 math f# functional-programming
我想在F#中实现一个(简单的)数学函数加法,意思是:
想象一下F是所有函数的字段,它将A的元素映射到B的元素:
然后,我的"功能添加"应定义如下:

我尝试了以下代码来实现函数添加作为运算符!+:
let inline (!+) (f1 : ^a -> ^b, f2 : ^a -> ^b) : ^a -> ^b =
let f (x : ^a) : ^b =
(f1 x) + (f2 x)
f
Run Code Online (Sandbox Code Playgroud)
但是,如果我想编译以下行,我将收到一个错误:
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`
Run Code Online (Sandbox Code Playgroud)
我很确定,它是由一些简单的逻辑错误引起的,但我还是找不到它.
因此我的问题是:如何定义F#中的函数添加?
相当接近 !两个主要问题:
!+是一元运算符.请参阅F#运算符的规则.
你的功能是采用元组.这不是咖喱.
纠正它,你得到它的工作:
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
Run Code Online (Sandbox Code Playgroud)
让我补充一点,你不需要任何类型的注释,F#会为你解决:
let inline (++) f1 f2 x = f1 x + f2 x
Run Code Online (Sandbox Code Playgroud)
如果您阅读签名,您会注意到您的函数可以具有任何输入类型,只需要匹配结果类型:
let inline f1 x = -(float x)
let f2 x : float = float (2 * x)
let f3 = f1 ++ f2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |