比较sml中的真实列表

时间:2018-06-26 14:11:15

标签: sml smlnj

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

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

1 个答案:

答案 0 :(得分:3)

由于您实际上并不是在问问题,所以您的意图有点不清楚。大概这是尝试的代码不起作用以及伴随的错误消息,隐式的问题是“ 为什么此代码不起作用?我在做什么错,我该怎么做才能改善它?“但这确实是猜测,这些也是懒惰的问题。

如果我的上述假设正确无误,并且您希望将来获得积极的反馈,那么您的帖子将是这样:

  

我正在尝试编写一个函数,该函数对变量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
     

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

要点:

  • 写出您的问题是什么,不要让其他人假设您的问题是什么。使问题易于理解会使人们想回答您的问题,并用言语描述您的问题您认为是问题所在,这样人们就不会尝试回答错误的问题。在这种情况下,您的问题可能是“ 在什么版本的标准ML规范中将实数作为eqtype删除?”,而一个充分的答案应该是 '97 。但是您对这个答案感到满意吗?

    一旦您知道如何提出正确的问题,您也可以更好地在Google周围搜索(例如搜索:评估多项式“标准ml” | sml ),并发现存在可以从中获取代码的代码让自己激发灵感:hereherehere

  • 很好地格式化代码,并确保它能正常工作。使用StackOverflow的Markdown很好地格式化代码。您发布的代码包含来自交互式REPL的工件(一个额外的=),因此将其复制粘贴到REPL中的任何人都会遇到错误,必须弄清楚它的发生位置,对其进行修复,然后< em>然后开始考虑可能是什么问题,因为您没有说。一个好的规则是,一旦问了问题,就可以通过复制粘贴来测试您发布的代码是否正常。可以轻易忘记包括非标准功能。

一个答案,假设我对您的“问题”的解释在某种程度上与您的意图相符:


  

当您执行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进行相同的操作,然后以某种方式组成这些。