我想编写一个函数,它接受序列 并返回具有相同元素分组的序列,如 , , >。
我使用的是序列,而不是列表,但有些功能是相似的。我正在考虑使用的一些功能是map、reduce、tabulate、filter、append等。
Reduce 接受一个关联函数并返回由该运算符“减少”的序列。因此,减少 op+ 0 = 6。
我的第一个想法是使用map将序列提升一级。
因此, => ,,,,>。
然后,我考虑使用reduce,在其中创建一个函数,该函数接受像(x,y) 这样的元素对。如果 x == y,那么我返回,否则我什么也不做。但是......这并不完全有效,因为函数在两种情况下都必须返回相同类型的内容。
有人可以给我一些关于正确路径的提示,比如我可以使用哪些高阶函数?我正在使用 SML,但我不会要求任何人给我一个完整的答案,因此任何高级提示将不胜感激(诚实地使用任何功能语言)
我猜想reduce
您所指的功能与fold
F# 中的函数:
val fold : ('State -> 'Value -> 'State) -> 'State -> 'Value list -> 'State
这需要一个值列表,以及一个初始状态和一个在迭代列表值时转换状态的函数。
您可以一次完成您想做的事情。您需要将一些内容保留在状态中。想象一下你在中间的某个地方1,1,2,2,3
(比如说,在第二个2
)。现在你需要:
- 您当前正在收集的价值 - 即
2
- 包含当前收集的值的值列表 - 即
[2]
(首先2
从序列)
- 您之前收集的值列表的列表 - 即
[ [1; 1] ]
.
你将从初始状态开始-1, [], []
(using -1
作为一些不会出现在您的输入中的值)。然后,您需要编写根据当前值转换状态的函数。这需要处理几种情况:
- 当该值与您一直收集的值不同时,您需要将收集的值列表添加到列表列表中(除非它为空)
- 当值相同时,需要将其添加到现在收集的值列表中并继续
希望这能为您提供足够的信息来弄清楚如何做到这一点,而无需实际透露完整的源代码!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)