最后使用ML实现

时间:2017-04-23 13:21:37

标签: functional-programming sml ml

我试图在ML中实现最后一次。 last可以返回列表的最后一个元素。

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

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

它给了我"未绑定的变量或构造函数:h"。根据我的理解,h是我声明的变量,表示列表的头部,为什么会在变量h上发生错误?

1 个答案:

答案 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元素列表的子句。你似乎知道如何处理它。当您停止尝试使用第一个子句同时为lastlast []赋予值时,您的代码实际上有效,而只是执行后者:

last (h::nil)

我在fun last (h::nil) = h | last (h::tail) = last tail; h::nilh::tail周围删除了3对多余的括号。在SML中,函数调用不需要括号。当您需要确保正确分组时,您只需要括号。请注意,第一个模式也可以更加简洁地编写为tail

由于您未给出[h]的定义,因此您会收到非穷举匹配警告。您可以忽略该警告(因为它仅对非空列表定义的函数很常见),或者将其写为

last []