如何使用一个衬里 msl 遍历列表?
Posted
技术标签:
【中文标题】如何使用一个衬里 msl 遍历列表?【英文标题】:how to iterate over a list using one liner msl? 【发布时间】:2022-01-05 22:02:26 【问题描述】:我有一个列表和一个元组 (start,end,interval) 我正在尝试迭代列表并返回列表中的元素从开始到结束间隔步骤。例如:
cutt [1,2,3,4,77,8,7] (1,5,2);
val it = [2,4,8] : int list;
问题是我想编写一个只使用一行的函数,这意味着没有递归函数,没有 if 条件也没有模式匹配
我开始认为我可以先将列表剪切到开始和结束之间的元素:
fun cutt list1 (start,end,interval) = List.drop(List.take(list1 ,end+1),start);
现在我想使用 foldl 或 foldr 仅获取间隔跳转中的元素,我的问题是如何遍历列表?
【问题讨论】:
不止一位非常优秀的程序员has told you 认为您所要求的内容是不可能的,或者充其量是不可行的。创建一个新问题来再次问同样的事情并不是特别尊重。如果此问题已结束,请不要感到惊讶。 当你澄清你正在寻找那个时,不少于三个人告诉你这是不可能或不可行的。如果我们能提供解决方案,我们会在那里完成。我很想看到您教授的解决方案符合所有这些标准。 【参考方案1】:理论上,经过深思熟虑,我们可以做到这一点,但它非常丑陋和低效,不应该这样做。
让我们首先删除要删除的元素。您的基本配方有效,但您不能使用 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))))));
【讨论】:
以上是关于如何使用一个衬里 msl 遍历列表?的主要内容,如果未能解决你的问题,请参考以下文章