理论上,经过深思熟虑,我们可以做到这一点,但它非常丑陋和低效,不应该这样做。
让我们首先删除要删除的元素。您的基本配方有效,但您不能使用 end,因为这是一个保留字。
fun cutt list1 (start, stop, interval) =
List.drop(List.take(list1, stop + 1), start);
cutt [1,2,3,4,77,8,7] (1, 5, 2) 产生[2,3,4,77,8]。
现在,我们如何按间隔删除元素。我们不能使用显式递归,也不能使用模式匹配或条件。好吧,那么我们可以使用List.tabulate 创建一个与我们的列表长度相等的列表,其中包含带有列表元素和索引的元组。
fun cutt list1 (start, stop, interval) =
List.tabulate(
stop - start + 1,
(fn i =>
(i, List.nth(List.drop(List.take(list1, stop + 1), start), i))));
如果我们评估 cutt [1,2,3,4,77,8,7] (1, 5, 2) 现在我们得到 [(0, 2), (1, 3), (2, 4), (3, 77), (4, 8)]。
现在我们可以根据索引过滤掉我们不想要的值。
fun cutt list1 (start, stop, interval) =
List.filter (fn (i, _) => i mod interval = 0) (List.tabulate(
stop - start + 1,
(fn i =>
(i, List.nth(List.drop(List.take(list1, stop + 1), start), i)))));
cutt [1,2,3,4,77,8,7] (1, 5, 2) 产生[(0, 2), (2, 4), (4, 8)]。
我们可以绘制索引。
fun cutt list1 (start, stop, interval) =
List.map (fn (_, x) => x) (List.filter (fn (i, _) => i mod interval = 0) (List.tabulate(
stop - start + 1,
(fn i =>
(i, List.nth(List.drop(List.take(list1, stop + 1), start), i))))));
cutt [1,2,3,4,77,8,7] (1, 5, 2) 产生[2, 4, 8]。
非常丑陋和低效。我不确定为什么有人教你这样写代码。随意通过删除换行使其更加丑陋。
fun cutt list1 (start, stop, interval) = List.map (fn (_, x) => x) (List.filter (fn (i, _) => i mod interval = 0) (List.tabulate(stop - start + 1, (fn i => (i, List.nth(List.drop(List.take(list1, stop + 1), start), i))))));