对于下一个代码,我遇到错误:
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
答案 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 ),并发现存在可以从中获取代码的代码让自己激发灵感:here,here,here。
很好地格式化代码,并确保它能正常工作。使用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。除此之外,请考虑使用模式匹配,而不要使用
hd
和tl
,因为这些功能可能会因为部分功能而失败并崩溃:fun epoly ([], x) = 0.0 | epoly (c::cs, x) = epoly (cs, x)
此函数所做的全部工作就是抛弃其第二个参数
x
,遍历其第一个参数c::cs
,并且对每个系数c
不执行任何操作。大概是为了评估多项式,您必须先对系数c
和x
进行一些操作,然后再对其余系数cs
和x
进行相同的操作,然后以某种方式组成这些。