我想在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
和f b
不部分应用功能。
我不希望上一次integral
函数调用的结果会给我一个浮点数,我对某些函数完全没问题。
我意识到问题非常不明确。让我以更一般的方式重申一下:
我有一个函数float->float->float
,在应用integral
函数后应该给我float->float
。它应该是一般的,因此integral
的{{1}}应该会产生float->float
。
问题在于我需要减去相同顺序的两个函数:float
,其中两个函数可以是f(a) -. f(b)
,float->float->float
甚至是float->float
。
要减少功能的顺序,我需要签名,如:float->float->float
。
这甚至可能吗?特别是在OCaml?
我越想到让一个函数计算可以链接的积分的问题,它就越不可能成为一个不可能的任务/愚蠢的方法。
实际上我已经实现了这个但是使用了我自己的数据类型(称为(float->'a->float) -> ('a->float)
,可以是function_type
,Scalar3rdOrderFunction
,Scalar2ndOrderFunction
,Scalar1stOrderFunction
) 。但是对于多态性的奖励,当我尝试对函数Scalar0thOrderFunction
应用积分三次时,编译器不能发出警告。