如何使用一个衬里 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 遍历列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在webfont中设置衬里数字?

如何在网络字体中设置衬里数字?

如何使这个 python 代码成为一个衬里? [关闭]

一个衬里使用过滤器删除数组中所有出现的子串吗?

sever如何避免2MSL

如何使用 iter() 和 yield 遍历两个列表?