【问题标题】:Compare real list in sml比较 sml 中的真实列表
【发布时间】:2018-12-05 07:10:36
【问题描述】:

对于下一个代码,我遇到了错误:

fun epoly(L:real list, x:real)=
= if L = [] then 0.0 else (epoly(tl(L:real list), x:real));;

错误:

stdIn:42.1-42.57 Error: operator and operand don't agree [equality type required]
  operator domain: ''Z * ''Z
  operand:         real list * 'Y list
  in expression:
    L = nil

【问题讨论】:

  • 你没有问任何问题。

标签: sml smlnj


【解决方案1】:

由于您实际上并没有提出问题,因此您的意图有点不清楚。大概这是尝试的代码不起作用和伴随的错误消息,隐含的问题是“为什么这段代码不起作用?我做错了什么,我能做些什么来改进它? em>”但实际上这只是猜测,而且这些都是懒惰的问题。

如果我的上述假设是正确的并且您希望将来得到积极的反馈,您的帖子可能会如下所示:

我正在尝试编写一个函数来计算具有实系数 L 的变量 x 的多项式。

看起来像:

fun epoly (L : real list, x : real) =
    if L = [] then 0.0 else epoly(tl L, x)

很遗憾,我收到了一个我不理解的类型错误:

stdIn:1.35-1.91 Error: operator and operand don't agree [equality type required]
  operator domain: ''Z * ''Z
  operand:         real list * 'Y list
  in expression:
    L = nil

这个错误是什么意思,如果这不是评估多项式的​​正确方法,那么完成同样事情的另一种方法会是什么样子?

要点:

  • 写出你的问题是什么,不要让别人假设你的问题是什么。让问题易于理解会让人们想回答你的问题,用文字描述你的问题会告诉你什么think 是问题所在,这样人们就不会尝试回答错误的问题。在这种情况下,您的问题可能是“在标准 ML 规范的哪个版本下,实数作为 eqtype 被删除了?”并且充分的答案应该是 '97。但是你会为这个答案感到高兴吗?

    一旦你知道如何提出正确的问题,你也可以更好地在谷歌上搜索(例如搜索:evaluate polynomial "standard ml"|sml)并发现存在可以从中找到的代码让自己激发灵感:hereherehere

  • 很好地格式化您的代码并确保其正常工作。使用 StackOverflow 的 Markdown 很好地格式化您的代码。您发布的代码包含来自交互式 REPL 的工件(额外的 =),因此任何将其复制粘贴到 REPL 中的人都会收到错误,必须找出它发生的位置,修复它,然后 然后开始考虑可能是什么问题,因为你没有说。一个好的规则是在您提出问题后通过复制粘贴来测试您发布的代码是否有效。很容易忘记包含非标准函数。

假设我对您的“问题”的解释与您的意图有些一致:


当您执行if L = [] ... 时,您正在对实数列表使用相等性,这反过来又依赖于实数的相等性,但无法比较实数的相等性。请参阅问答“Why can't I compare reals in Standard ML?”您可以测试一个实数列表是否为空而不比较实数,例如:

fun epoly (L, x) =
    if null L then 0.0 else epoly (tl L, x)

这是因为标准库函数null 在列表上使用模式匹配但不处理列表的元素,而= 假定可能必须比较元素。尽管在示例 L = [] 中这在实践中从未发生过,但这仍然是类型系统中的错误。

如果您要比较实数是否相等,请考虑使用epsilon test。除此之外,请考虑使用模式匹配而不是 hdtl,因为这些函数可能会失败和崩溃,因为它们是不完整的:

fun epoly ([],    x) = 0.0
  | epoly (c::cs, x) = epoly (cs, x)

这个函数所做的只是丢掉它的第二个参数x,遍历它的第一个参数c::cs,并且对每个系数c什么都不做。据推测,为了评估多项式,您必须先对系数 cx 做一些事情,然后再对剩余的系数 csx 做同样的事情,然后以某种方式组合它们。

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 2016-02-03
    • 2013-06-16
    • 2016-05-10
    • 2021-11-01
    • 2021-03-23
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多