我试图在ML中实现最后一次。 last可以返回列表的最后一个元素。
例如,L = [1,2,3,4],last(L)= 4.这是我的实现。
fun last [] = last((h::nil)) = h | last((h::tail)) = last(tail);
它给了我"未绑定的变量或构造函数:h"。根据我的理解,h是我声明的变量,表示列表的头部,为什么会在变量h上发生错误?
答案 0 :(得分:4)
您的定义可以列为
#PL | FIXTURES - 22 April 2017
West Ham v Everton 16:00
Hull v Watford
Swansea v Stoke
Bournemouth v Middlesbrough #CCFMSport
SML将第一个子句解释为尝试将fun last [] = last((h::nil)) = h
| last((h::tail)) = last(tail);
分配给布尔值,该值是比较last []
的结果。由于您在该子句中匹配的模式为last((h::nil)) = h
且[]
并未涉及[]
,因此比较h
中的h
未绑定因此错误。在任何情况下,这种比较都没有多大意义,显然不是你的意图。
请注意last((h::nil)) = h
无法合理定义。您可以选择忽略它或通过引发错误(last []
或自定义错误)来解决它。函数Empty
的真实基础子句是1元素列表的子句。你似乎知道如何处理它。当您停止尝试使用第一个子句同时为last
和last []
赋予值时,您的代码实际上有效,而只是执行后者:
last (h::nil)
我在fun last (h::nil) = h
| last (h::tail) = last tail;
,h::nil
和h::tail
周围删除了3对多余的括号。在SML中,函数调用不需要括号。当您需要确保正确分组时,您只需要括号。请注意,第一个模式也可以更加简洁地编写为tail
。
由于您未给出[h]
的定义,因此您会收到非穷举匹配警告。您可以忽略该警告(因为它仅对非空列表定义的函数很常见),或者将其写为
last []