Functional programming 使用ML实现last

Functional programming 使用ML实现last,functional-programming,sml,ml,Functional Programming,Sml,Ml,我试图在ML中实现last。last可以返回列表的最后一个元素 例如,L=[1,2,3,4],last(L)=4。这是我的实现 fun last [] = last((h::nil)) = h | last((h::tail)) = last(tail); 它给了我“未绑定变量或构造函数:h”。在我的理解中,h是我声明的一个变量,代表列表的开头,为什么变量h会出现错误?您的定义可以如下所示 fun last [] = last((h::nil)) = h | last((h::tail))

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

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

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

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

您的定义可以如下所示

fun last [] = last((h::nil)) = h 
| last((h::tail)) = last(tail);
SML将第一个子句解释为试图将比较结果
last((h::nil))=h
的布尔值赋值给
last[]
。由于您在该子句中匹配的模式是
[]
,并且
[]
不涉及
h
,因此比较
最后((h::nil))=h
中的
h
未绑定,因此出现错误。无论如何,这样的比较毫无意义,显然不是你的本意

请注意,
last[]
无法合理定义。您可以选择忽略它,或者通过引发错误(要么
Empty
要么自定义错误)来解决它。函数
last
的real basis子句是单元素列表的real basis子句。你似乎知道如何处理它。当您停止尝试使用第一个子句同时为
last[]
last(h::nil)
赋值时,您的代码实际上可以工作,而只需执行后者:

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

由于没有为
last[]
给出定义,因此会出现非吸引子匹配警告。您可以忽略该警告(因为它在仅为非空列表定义的函数中非常常见),或者将其编写为

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

你的定义可以列为

fun last [] = last((h::nil)) = h 
| last((h::tail)) = last(tail);
SML将第一个子句解释为试图将比较结果
last((h::nil))=h
的布尔值赋值给
last[]
。由于您在该子句中匹配的模式是
[]
,并且
[]
不涉及
h
,因此比较
最后((h::nil))=h
中的
h
未绑定,因此出现错误。无论如何,这样的比较毫无意义,显然不是你的本意

请注意,
last[]
无法合理定义。您可以选择忽略它,或者通过引发错误(要么
Empty
要么自定义错误)来解决它。函数
last
的real basis子句是单元素列表的real basis子句。你似乎知道如何处理它。当您停止尝试使用第一个子句同时为
last[]
last(h::nil)
赋值时,您的代码实际上可以工作,而只需执行后者:

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

由于没有为
last[]
给出定义,因此会出现非吸引子匹配警告。您可以忽略该警告(因为它在仅为非空列表定义的函数中非常常见),或者将其编写为

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

“我没有工作”不是一个可以用来帮助你的错误行为规范。什么不起作用?它怎么不起作用?你收到错误消息了吗?如果是,确切的错误消息是什么?你收到警告信息了吗?如果是,确切的警告信息是什么?你没有得到预期的结果吗?如果是,你得到了什么结果,你期望得到什么结果,你为什么期望得到这个结果,实际结果与预期结果有什么不同?你没有观察到预期的行为吗?如果是的话,你观察到了什么行为,你期待了什么行为,你为什么期待这种行为,以及实际的行为与预期的行为有什么不同?请给出预期行为和结果的精确说明,包括任何和所有可能的异常、拐角情况、特殊情况和边缘情况。请提供输入、期望输出和行为的示例,演示正常情况以及可能的异常、拐角情况、特殊情况和边缘情况。你是如何调试这个问题的?你是怎么把它隔离的?你采取了哪些步骤来缩小问题的范围?“我没有工作”不是一个有用的错误行为规范,可以用来帮助你。什么不起作用?它怎么不起作用?你收到错误消息了吗?如果是,确切的错误消息是什么?你收到警告信息了吗?如果是,确切的警告信息是什么?你没有得到预期的结果吗?如果是,你得到了什么结果,你期望得到什么结果,你为什么期望得到这个结果,实际结果与预期结果有什么不同?你没有观察到预期的行为吗?如果是的话,你观察到了什么行为,你期待了什么行为,你为什么期待这种行为,以及实际的行为与预期的行为有什么不同?请给出预期行为和结果的精确说明,包括任何和所有可能的异常、拐角情况、特殊情况和边缘情况。请提供输入、期望输出和行为的示例,演示正常情况以及可能的异常、拐角情况、特殊情况和边缘情况。你是如何调试这个问题的?你是怎么把它隔离的?您采取了哪些步骤来缩小问题的范围?