累积咖喱功能(SML)

时间:2013-09-27 17:28:22

标签: functional-programming sml smlnj currying

我有一系列问题,我一直在努力,似乎无法理解最后一个问题。这是第一个问题,也是我的解决方案:

  

a)我们经常对计算Σ i = m .. n <感兴趣/ sub> f i ), i的函数值 f i )的总和 = m n 。定义sigma f m n计算Σ i = m .. n ˚F I 的)。这与定义sigma (f, m, n)

不同
fun sigma f m n = if (m=n) then f(m) else (f(m) + sigma f (m+1) n);

第二个问题,我的解决方案:

  

b)在上面的sigma计算中,索引i来自当前       我到下一个值i + 1。我们可能想要计算其中i的f(i)之和       从当前的i到下一个,比如i + 2,而不是i + 1。如果我们寄这个       作为参数的信息,我们可以计算更广义       总和。定义'sum f next m n'来计算这样的求和,其中       'next'是一个从中计算下一个索引值的函数       当前指数值。要获得(a)中的“sigma”,您就会发送继任者       作为'下一个'充当。

fun sum f next m n = if (m>=n) then f(m) else (f(m) + sum f (next) (next(m)) n);

第三个问题,我的尝试:

  

c)在(b)中推广和,我们不仅可以计算总和,还可以计算   产品和其他形式的积累。如果我们想要计算总和   (b),我们发送加法作为论据;如果我们想要计算   函数值的乘积,我们发送乘法作为参数   相同的参数。我们还必须发送身份证明   运营商。定义'accum h v f next m n'来计算这样的累积,   其中h是一个双变量函数来进行累加,而v是   积累的基础价值。如果我们发送乘法函数   对于h,1代表v,后继函数代表'next',这个'accum'   计算Π i = m .. n f I 的)。创建“h”不是加法或的例子   乘法也是。

 fun accum h v f next m n = if (m>=n) then f(m) else (h (f(m)) (accum (h) (v) (f) (next) (next(m)) n));

在问题C中,我不确定我想用我的“v”参数做什么。现在,该函数将采用任何数字间隔m - n并对它们应用任何类型的操作。例如,我可以调用我的函数

accum mult (4?) double next3 1 5;

其中double是倍增函数,next3将3加到给定值。关于我如何支持使用v值的任何想法?

2 个答案:

答案 0 :(得分:0)

这组问题旨在实现积累功能。需要

  • h - 结合以前的值和当前值来生成下一个值
  • v - h
  • 的起始值
  • f - 在将值传递给[m, n)函数之前应用于h间隔的值的函数
  • next - 按顺序计算下一个值
  • mn - boundary

以下是我定义accum的方法:

fun accum h v f next m n = if m >= n then v else accum h (h (f m) v) f next (next m) n

C中描述的示例如下所示:

fun sum x y = x + y;
fun mult x y = x * y;
fun id x = x;

accum sum 0 id next 1 10; (* sum [1, 10) staring 0 *)
accum mult 1 id next 1 10; (* prod [1, 10) starting 1 *)

例如,如果您在第一个示例中将1作为10传递,则可以计算从55以及加v的数字总和。< / p>

答案 1 :(得分:0)

如果您考虑间隔的可能性,说明会更有意义。

  • 单个值 n 的“总和”是 n no 值的总和为零。
  • 单个值 n 的“产品”是 n no 值的乘积是一个。
  • 单个值 n 的列表为[n]n::nil)。 值列表为nil

目前,您假设 m n ,并将 m = n 视为特殊处理返回f m的案例。另一种方法是处理 m &gt; n 作为特例,返回v。然后,当 m = n 时,您的函数将自动返回h v (f m),这与(f m)相同(前提是 v < / em>已正确选择 h )。

老实说,我认为当函数的参数指定格式的间隔[ m n <时, v -less方法很好/ em>],因为这样的函数不支持空间隔的逻辑原因。 (我的意思是,[ m m -1]并不是“空间隔”,因为它是“明显错误”。) v < / em> -ful方法主要是有用的,当函数的参数以某种方式指定一个列表或一组元素时,可能可以想象为空,例如作为'a list