如何在OCaml中编写通用集成函数

时间:2013-11-03 10:39:26

标签: ocaml integral function-composition

我想在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 af 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_typeScalar3rdOrderFunctionScalar2ndOrderFunctionScalar1stOrderFunction) 。但是对于多态性的奖励,当我尝试对函数Scalar0thOrderFunction应用积分三次时,编译器不能发出警告。

0 个答案:

没有答案