比较标准ML中的列表

时间:2011-11-16 22:44:38

标签: list sml

我对SML非常陌生,我们刚刚开始上课的编程任务,我需要一点见解。

问题是:编写一个名为minus: int list * int list -> int list的ML函数,它接受两个非递减整数列表,并产生一个非递减整数列表,该列表是通过从第一个输入列表中删除元素而得到的。第二个输入列表。

例如,

minus( [1,1,1,2,2], [1,1,2,3] ) = [1,2]

minus( [1,1,2,3],[1,1,1,2,2] ) = [3]

这是我尝试回答这个问题。谁能告诉我我做错了什么?我不太了解解析列表。

fun minus(xs,nil) = []
| minus(nil,ys) = []
| minus(x::xs,y::ys) = if x=y then minus(xs,ys) else x :: minus(x,ys);

这是我刚才做的修复,我认为现在是这样吗?

fun minus(L1,nil) = L1
| minus(nil,L2) = []
| minus(L1,L2) = if hd(L1) > hd(L2) then minus(L1,tl(L2))
    else if hd(L1) = hd(L2) then minus(tl(L1),tl(L2))
    else hd(L1) :: minus(tl(L1), L2);

2 个答案:

答案 0 :(得分:2)

我认为您的修复是正确的。利用两个列表xs和ys排序的事实,我们有:

  • 如果xs的头部大于ys的头部,则可能出现xs的头部 在ys的尾巴。
  • 如果xs的头部与ys的头部相同,我们 删除两个头。
  • 如果xs的头部小于ys的头部,则xs'头部 不能在ys中出现,我们把它放到结果列表中。

但是,我对你的功能有一些小的评论:

  • []nil是相同的。我认为仅使用[]更为明确。
  • 表示列表的变量通常采用xs,ys,......的形式(小写以“s”结尾)。
  • 您应该使用::(cons)构造函数分解列表,而不是使用hdtl等函数。

以下是改进版本:

fun minus(xs, []) = xs
  | minus([], ys) = []
  | minus(x::xs, y::ys) = if x > y then minus(x::xs, ys)
                          else if x = y then minus(xs, ys)
                          else x::minus(xs, y::ys)

答案 1 :(得分:1)

你的else子句中有一个类型:

x :: minus(x,ys)

第二个x应为xs