Sml 标准ML反转函数中的类型错误

Sml 标准ML反转函数中的类型错误,sml,Sml,我对sml非常陌生。我看不出我试图编写的这个简单的反向函数有什么错 fun reverse [] = [] | reverse (v1::rest) = (reverse(tl(rest)) @ v1) 这是我尝试运行reverse([1,2,3])时的输出 我可以看出这是一个类型错误。似乎reverse正在寻找两个列表(我认为……列表对我来说似乎是一种奇怪的类型)??我如何设置模式/参数有问题吗?感谢您的帮助。让我们先解决错误的类型问题 “列表列表”是指列表列表,如下所示: [[1

我对sml非常陌生。我看不出我试图编写的这个简单的反向函数有什么错

fun reverse [] = [] | 
    reverse (v1::rest) = (reverse(tl(rest)) @ v1)
这是我尝试运行reverse([1,2,3])时的输出


我可以看出这是一个类型错误。似乎reverse正在寻找两个列表(我认为……列表对我来说似乎是一种奇怪的类型)??我如何设置模式/参数有问题吗?感谢您的帮助。

让我们先解决错误的类型问题

“列表列表”是指列表列表,如下所示:

[[1,2], [3,4], [5,6]] : int list list
这是一个整数列表的列表

反向
功能的总体类型为

val reverse = fn : 'a list list -> 'a list
这是因为
@
运算符具有以下类型签名(您可以找到文档)

因此,类型推断机制推断
v1
是一个
'a list
,但这意味着输入列表包含
'a list
类型的元素,因此应该是
'a list
类型

但您真正的意思是将元素
v1
附加到反向尾部的末尾,这可以通过将
v1
添加到一个元素的列表中来轻松实现:

some_list@[v1]

接下来,您不需要
tl(rest)
,因为
rest
已经是输入列表的尾部。作为旁注:编写
tlrest
更为惯用,括号在这里并不重要

考虑到上述因素,我们得到以下实现:

fun rev [] = []
  | rev (h::tl) = rev tl @ [h]

我应该警告您,这个函数效率很低,因为它的时间复杂度是二次的(O(n^2))。

让我们先解决错误的类型问题

“列表列表”是指列表列表,如下所示:

[[1,2], [3,4], [5,6]] : int list list
这是一个整数列表的列表

反向
功能的总体类型为

val reverse = fn : 'a list list -> 'a list
这是因为
@
运算符具有以下类型签名(您可以找到文档)

因此,类型推断机制推断
v1
是一个
'a list
,但这意味着输入列表包含
'a list
类型的元素,因此应该是
'a list
类型

但您真正的意思是将元素
v1
附加到反向尾部的末尾,这可以通过将
v1
添加到一个元素的列表中来轻松实现:

some_list@[v1]

接下来,您不需要
tl(rest)
,因为
rest
已经是输入列表的尾部。作为旁注:编写
tlrest
更为惯用,括号在这里并不重要

考虑到上述因素,我们得到以下实现:

fun rev [] = []
  | rev (h::tl) = rev tl @ [h]

我应该警告你,这个函数效率很低,因为它的时间复杂度是二次的(O(n^2))。

我现在看到的是,不是@I应该是:,而是得到了一个类似的错误。我现在看到的是,不是@I应该是:,但是我仍然得到一个类似的错误,我注意到上面的函数由于某种原因产生了一个不包含最后一个元素的结果。我的下一个问题是,当我简单地更改@to::并删除tl()函数时,它为什么也不起作用?哎呀,我错了,我还在调用reverse!很抱歉,谢谢你的帮助!我现在也意识到::不在右边,因为它只是一种模式(我非常缺乏睡眠)。再次抱歉!不能将元素附加到这样的列表末尾<代码>:
具有类型
'a*'列表->'a列表
,因此在这种情况下,类型推理器将再次为
v1
推断
'a列表
(请注意,如果交换
@
),则
反向
根本不会进行类型检查)。列表是不对称的:您可以很容易地用
在元素前面加上前缀,但追加要困难得多。HTHI请注意,由于某种原因,上述函数生成的结果不包括最后一个元素。我的下一个问题是,当我简单地更改@to::并删除tl()函数时,它为什么也不起作用?哎呀,我错了,我还在调用reverse!很抱歉,谢谢你的帮助!我现在也意识到::不在右边,因为它只是一种模式(我非常缺乏睡眠)。再次抱歉!不能将元素附加到这样的列表末尾<代码>:
具有类型
'a*'列表->'a列表
,因此在这种情况下,类型推理器将再次为
v1
推断
'a列表
(请注意,如果交换
@
),则
反向
根本不会进行类型检查)。列表是不对称的:您可以很容易地用
在元素前面加上前缀,但追加要困难得多。嗯