2017-04-23 30 views
1

我试图在ML中实现最后一个。最后可以返回列表的最后一个元素。执行最后使用ML

例如,L = [1,2,3,4],last(L)= 4。这是我的实现。

fun last [] = last((h::nil)) = h | last((h::tail)) = last(tail); 

它给我“未绑定变量或构造函数:h”。在我的理解中,h是我声明的一个变量,代表列表的头部,为什么会在变量h上发生错误?

+0

“我没有工作”并不是错误行为一个有用的规格,可用于来帮你。 *什么*不起作用? *如何*没有工作?你收到错误信息了吗?如果是,什么是*确切*错误信息?你有没有收到警告信息?如果是,那么*确切的*警告信息是什么?你没有得到预期的结果吗?如果是的话,你得到了哪个结果,你期望得到哪个结果,你为什么期望结果,以及实际结果与预期结果有什么不同?你没有观察到预期的行为吗?如果是的话,你观察到了哪种行为,你是哪种行为...... –

+0

......期待,你为什么期望这种行为,以及实际行为与预期行为有什么不同?请详细说明预期的行为和结果,包括任何和所有可能的例外,角落案例,特殊案例和边缘案例。请提供投入和期望产出和行为的例子,演示正常情况以及可能的例外情况,角落案例,特殊情况和边缘情况。你试图调试这个问题的是什么?你是如何尝试隔离它的?你采取了哪些步骤来缩小问题的范围? –

回答

4

你定义可以布置为

fun last [] = last((h::nil)) = h 
| last((h::tail)) = last(tail); 

SML解释第一子句为试图分配给last []布尔值,它是在比较last((h::nil)) = h的结果。由于您在该条款中匹配的模式是[][]不涉及h,所以比较last((h::nil)) = h中的h是未绑定的,因此是错误。在任何情况下,这样的比较都没有意义,显然也不是你的意图。

请注意,last []不能明确定义。您的替代方法是简单地忽略它或通过引发错误(Empty或自定义错误)来解决它。函数last的实际基础子句是1元素列表。你似乎知道如何处理它。你的代码实际工作,当你停止尝试用你的第一款同时给出一个值都last []last (h::nil),而是只是做了后者:

fun last (h::nil) = h 
| last (h::tail) = last tail; 

这里我删除周围h::nilh::tail3双多余的括号,和tail。在SML函数调用中不需要括号。当您需要确保正确的分组时,您只需要括号。请注意,第一个模式也可以更为简洁地编写为[h]

由于您尚未给出last []的定义,因此您会收到非穷举匹配警告。你可以只忽略警告(因为它是相当常见的,只有对非空列表定义的函数),或写为

fun last [] = raise Empty 
| last (h::nil) = h 
| last (h::tail) = last tail;