我对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);
答案 0 :(得分:2)
我认为您的修复是正确的。利用两个列表xs和ys排序的事实,我们有:
但是,我对你的功能有一些小的评论:
[]
和nil
是相同的。我认为仅使用[]
更为明确。::
(cons)构造函数分解列表,而不是使用hd
和tl
等函数。以下是改进版本:
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
。