Sml 从ml中的列表中删除元素

Sml 从ml中的列表中删除元素,sml,ml,Sml,Ml,我试图编写一个函数,生成一个包含给定列表的新列表,其中不包含元素x 莫斯科ML说有些箱子在这场比赛中没有使用 fun delete (x,list) = delete(x,[]) |delete(x,(first::rest)) = if first = x then delete(x,rest) else first::delete(x,rest) 下面是我在标准ML上的实现方式: fun delete (item, list) = case list of []=>

我试图编写一个函数,生成一个包含给定列表的新列表,其中不包含元素x

莫斯科ML说有些箱子在这场比赛中没有使用

fun delete (x,list) = delete(x,[])
 |delete(x,(first::rest)) = if first = x then delete(x,rest) else first::delete(x,rest)

下面是我在标准ML上的实现方式:

fun delete (item, list) =
    case list of
    []=>[]
      | xs::ys => if item = xs then delete(item,ys)
          else xs::delete(item,ys)
不使用案例:

fun delete (item, list) = List.filter(fn x => x <> item) list
fun delete(项目,列表)=list.filter(fn x=>x项目)列表

别管多相等符号。

以下是我在标准ML上的做法:

fun delete (item, list) =
    case list of
    []=>[]
      | xs::ys => if item = xs then delete(item,ys)
          else xs::delete(item,ys)
不使用案例:

fun delete (item, list) = List.filter(fn x => x <> item) list
fun delete(项目,列表)=list.filter(fn x=>x项目)列表

不必使用多相等符号。

当执行
delete
调用时,定义函数的模式(基本上)按顺序进行尝试。由于第一个模式已经与每个列表匹配,因此将永远无法访问第二个模式。这就是编译器抱怨的原因

换言之,您必须重新排列案例,或者更好地使案例不相交(例如,在第一个案例中,将
列表
替换为
[]


额外提示:第一个案例的右侧似乎也是错误的。这将始终进入无限递归。

当执行对
delete
的调用时,定义函数的模式(基本上)按顺序进行尝试。由于第一个模式已经与每个列表匹配,因此将永远无法访问第二个模式。这就是编译器抱怨的原因

换言之,您必须重新排列案例,或者更好地使案例不相交(例如,在第一个案例中,将
列表
替换为
[]


额外提示:第一个案例的右侧似乎也是错误的。这将始终进入无限递归。

这是因为第一个大小写与任何列表匹配,所以第二个大小写永远不会被使用。
请记住,案例是按照编写顺序进行审理的,而不是根据“最佳”匹配进行选择

您还有一个关于无限递归的小问题

delete (x,list) = delete(x,[])
由于
列表
将匹配
[]
,因此它将永远重复出现。
如果从空列表中删除某些内容,则结果应为空列表

你可以做两件事中的一件

请先移动非空箱子:

fun delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)
  | delete (x, list) = []
或者,更常见的是,使第一种情况仅与空列表匹配:

fun delete (x, []) = []
  | delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)

这是因为您的第一个案例与任何列表都匹配,因此第二个案例将永远不会被使用。
请记住,案例是按照编写顺序进行审理的,而不是根据“最佳”匹配进行选择

您还有一个关于无限递归的小问题

delete (x,list) = delete(x,[])
由于
列表
将匹配
[]
,因此它将永远重复出现。
如果从空列表中删除某些内容,则结果应为空列表

你可以做两件事中的一件

请先移动非空箱子:

fun delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)
  | delete (x, list) = []
或者,更常见的是,使第一种情况仅与空列表匹配:

fun delete (x, []) = []
  | delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)

如果没有…的案例列表,我怎么写。。。?如果你不想使用用例,那么我建议你做以下事情:有趣的删除(项目,列表)=list.filter(fn x=>x项目)列表如果没有…的案例列表,我该如何编写它。。。?如果你不想使用用例,那么我建议你做以下事情:有趣的删除(项目,列表)=列表。过滤器(fn x=>x项目)列表对不起,这部分
delete(x,列表)=[]
真的是为了什么?我无法以这种递归方式理解这一部分的作用。THanks@Huzo这是递归的基本情况,没有任何作用。我保留了原始代码中的“列表”名称。你也可以写
[]
,或者
\u
。对不起,这部分
delete(x,list)=[]
到底是为了什么?我无法以这种递归方式理解这一部分的作用。THanks@Huzo这是递归的基本情况,没有任何作用。我保留了原始代码中的“列表”名称。您也可以编写
[]
,或
.