首页 文章

累积咖喱功能(SML)

提问于
浏览
1

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

a)我们常常对计算Σi= m..n f(i)感兴趣,i = m到n的函数值f(i)之和 . 定义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变为下一个值i 1.我们可能想要计算f(i)的总和,其中i从当前i变为下一个,比如i 2,而不是i 1.如果我们将此信息作为参数发送,我们可以计算更广义的求和 . 定义'sum f next m n'来计算这样的求和,其中'next'是从当前索引值计算下一个索引值的函数 . 要在(a)中获得'sigma',您将后继函数作为'next'发送 .

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

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

    • h - 组合先前的值和当前值以生成下一个值

    • v - h 的起始值

    • f - 在将它们传递给 h 函数之前应用于 [m, n) 区间的值的函数

    • next - 按顺序计算下一个值

    • mn - 边界

    以下是我如何定义 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 *)
    

    例如,如果在第一个示例中将 5 作为 v 传递,则可以计算从 1105 的数字之和 .

  • 0

    如果考虑空间隔的可能性,说明将更有意义 .

    • 单个值n的"sum"是n . 没有值的总和为零 .

    • 单个值n的"product"是n . 没有 Value 的产品是一个 .

    • 单个值n的列表是 [n]n::nil ) . 没有值的列表是 nil .

    目前,您假设m≤n,并将m = n视为返回 f m 的特殊情况 . 另一种方法是将m> n视为特殊情况,返回 v . 然后,当m = n时,您的函数将自动返回 h v (f m) ,这与 (f m) 相同(前提是已为此h正确选择了v) .

    但是老实说,我认为当函数的参数指定格式[m,n]的区间时,v-less方法很好,因为没有逻辑上的原因,这样的函数会支持空间隔 . (我的意思是,[m,m-1]并不是"the empty interval",因为它是"obvious error" . )当函数的参数以某种方式指定一个列表或一组元素时,v-ful方法主要是有用的 . 空的,例如作为 'a list .

相关问题