【问题标题】:Creating different calculus functions in SML New Jersey在 SML New Jersey 中创建不同的微积分函数
【发布时间】:2019-11-18 20:11:08
【问题描述】:

A) 编写函数indefIntegratePoly,它接受代表多项式的系数列表(按照所有项存在的最高次数到最低次数的顺序)并返回一个新的系数列表,表示该多项式的不定积分多项式。您必须使用foldr(如下所示)。假设为表示不定积分的反导生成的常数为0.0。

fun foldr (f, s, []) = s
 ​ | foldr (f, s, x::rest) = f(x, foldr(f, s, rest));

我只想知道从哪里开始,因为我正在努力获得有意义的 ant 类型的函数。

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:
    fun foldr (f, s, []) = ...
    

    内置的foldr类似于这个函数,但定义为

    fun foldr f s [] = ...
    

    也就是说,咖喱而不是元组。

    我将在下面的回复中假设您的 foldr 版本。

    我只想知道从哪里开始

    你可以开始

    fun indefIntegratePoly ks =
        let fun f (k, acc) = ...
        in foldr (f, [], ks)
        end
    

    其中f 采用单个系数并在acc 中构建积分系数列表。

    注意foldr 从右到左折叠,所以k 的第一个值是具有最小幂的项的系数。你知道这个幂有多大,因为它从 1 开始,并且折叠的后续迭代表示具有更大幂的项。

    如果我没记错的话,a·x^n 整合到 (a·x^(n+1))/n,所以对于任何一个术语,你必须除以术语的幂。这意味着f 的上下文必须具有可用的上下文。 acc 可以是任何类型,例如int × int list,其中第一个int是当前项的幂。

    在模板上展开,

    fun indefIntegratePoly ks =
        let fun f (k, (n, iks)) =
                (n+1, ...)
        in #2 (foldr (f, [], (1, ks)))
        end
    

    折叠累加一对,其中k 是当前项的系数,n 是当前项的幂,iks 是积分系数列表。增加每一项的幂(把n变成a·x^n中的n+1(a·x^ (n+1))/n) 是在列表中添加一个额外项,这可以通过使用 [j] 而不是 [] 来初始化折叠来完成,其中 j 是常数项k的系数为kk·x^1.

    由于foldr 现在产生一对,而这对的#1 部分仅在迭代期间使用,而#2 部分保存积分系数,因此可以通过使用解构该对来丢弃最大幂#2.

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 2019-01-23
      • 2020-01-15
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多