【发布时间】:2021-06-26 19:09:23
【问题描述】:
所以,我知道有一个内置函数可以删除元素,但如果您希望删除最后 n 个元素,它会起作用。
我想删除前 n 个元素。
一个例子:
> drop([1,2,3,4], 2)
> [1,2]
我写了这段代码:
exception Subscription;
val counter = 0;
fun drop (l,0) = l
| drop([], n) = raise Subscription
| drop(h::x, n) = if n<0 then raise Subscription
else if(counter <n) then
let
val counter = counter +1
in
(h:: drop(x,n))
end
else nil
;
drop([1,2,3,4],2);
它不会被编译。我得到的错误信息是:
uncaught exception Subscription
raised at: dropper.ml:6.23-6.35
任何想法和帮助表示赞赏。
【问题讨论】:
-
回复:“我知道有一个内置函数可以删除元素,但如果你想删除最后 n 个元素,它可以工作。我想删除前 n 个元素”:我错过了一些东西.根据smlfamily.github.io/Basis/list.html#SIG:LIST.drop:VAL,
List.drop丢弃了第一个 i 元素,这正是你说的你想要的? -
Re:“它不会被编译。我得到的错误信息是:
uncaught exception Subscription”:这是矛盾的。如果您在代码运行时遇到未捕获的异常,则意味着您的代码确实 编译成功。 (您的代码在编译完成后才能运行。) -
if counter < n then与if 0 < n then相同。 -
内置的
drop确实会丢弃(即丢弃或删除)第一个元素。您要查找的内置函数是take。 -
你的最后一个子句本质上是
drop (h::x,n) = h::drop(x,n)。 (您不需要外部计数器 -n是您的计数器 - 而let不是作业。您可能应该再次查看 SML 的基础知识。)