我想在 OCaml 中编写一个函数来计算给定函数的定积分。问题是我的目标是以下语法:
let sphere r phi theta = r *. sin phi *. cos theta in
let dphi = 10 in (* number of parts *)
let dtheta = 10 in (* number of parts *)
let zero = 0.0 in
let two_pi = 2.0 *. 3.14159
in
integral zero two_pi (integral zero two_pi (sphere 3.0) dphi) dtheta
问题是使用梯形规则之类的规则我需要编写如下内容:
0.5 *. (f a +. f b) *. d
它期望f a
andf b
不是部分应用的功能。
我不希望最后一个integral
函数调用的结果会返回一个浮点数,我对一些函数完全没问题。
我意识到这个问题非常不具体。让我以更一般的方式重申它:
我有一个功能float->float->float
,在应用integral
功能后应该给我float->float
。它应该是一般的,所以integral
offloat->float
应该导致float
.
问题是我需要减去两个相同顺序的函数:f(a) -. f(b)
,它们都可以是float->float->float
,float->float
甚至是float->float->float
。
要减少函数的顺序,我需要一个签名,例如:(float->'a->float) -> ('a->float)
.
这甚至可能吗?特别是在 OCaml 中?
我越是考虑让一个函数计算可以链接的积分的问题,就越觉得这是一项不可能完成的任务/愚蠢的方法。
事实上,我已经实现了这一点,但使用了我自己的数据类型(称为function_type
which can be Scalar3rdOrderFunction
, Scalar2ndOrderFunction
, Scalar1stOrderFunction
, Scalar0thOrderFunction
)。但是对于多态性的奖品,当我尝试对 function 应用积分三次时,编译器无法警告我float->float->float
。