微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一些 sml 代码,但我不知道它是如何工作的

如何解决一些 sml 代码,但我不知道它是如何工作的

fun map f nil = nil
 | map f (hd::tl) = f(hd) :: map f tl;


fun everywhere e nil = [[e]]
  | everywhere e (y::ys) =
    (e::y::ys) :: (map (fn u => y::ys) (everywhere e ys));

我不知道那些 sml 代码是如何工作的。

我知道地图功能

但是对于无处不在的代码,我不知道我对此有多少想法。

请告诉我

谢谢

解决方法

首先,我想应该修复“无处不在”以获得其名称所预期的行为:

ArrayList<List<String>> check = new ArrayList();
check.add(Arrays.asList("a"));
check.add(Arrays.asList("b"));
check.add(Arrays.asList("c"));
ArrayList middleList = new ArrayList();
middleList.add("d");
middleList.add("e");
middleList.add("f");
middleList.add("g");
check.add(middleList);
check.add(Arrays.asList("h"));
check.add(Arrays.asList("i"));
check.add(Arrays.asList("j"));
System.out.println(check);

List<String> finalResult =check.
        stream().
        flatMap(Collection::stream).
        collect(Collectors.toList());
System.out.println(finalResult);

此修改版本提供了一个列表列表。例如,

fun everywhere e nil = [[e]]
  | everywhere e (y::ys) =
    (e::y::ys) :: (map (fn u => y::u) (everywhere e ys));

因此,您可能知道“everywhere e xs”枚举了所有可能的列表,这些列表是通过将项目“e”插入到原始列表 xs 的某处而制成的。

那么,如何枚举插入呢?分为两种情况:

  1. 在顶部插入:[1,2,3] -> [4,1,3]
  2. 在第一个和第二个或之后插入:[1,4,3],[1,...

情况 1 仅通过 (e::y::ys) 实现。

案例 2 进一步分为两个步骤:

  • A) 获取将“e”插入到第二个和以下项的子列表“ys”的所有可能性:[4,[2,...立>
  • B) 将原始列表的第一项“y”添加到步骤 A 的结果中: 1 :: [4,1::[2,...

步骤 2A 可以通过使用子列表作为参数调用“everywhere”本身来完成。然后,将项目“y”附加到每个(e ys 的每个地方)中,您就完成了步骤 2B。 为此(对项目做同样的事情),您可以使用“地图”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。