问题描述
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,2,3] -> [4,1,3]
- 在第一个和第二个或之后插入:[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。 为此(对项目做同样的事情),您可以使用“地图”。