【问题标题】:polynomials as functions SML多项式作为函数 SML
【发布时间】:2013-10-16 18:09:25
【问题描述】:

如果我认为多项式表示为以下函数:类型 P= int*(int->int) 其中第一个 int 是多项式的阶, (int->int) 是一个函数,它采用和索引和返回系数。

我应该写一个给定一个列表的函数,它给我一个该类型的多项式 例如,form([1]) 给出 (0,fn 0=>1)) 但问题是在编写类似

的内容时

form([1,5]) 给出 (1,fn 0=>1|1=>​​5))

我对 fn 0=>1|1=>​​5 部分很困惑,因为 fn 不是递归的。我可以从列表的长度中找到多边形的顺序,我可以使用 x::l 访问该列表中的每个元素,但是如何在每次访问时构建这个函数(fn 0=>1|1=>​​5)的一个元素。我不想要一个明确的答案,但我需要帮助!

【问题讨论】:

  • 这样想:当调用者询问多项式的第 n 个系数时,它对应于作为函数参数的列表的第 n 个元素。这是否能说明问题?
  • 是的!但是递归如何构建我的输出函数?我尝试过这样的事情,但之后我完全陷入困境: from(x::l)= (length(x::l),fn x=>x+4|-------)) 我该如何构建我的输出函数的其余部分?
  • 这是一个需要递归的练习吗?
  • 不一定。这正是我认为应该使用递归遍历列表中每个元素的任务的方式。可能是我的想法不正确。如果我有错误的想法,请纠正我
  • 基本上你试图产生List.nth,只有一个咖喱版本,所以调用者只需要提供索引。您可以像这样编写递归抽象fval rec f = fn i => f (i - 1)

标签: sml ml


【解决方案1】:

使用List结构中的方法,这可以通过制作笛卡尔函数List.nth的柯里化版本来实现:

fun form nil = raise Empty
  | form xs  = (List.length xs - 1, fn i => List.nth (xs, i))

如果你想自己实现一个具有 nth 功能的函数,它可能看起来像这样:

fun form xs = 
  let
    fun nth nil     _ = raise Subscript
      | nth (y::_)  0 = y
      | nth (_::yr) i = nth yr (i - 1)
  in
    (List.length xs - 1, nth xs)
  end

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 2021-01-23
    • 2017-09-04
    • 2013-01-13
    • 2012-09-02
    • 2016-02-06
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多