0

我想在 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 aandf b不是部分应用的功能。

我不希望最后一个integral函数调用的结果会返回一个浮点数,我对一些函数完全没问题。

我意识到这个问题非常不具体。让我以更一般的方式重申它:

我有一个功能float->float->float,在应用integral功能后应该给我float->float。它应该是一般的,所以integraloffloat->float应该导致float.

问题是我需要减去两个相同顺序的函数:f(a) -. f(b),它们都可以是float->float->floatfloat->float甚至是float->float->float

要减少函数的顺序,我需要一个签名,例如:(float->'a->float) -> ('a->float).

这甚至可能吗?特别是在 OCaml 中?

我越是考虑让一个函数计算可以链接的积分的问题,就越觉得这是一项不可能完成的任务/愚蠢的方法。

事实上,我已经实现了这一点,但使用了我自己的数据类型(称为function_typewhich can be Scalar3rdOrderFunction, Scalar2ndOrderFunction, Scalar1stOrderFunction, Scalar0thOrderFunction)。但是对于多态性的奖品,当我尝试对 function 应用积分三次时,编译器无法警告我float->float->float

4

0 回答 0